Index: ossp-pkg/fsl/fsl.c RCS File: /v/ossp/cvs/ossp-pkg/fsl/fsl.c,v rcsdiff -q -kk '-r1.25' '-r1.26' -u '/v/ossp/cvs/ossp-pkg/fsl/fsl.c,v' 2>/dev/null --- fsl.c 2002/07/25 14:15:54 1.25 +++ fsl.c 2002/07/25 15:00:29 1.26 @@ -176,13 +176,17 @@ l2_channel_t *l2_nch; levelmap_t *levelmap; int maskpri; + int logopt; + int delayopen; } ctx = { NULL, NULL, NULL, NULL, NULL, - LOG_PRIMASK + LOG_PRIMASK, + 0, + FALSE }; static void fsldebug(l2_level_t level, const char *message, ...) @@ -321,8 +325,6 @@ /* properly handle repeated execution */ closelog(); - /* info: ident, facility; trace: configmatching; debug: traversal */ - /* create L2 environment for fsl itself */ argl2spec = getenv("FSL_DEBUG"); if (argl2spec == NULL) @@ -349,8 +351,14 @@ fsldebug(L2_LEVEL_TRACE, "captured openlog(ident=\"%s\", logopt=0x%.8lx, facility=0x%.8lx)", ident, logopt, facility); } - /*FIXME currently we completely ignore logopt LOG_CONS, LOG_NDELAY, LOG_PERROR, LOG_PID - */ + /* remember logopt and handle unsupported values */ + ctx.logopt = logopt; + if (logopt & LOG_CONS) + fsldebug(L2_LEVEL_WARNING, "ignored unsupported logopt LOG_CONS"); + if (logopt & LOG_PERROR) + fsldebug(L2_LEVEL_WARNING, "ignored unsupported logopt LOG_PERROR, use l2spec channel \"fd(filedescriptor=2)\" to emulate"); + if (logopt & LOG_PID) + fsldebug(L2_LEVEL_WARNING, "ignored unsupported logopt PID, use l2spec formatter %%P in prefix channel to emulate"); /* create default sysloglevel to l2_level mapping */ fsldebug(L2_LEVEL_DEBUG, "create default sysloglevel to l2_level mapping\n"); @@ -556,10 +564,15 @@ if ((cfgrv = cfg_node_get(cfg, cfgdir, CFG_NODE_ATTR_RBROTH, &cfgdir)) != CFG_OK) { (void)cfg_error(cfg, cfgrv, &cp); fsldebug(L2_LEVEL_ERROR, "cfg_node_get(CFG_NODE_ATTR_RBROTH) failed with error %s (%d)\n", cp, cfgrv); CU(1); } } - if ((l2rv = l2_channel_open(ctx.l2_nch)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "logging failed to open channel stream %s(%d)\n", cp, l2rv); CU(1); } - - ctx.maskpri = LOG_UPTO(LOG_DEBUG); + if (logopt & LOG_NDELAY) { + ctx.delayopen = TRUE; + fsldebug(L2_LEVEL_TRACE, "logopt LOG_NDELAY delays open of L2 channel tree until first message is being logged"); + } + else { + if ((l2rv = l2_channel_open(ctx.l2_nch)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "logging failed to open channel stream %s(%d) immediately\n", cp, l2rv); CU(1); } + fsldebug(L2_LEVEL_TRACE, "logging succeeded to open channel stream immediately"); + } CU(0); CUS: @@ -602,6 +615,9 @@ free(ctx.levelmap); ctx.levelmap = NULL; } + ctx.maskpri = LOG_PRIMASK; + ctx.logopt = 0; + ctx.delayopen = FALSE; } int setlogmask(int maskpri) @@ -639,11 +655,21 @@ int i; l2_result_t l2rv; char *cp; - + /* check for previous proper initialization */ if (ctx.l2_nch == NULL) return; + /* check for delayed open */ + if ((ctx.logopt & LOG_NDELAY) && (ctx.delayopen == TRUE)) { + if ((l2rv = l2_channel_open(ctx.l2_nch)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "logging failed to open channel stream %s(%d) delayed\n", cp, l2rv); + closelog(); + } + fsldebug(L2_LEVEL_TRACE, "logging succeeded to open channel stream delayed"); + ctx.delayopen = FALSE; + } + /* strip off facility */ priority &= LOG_PRIMASK; fsldebug(L2_LEVEL_DEBUG, "prioriy =0x%.8lx, ctx.maskpri=0x%.8lx ", (unsigned long)priority, (unsigned long)ctx.maskpri);