Index: ossp-pkg/fsl/fsl.c RCS File: /v/ossp/cvs/ossp-pkg/fsl/fsl.c,v rcsdiff -q -kk '-r1.41' '-r1.42' -u '/v/ossp/cvs/ossp-pkg/fsl/fsl.c,v' 2>/dev/null --- fsl.c 2002/07/30 12:03:36 1.41 +++ fsl.c 2002/07/31 11:39:13 1.42 @@ -81,7 +81,8 @@ FSL_ERR_USE, /* invalid use */ FSL_ERR_MEM, /* no more memory available */ FSL_ERR_SYS, /* operating system error, see errno */ - FSL_ERR_CUS /* error handled and logged, just run clean up sequence and goodbye */ + FSL_ERR_CUS, /* error handled and logged, just run clean up sequence and goodbye */ + FSL_ERR_INT /* internal error */ } fsl_rc_t; /* file buffer handling sub-API */ @@ -182,7 +183,9 @@ int maskpri; int logopt; int delayopen; - int openlog; + int triedopenlog; + int triedopenfsldebug; + int openfsldebugpermanenterror; } ctx = { NULL, NULL, @@ -192,6 +195,8 @@ LOG_UPTO(LOG_DEBUG), 0, FALSE, + FALSE, + FALSE, FALSE }; @@ -595,6 +600,68 @@ return rc; } +static void closefsllog() +{ + if (ctx.l2_fslnch != NULL) { + l2_channel_destroy(ctx.l2_fslnch); + ctx.l2_fslnch = NULL; + } + if (ctx.l2_fslenv != NULL) { + l2_env_destroy(ctx.l2_fslenv); + ctx.l2_fslenv = NULL; + } + ctx.triedopenfsldebug = FALSE; +} + +static void openfsldebug() +{ + int rc = FSL_OK; + char *argl2spec; + l2_result_t l2rv; + char *cp; /* scratch variable */ + l2_channel_t *ch; /* scratch variable */ + + if (ctx.triedopenfsldebug || ctx.openfsldebugpermanenterror) + return; + + /* properly prepare for repeated execution */ + ctx.triedopenfsldebug = TRUE; + + /* create OSSP l2 environment for fsl itself (internal logging) */ + if ((argl2spec = getenv("FSL_DEBUG")) == NULL) + argl2spec = FSL_DEBUG; + if (strlen(argl2spec) > 0) { + if ((l2rv = l2_env_create(&ctx.l2_fslenv)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: failed to create L2 environment (%d) for fsl", l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_env_levels(ctx.l2_fslenv, L2_LEVEL_ALL, L2_LEVEL_NONE)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to set global logging level defaults %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_env_formatter(ctx.l2_fslenv, 'D', l2_util_fmt_dump, NULL)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to register dump formatter %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_env_formatter(ctx.l2_fslenv, 'S', l2_util_fmt_string, NULL)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to register string formatter %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_env_formatter(ctx.l2_fslenv, 'm', l2_util_fmt_errno, NULL)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to register errno formatter %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_channel_create(&ctx.l2_fslnch, ctx.l2_fslenv, "noop")) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to create noop channel; %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_spec(&ch, ctx.l2_fslenv, "%s", argl2spec)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to create stream from spec %s(%d) for fsl", cp, l2rv); + if (l2rv == L2_ERR_ARG) + CU(FSL_ERR_ARG); + else + CU(FSL_ERR_INT); + } + if ((l2rv = l2_channel_link(ctx.l2_fslnch, L2_LINK_CHILD, ch, NULL)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to link child channel %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + if ((l2rv = l2_channel_open(ctx.l2_fslnch)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to open channel stream %s(%d) for fsl", cp, l2rv); CU(FSL_ERR_INT); } + } +CUS: + if (rc != FSL_OK) + closefsllog(); + if (rc == FSL_ERR_ARG); + ctx.openfsldebugpermanenterror = TRUE; +} + /* POSIX API function openlog(3) */ void openlog(const char *ident, int logopt, int facility) { @@ -603,13 +670,11 @@ fsl_rc_t rv; cfg_t *cfg; cfg_rc_t cfgrv; - char *argl2spec; char *cp; /* scratch variable */ int i; /* scratch variable */ char *cpIdent; char *cpFacility; char *cpISF; - l2_channel_t *ch; /* scratch variable */ l2_result_t l2rv; /* initialization */ @@ -620,36 +685,14 @@ cpIdent = NULL; cpISF = NULL; - /* properly handle repeated execution */ + /* properly prepare for repeated execution */ closelog(); - ctx.openlog = TRUE; + ctx.triedopenlog = TRUE; /* create OSSP l2 environment for fsl itself (internal logging) */ - if ((argl2spec = getenv("FSL_DEBUG")) == NULL) - argl2spec = FSL_DEBUG; - if (strlen(argl2spec) > 0) { - if ((l2rv = l2_env_create(&ctx.l2_fslenv)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: failed to create L2 environment (%d) for fsl", l2rv); CU(1); } - if ((l2rv = l2_env_levels(ctx.l2_fslenv, L2_LEVEL_ALL, L2_LEVEL_NONE)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to set global logging level defaults %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_env_formatter(ctx.l2_fslenv, 'D', l2_util_fmt_dump, NULL)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to register dump formatter %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_env_formatter(ctx.l2_fslenv, 'S', l2_util_fmt_string, NULL)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to register string formatter %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_env_formatter(ctx.l2_fslenv, 'm', l2_util_fmt_errno, NULL)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to register errno formatter %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_channel_create(&ctx.l2_fslnch, ctx.l2_fslenv, "noop")) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to create noop channel; %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_spec(&ch, ctx.l2_fslenv, "%s", argl2spec)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to create stream from spec %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_channel_link(ctx.l2_fslnch, L2_LINK_CHILD, ch, NULL)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to link child channel %s(%d) for fsl", cp, l2rv); CU(1); } - if ((l2rv = l2_channel_open(ctx.l2_fslnch)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_fslenv, l2rv); fsldebug(L2_LEVEL_ERROR, "openlog: logging failed to open channel stream %s(%d) for fsl", cp, l2rv); CU(1); } - } + openfsldebug(); /* tracing */ - fsldebug(L2_LEVEL_TRACE, "openlog() ident=\"%s\", logopt=0x%.8lx, facility=0x%.8lx)", ident, logopt, facility); /* remember logopt and handle unsupported values */ @@ -758,14 +801,7 @@ void closelog(void) { fsldebug(L2_LEVEL_TRACE, "closelog()"); - if (ctx.l2_fslnch != NULL) { - l2_channel_destroy(ctx.l2_fslnch); - ctx.l2_fslnch = NULL; - } - if (ctx.l2_fslenv != NULL) { - l2_env_destroy(ctx.l2_fslenv); - ctx.l2_fslenv = NULL; - } + closefsllog(); if (ctx.l2_nch != NULL) { l2_channel_destroy(ctx.l2_nch); ctx.l2_nch = NULL; @@ -781,7 +817,7 @@ ctx.maskpri = LOG_UPTO(LOG_DEBUG); ctx.logopt = 0; ctx.delayopen = FALSE; - ctx.openlog = FALSE; + ctx.triedopenlog = FALSE; return; } @@ -822,7 +858,7 @@ char *cp; /* check for previous omitted attempt of initialization */ - if (ctx.l2_nch == NULL && !ctx.openlog) + if (ctx.l2_nch == NULL && !ctx.triedopenlog) openlog("fsl", 0, LOG_SYSLOG); /* check for previous proper initialization */