static void test_log_level(void) { check_level("CRITICAL", LOG_LEVEL_CRIT); check_level("Error", LOG_LEVEL_ERR); check_level("warning", LOG_LEVEL_WARNING); check_level("notice", LOG_LEVEL_NOTICE); check_level("info", LOG_LEVEL_INFO); check_level("verbose", LOG_LEVEL_VERBOSE); check_level("debug", LOG_LEVEL_DEBUG); // LogLevelFromString should accept half typed strings: assert_int_equal(LogLevelFromString("CRIT"), LOG_LEVEL_CRIT); assert_int_equal(LogLevelFromString("ERR"), LOG_LEVEL_ERR); assert_int_equal(LogLevelFromString("warn"), LOG_LEVEL_WARNING); assert_int_equal(LogLevelFromString("I"), LOG_LEVEL_INFO); assert_int_equal(LogLevelFromString("i"), LOG_LEVEL_INFO); assert_int_equal(LogLevelFromString("information"), LOG_LEVEL_INFO); assert_int_equal(LogLevelFromString("v"), LOG_LEVEL_VERBOSE); //LogLevelFromString should return NOTHING in case of error: assert_int_equal(LogLevelFromString(""), LOG_LEVEL_NOTHING); assert_int_equal(LogLevelFromString("IX"), LOG_LEVEL_NOTHING); assert_int_equal(LogLevelFromString("Infotmation"), LOG_LEVEL_NOTHING); }
static int _ConfFileCallback( const char* path, unsigned int line, char** fields, size_t nfields, void* data, char* err, size_t errSize) { Options* options = (Options*)data; const char* name; const char* value; if (nfields != 2) { Snprintf(err, errSize, "%s(%u): expected 2 fields", path, line); return -1; } name = fields[0]; value = fields[1]; if (strcmp(name, "port") == 0) { return StrToUShort(value, &options->port); } else if (strcmp(name, "noauth") == 0) { return StrToBool(value, &options->noauth); } else if (strcmp(name, "nodaemonize") == 0) { return StrToBool(value, &options->nodaemonize); } else if (strcmp(name, "dump") == 0) { return StrToBool(value, &options->dump); } else if (strcmp(name, "sockfile") == 0) { Strlcpy(options->sockfileBuf, value, sizeof(options->sockfileBuf)); options->sockfile = options->sockfileBuf; return 0; } else if (strcmp(name, "loglevel") == 0) { return LogLevelFromString(value, &__logLevel); } #if defined(ENABLE_SOCKTRACE) else if (strcmp(name, "logsockio") == 0) { return StrToBool(value, &__sockLog); } #endif else if (strcmp(name, "logtostdout") == 0) { unsigned char flag; if (StrToBool(value, &flag) != 0) return -1; if (flag) LogSetStream(stdout); return 0; } Snprintf(err, errSize, "%s(%u): unknown option", path, line); return -1; }
static void _GetOptions(Options* options, int* argc, char** argv) { GetOptState gos = GETOPTSTATE_INITIALIZER; int opt; while ((opt = GetOpt(&gos, *argc, argv, "hfp:u:isg:o:a:l:SkDPR")) != -1) { switch (opt) { case 'h': { PrintHelp(arg0); exit(0); } case 'p': { if (StrToUShort(gos.optarg, &options->port) != 0) Err("invalid arg: -%c %s", opt, gos.optarg); break; } case 'u': { options->sockfile = gos.optarg; break; } case 'f': { options->nodaemonize = 1; break; } #if defined(ENABLE_PIDFILE) case 's': { options->stop = 1; break; } #endif /* defined(ENABLE_PIDFILE) */ case 'P': { options->paths = 1; break; } case 'R': { options->roles = 1; break; } #if defined(ENABLE_LOGGING) case 'l': { if (LogLevelFromString(gos.optarg, &__logLevel) != 0) Err("invalid arg: -%c %s", opt, gos.optarg); break; } case 'S': { LogSetStream(stdout); break; } #endif /* defined(ENABLE_LOGGING) */ #if defined(ENABLE_ROLES) case 'g': { if (RoleAddUser(PHIT_ROLE_GUEST, gos.optarg) != 0) Err("invalid username: -%c %s", opt, gos.optarg); break; } case 'o': { if (RoleAddUser(PHIT_ROLE_OPERATOR, gos.optarg) != 0) Err("invalid username: -%c %s", opt, gos.optarg); break; } case 'a': { if (RoleAddUser(PHIT_ROLE_ADMIN, gos.optarg) != 0) Err("invalid username: -%c %s", opt, gos.optarg); break; } #endif /* defined(ENABLE_ROLES) */ #if defined(ENABLE_SOCKTRACE) case 'k': { __sockLog = 1; break; } #endif /* defined(ENABLE_SOCKTRACE) */ case 'i': { options->noauth = 1; break; } #if defined(ENABLE_DEBUG) case 'D': { options->dump = 1; break; } #endif /* defined(ENABLE_DEBUG) */ case ':': { Err("missing option argument: -%c", gos.optopt); } case '?': { Err("unknown option: -%c", gos.optopt); } default: { Err("unknown option: -%c", opt); } } } *argc = gos.optind; }