X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fmain.c;h=3e0623000db18462479ebcd8fa1f79b4fc1f451e;hb=9caffbc7ed251136bab144a957058e7d9f470b00;hp=20520fcbdc5fcb12be8ce4fa2363769e0ac4f42d;hpb=cee18f98449e7e3f90f8fa3293674f81d348401b;p=tpg%2Fopendispense2.git diff --git a/src/server/main.c b/src/server/main.c index 20520fc..3e06230 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -9,6 +9,7 @@ */ #include #include +#include #include #include #include "common.h" @@ -20,23 +21,26 @@ #include #include #include "../cokebank.h" +#include "../common/config.h" // === IMPORTS === extern void Init_Handlers(void); extern void Load_Itemlist(void); extern void Server_Start(void); -extern int gbServer_RunInBackground; +extern bool gbServer_RunInBackground; extern int giServer_Port; extern const char *gsItemListFile; extern const char *gsCoke_ModbusAddress; +extern int giCoke_ModbusPort; extern const char *gsDoor_SerialPort; +extern bool gbSyslogEnabled; // === PROTOTYPES === void *Periodic_Thread(void *Unused); // === GLOBALS === int giDebugLevel = 0; - int gbNoCostMode = 0; +bool gbNoCostMode = 0; const char *gsCokebankPath = "cokebank.db"; // - Functions called every 20s (or so) #define ciMaxPeriodics 10 @@ -54,6 +58,8 @@ void sigint_handler() void PrintUsage(const char *progname) { fprintf(stderr, "Usage: %s\n", progname); + fprintf(stderr, " -f,--configfile\n"); + fprintf(stderr, " Set the config file path (default `dispsrv.conf')\n"); fprintf(stderr, " -d Set debug level (0 - 2, default 0)\n"); fprintf(stderr, " --[dont-]daemonise\n"); fprintf(stderr, " Run (or explicitly don't run) the server disconnected from the terminal\n"); @@ -68,8 +74,16 @@ int main(int argc, char *argv[]) for( i = 1; i < argc; i++ ) { char *arg = argv[i]; - if( arg[0] == '-' && arg[1] != '-') + if( arg[0] != '-' ) { + // No free arguments please + PrintUsage(argv[0]); + return -1; + } + else if( arg[1] != '-' ) + { + // Single character arguments + // - TODO: Process in a loop switch(arg[1]) { case 'f': @@ -83,12 +97,14 @@ int main(int argc, char *argv[]) break; default: // Usage Error + fprintf(stderr, "Unknown option '-%c'\n", arg[1]); PrintUsage(argv[0]); return -1; } } - else if( arg[0] == '-' && arg[1] == '-' ) + else { + // Long arguments if( strcmp(arg, "--configfile") == 0 ) { if( i + 1 >= argc ) return -1; config_file = argv[++i]; @@ -101,32 +117,46 @@ int main(int argc, char *argv[]) } else { // Usage error + fprintf(stderr, "Unknown option '%s'\n", arg); PrintUsage(argv[0]); return -1; } } - else - { - // Usage Error - PrintUsage(argv[0]); - return -1; - } } - Config_ParseFile( config_file ); + if( Config_ParseFile( config_file ) ) { + fprintf(stderr, "NOTICE: Loading of config file '%s' failed, using defaults\n", config_file); + } // Parse config values - gbServer_RunInBackground = Config_GetValue_Bool("daemonise", 0); - gsCokebankPath = Config_GetValue("cokebank_database", 0); - gsDoor_SerialPort = Config_GetValue("door_serial_port", 0); - gsCoke_ModbusAddress = Config_GetValue("coke_modbus_address", 0); - giServer_Port = Config_GetValue_Int("server_port", 0); - gsItemListFile = Config_GetValue("items_file", 0); + { + bool rv = true; + #define REQ_CFG(variable, type, name) rv = Config_GetValue_##type(name, &variable) && rv + #define OPT_CFG(variable, type, name) Config_GetValue_##type(name, &variable) + OPT_CFG(gbServer_RunInBackground, Bool, "daemonise"); + OPT_CFG(giServer_Port, Int, "server_port"); + + REQ_CFG(gsCokebankPath, Str, "cokebank_database"); + REQ_CFG(gsItemListFile, Str, "items_file"); - gbNoCostMode = (Config_GetValue_Bool("test_mode", 0) == 1); + OPT_CFG(gsDoor_SerialPort, Str, "door_serial_port"); + REQ_CFG(gsCoke_ModbusAddress, Str, "coke_modbus_address"); + OPT_CFG(giCoke_ModbusPort, Int, "coke_modbus_port"); + + OPT_CFG(gbNoCostMode, Bool, "test_mode"); + OPT_CFG(gbSyslogEnabled, Bool, "disable_syslog"); + + if( !rv ) { + fprintf(stderr, "ERROR: Some required configuration items were missing\n"); + return -1; + } + } + // - Cleanly tear down the server on SIGINT/SIGTERM signal(SIGINT, sigint_handler); signal(SIGTERM, sigint_handler); + // - ignore SIGPIPE to prevent a crashing client from bringing the server down too + signal(SIGPIPE, SIG_IGN); openlog("odispense2", 0, LOG_LOCAL4); @@ -180,38 +210,6 @@ void AddPeriodicFunction(void (*Fcn)(void)) fprintf(stderr, "Error: No space for %p in periodic list\n", Fcn); } -int RunRegex(regex_t *regex, const char *string, int nMatches, regmatch_t *matches, const char *errorMessage) -{ - int ret; - - ret = regexec(regex, string, nMatches, matches, 0); - if( ret == REG_NOMATCH ) { - return -1; - } - if( ret ) { - size_t len = regerror(ret, regex, NULL, 0); - char errorStr[len]; - regerror(ret, regex, errorStr, len); - printf("string = '%s'\n", string); - fprintf(stderr, "%s\n%s", errorMessage, errorStr); - exit(-1); - } - - return ret; -} - -void CompileRegex(regex_t *regex, const char *pattern, int flags) -{ - int ret = regcomp(regex, pattern, flags); - if( ret ) { - size_t len = regerror(ret, regex, NULL, 0); - char errorStr[len]; - regerror(ret, regex, errorStr, len); - fprintf(stderr, "Regex compilation failed - %s\n%s\n", errorStr, pattern); - exit(-1); - } -} - // Serial helper int InitSerial(const char *File, int BaudRate) { @@ -227,7 +225,9 @@ int InitSerial(const char *File, int BaudRate) case 1200: baud = B1200; break; case 9600: baud = B9600; break; case 115200: baud = B115200; break; - default: close(fd); return -1; + default: + fprintf(stderr, "ERROR: Invalid baud rate to InitSerial (%i)\n", BaudRate); + exit(1); } info.c_lflag = 0; // Non-Canoical, No Echo