updated hio-webs with better command option handling
This commit is contained in:
parent
02d87fee5b
commit
b8378ce280
157
bin/webs.c
157
bin/webs.c
@ -2,6 +2,7 @@
|
|||||||
#include <hio-tar.h>
|
#include <hio-tar.h>
|
||||||
#include <hio-opt.h>
|
#include <hio-opt.h>
|
||||||
#include <hio-prv.h>
|
#include <hio-prv.h>
|
||||||
|
#include <hio-utl.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -14,6 +15,7 @@
|
|||||||
|
|
||||||
struct arg_info_t
|
struct arg_info_t
|
||||||
{
|
{
|
||||||
|
const char* logopt;
|
||||||
const char* laddrs;
|
const char* laddrs;
|
||||||
const char* docroot;
|
const char* docroot;
|
||||||
int file_list_dir;
|
int file_list_dir;
|
||||||
@ -443,6 +445,8 @@ int webs_start (hio_t* hio, const arg_info_t* ai)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
static hio_t* g_hio = HIO_NULL;
|
static hio_t* g_hio = HIO_NULL;
|
||||||
|
|
||||||
static void handle_sigint (int sig)
|
static void handle_sigint (int sig)
|
||||||
@ -450,21 +454,156 @@ static void handle_sigint (int sig)
|
|||||||
if (g_hio) hio_stop (g_hio, HIO_STOPREQ_TERMINATION);
|
if (g_hio) hio_stop (g_hio, HIO_STOPREQ_TERMINATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int handle_logopt (hio_t* hio, const hio_bch_t* logstr)
|
||||||
|
{
|
||||||
|
hio_bch_t* cm, * flt;
|
||||||
|
hio_bitmask_t logmask;
|
||||||
|
hio_oow_t tlen, i;
|
||||||
|
hio_bcs_t fname;
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
const char* name;
|
||||||
|
int op; /* 0: bitwise-OR, 1: bitwise-AND */
|
||||||
|
hio_bitmask_t mask;
|
||||||
|
} xtab[] =
|
||||||
|
{
|
||||||
|
{ "", 0, 0 },
|
||||||
|
|
||||||
|
{ "core", 0, HIO_LOG_CORE },
|
||||||
|
{ "dev", 0, HIO_LOG_DEV },
|
||||||
|
{ "timer", 0, HIO_LOG_TIMER },
|
||||||
|
|
||||||
|
/* select a specific level */
|
||||||
|
{ "fatal", 0, HIO_LOG_FATAL },
|
||||||
|
{ "error", 0, HIO_LOG_ERROR },
|
||||||
|
{ "warn", 0, HIO_LOG_WARN },
|
||||||
|
{ "info", 0, HIO_LOG_INFO },
|
||||||
|
{ "debug", 0, HIO_LOG_DEBUG },
|
||||||
|
|
||||||
|
/* select a specific level or higher */
|
||||||
|
{ "fatal+", 0, HIO_LOG_FATAL },
|
||||||
|
{ "error+", 0, HIO_LOG_FATAL | HIO_LOG_ERROR },
|
||||||
|
{ "warn+", 0, HIO_LOG_FATAL | HIO_LOG_ERROR | HIO_LOG_WARN },
|
||||||
|
{ "info+", 0, HIO_LOG_FATAL | HIO_LOG_ERROR | HIO_LOG_WARN | HIO_LOG_INFO },
|
||||||
|
{ "debug+", 0, HIO_LOG_FATAL | HIO_LOG_ERROR | HIO_LOG_WARN | HIO_LOG_INFO | HIO_LOG_DEBUG },
|
||||||
|
|
||||||
|
/* select a specific level or lower */
|
||||||
|
{ "fatal-", 0, HIO_LOG_FATAL | HIO_LOG_ERROR | HIO_LOG_WARN | HIO_LOG_INFO | HIO_LOG_DEBUG },
|
||||||
|
{ "error-", 0, HIO_LOG_ERROR | HIO_LOG_WARN | HIO_LOG_INFO | HIO_LOG_DEBUG },
|
||||||
|
{ "warn-", 0, HIO_LOG_WARN | HIO_LOG_INFO | HIO_LOG_DEBUG },
|
||||||
|
{ "info-", 0, HIO_LOG_INFO | HIO_LOG_DEBUG },
|
||||||
|
{ "debug-", 0, HIO_LOG_DEBUG },
|
||||||
|
|
||||||
|
/* exclude a specific level */
|
||||||
|
{ "-fatal", 1, ~HIO_LOG_FATAL },
|
||||||
|
{ "-error", 1, ~HIO_LOG_ERROR },
|
||||||
|
{ "-warn", 1, ~HIO_LOG_WARN },
|
||||||
|
{ "-info", 1, ~HIO_LOG_INFO },
|
||||||
|
{ "-debug", 1, ~HIO_LOG_DEBUG },
|
||||||
|
};
|
||||||
|
|
||||||
|
cm = hio_find_bchar_in_bcstr(logstr, ',');
|
||||||
|
if (cm)
|
||||||
|
{
|
||||||
|
fname.len = cm - logstr;
|
||||||
|
logmask = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
flt = cm + 1;
|
||||||
|
|
||||||
|
cm = hio_find_bchar_in_bcstr(flt, ',');
|
||||||
|
tlen = (cm)? (cm - flt): hio_count_bcstr(flt);
|
||||||
|
|
||||||
|
for (i = 0; i < HIO_COUNTOF(xtab); i++)
|
||||||
|
{
|
||||||
|
if (hio_comp_bchars_bcstr(flt, tlen, xtab[i].name, 0) == 0)
|
||||||
|
{
|
||||||
|
if (xtab[i].op) logmask &= xtab[i].mask;
|
||||||
|
else logmask |= xtab[i].mask;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= HIO_COUNTOF(xtab))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ERROR: unrecognized value - [%.*s] - [%s]\n", (int)tlen, flt, logstr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (cm);
|
||||||
|
|
||||||
|
|
||||||
|
if (!(logmask & HIO_LOG_ALL_TYPES)) logmask |= HIO_LOG_ALL_TYPES; /* no types specified. force to all types */
|
||||||
|
if (!(logmask & HIO_LOG_ALL_LEVELS)) logmask |= HIO_LOG_ALL_LEVELS; /* no levels specified. force to all levels */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logmask = HIO_LOG_ALL_LEVELS | HIO_LOG_ALL_TYPES;
|
||||||
|
fname.len = hio_count_bcstr(logstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
fname.ptr = (hio_bch_t*)logstr;
|
||||||
|
hio_setoption (hio, HIO_LOG_TARGET_BCS, &fname);
|
||||||
|
|
||||||
|
logmask |= HIO_LOG_GUARDED;
|
||||||
|
hio_setoption (hio, HIO_LOG_MASK, &logmask);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(HIO_BUILD_DEBUG)
|
||||||
|
#if 0
|
||||||
|
static int handle_dbgopt (hio_t* hio, const hio_bch_t* str)
|
||||||
|
{
|
||||||
|
/*xtn_t* xtn = (xtn_t*)hio_getxtn(hio);*/
|
||||||
|
const hio_bch_t* cm, * flt;
|
||||||
|
hio_oow_t len;
|
||||||
|
hio_bitmask_t trait, dbgopt = 0;
|
||||||
|
|
||||||
|
cm = str - 1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
flt = cm + 1;
|
||||||
|
|
||||||
|
cm = hio_find_bchar_in_bcstr(flt, ',');
|
||||||
|
len = cm? (cm - flt): hio_count_bcstr(flt);
|
||||||
|
if (hio_comp_bchars_bcstr(flt, len, "htts") == 0) dbgopt |= HIO_TRAIT_DEBUG_HTTS;
|
||||||
|
else if (hio_comp_bchars_bcstr(flt, len, "bigint") == 0) dbgopt |= HIO_TRAIT_DEBUG_BIGINT;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ERROR: unknown debug option value - %.*s\n", (int)len, flt);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (cm);
|
||||||
|
|
||||||
|
hio_getoption (hio, HIO_TRAIT, &trait);
|
||||||
|
trait |= dbgopt;
|
||||||
|
hio_setoption (hio, HIO_TRAIT, &trait);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static int process_args (int argc, char* argv[], arg_info_t* ai)
|
static int process_args (int argc, char* argv[], arg_info_t* ai)
|
||||||
{
|
{
|
||||||
static hio_bopt_lng_t lopt[] =
|
static hio_bopt_lng_t lopt[] =
|
||||||
{
|
{
|
||||||
{ "file-no-list-dir", '\0' },
|
{ "file-no-list-dir", '\0' },
|
||||||
{ "file-no-load-index-page", '\0'},
|
{ "file-no-load-index-page", '\0'},
|
||||||
|
{ ":log", 'l' },
|
||||||
{ HIO_NULL, '\0'}
|
{ HIO_NULL, '\0'}
|
||||||
};
|
};
|
||||||
static hio_bopt_t opt =
|
static hio_bopt_t opt =
|
||||||
{
|
{
|
||||||
"",
|
"l:",
|
||||||
lopt
|
lopt
|
||||||
};
|
};
|
||||||
|
|
||||||
hio_bci_t c;
|
hio_bci_t c;
|
||||||
|
const char* logopt = HIO_NULL;
|
||||||
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
{
|
{
|
||||||
@ -481,6 +620,10 @@ static int process_args (int argc, char* argv[], arg_info_t* ai)
|
|||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
|
case 'l':
|
||||||
|
logopt = opt.arg;
|
||||||
|
break;
|
||||||
|
|
||||||
case '\0':
|
case '\0':
|
||||||
if (strcasecmp(opt.lngopt, "file-no-list-dir") == 0)
|
if (strcasecmp(opt.lngopt, "file-no-list-dir") == 0)
|
||||||
{
|
{
|
||||||
@ -494,6 +637,8 @@ static int process_args (int argc, char* argv[], arg_info_t* ai)
|
|||||||
}
|
}
|
||||||
goto print_usage;
|
goto print_usage;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case ':':
|
case ':':
|
||||||
if (opt.lngopt)
|
if (opt.lngopt)
|
||||||
fprintf (stderr, "bad argument for '%s'\n", opt.lngopt);
|
fprintf (stderr, "bad argument for '%s'\n", opt.lngopt);
|
||||||
@ -508,6 +653,7 @@ static int process_args (int argc, char* argv[], arg_info_t* ai)
|
|||||||
|
|
||||||
if (argc - opt.ind != 2) goto print_usage;
|
if (argc - opt.ind != 2) goto print_usage;
|
||||||
|
|
||||||
|
ai->logopt = logopt;
|
||||||
ai->laddrs = argv[opt.ind++];
|
ai->laddrs = argv[opt.ind++];
|
||||||
ai->docroot = argv[opt.ind++];
|
ai->docroot = argv[opt.ind++];
|
||||||
return 0;
|
return 0;
|
||||||
@ -537,13 +683,8 @@ int main (int argc, char* argv[])
|
|||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
|
|
||||||
hio_setoption (hio, HIO_LOG_TARGET_BCSTR, "/dev/stderr");
|
if (ai.logopt && handle_logopt(hio, ai.logopt) <= -1) goto oops;
|
||||||
{
|
|
||||||
hio_bitmask_t logmask;
|
|
||||||
hio_getoption (hio, HIO_LOG_MASK, &logmask);
|
|
||||||
logmask |= HIO_LOG_GUARDED;
|
|
||||||
hio_setoption (hio, HIO_LOG_MASK, &logmask);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hio = hio;
|
g_hio = hio;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user