Index: ossp-pkg/fsl/fsl.c RCS File: /v/ossp/cvs/ossp-pkg/fsl/fsl.c,v rcsdiff -q -kk '-r1.45' '-r1.46' -u '/v/ossp/cvs/ossp-pkg/fsl/fsl.c,v' 2>/dev/null --- fsl.c 2002/08/01 11:41:05 1.45 +++ fsl.c 2002/08/01 15:27:01 1.46 @@ -429,6 +429,12 @@ l2_channel_t *ch; /* scratch variable */ l2_result_t l2rv; int matchcount = 0; + pcre *pcreRegex = NULL; + pcre_extra *pcreExtra = NULL; + const char *cpError; + int iError; + int nMatch; + if ((cfg == NULL) || (cpISF == NULL) || (strlen(cpISF) < 3) || (mode < 0) || (mode > 1)) return FSL_ERR_ARG; @@ -518,49 +524,50 @@ ) { /* process the directive using the three arguments found */ fsldebug(L2_LEVEL_DEBUG, "processcfg: argident=%s, argmatch=%s, argl2spec=%s", argident, argmatch, argl2spec); - { - pcre *pcreRegex; - pcre_extra *pcreExtra; - const char *cpError; - int iError; - int nMatch; - - /* compile regular expression into finite state machine and optimize */ - if ((pcreRegex = pcre_compile(argmatch, PCRE_CASELESS, &cpError, &iError, NULL)) == NULL) { - fsldebug(L2_LEVEL_ERROR, "processcfg: pcre_compile() failed with error %s (%d)", cpError, iError); CU(FSL_ERR_CUS); } - pcreExtra = pcre_study(pcreRegex, 0, &cpError); - if (cpError != NULL) { - fsldebug(L2_LEVEL_ERROR, "processcfg: pcre_study() failed with error %s", cpError); CU(FSL_ERR_CUS); } - - nMatch = pcre_exec(pcreRegex, pcreExtra, cpISF, strlen(cpISF), 0, 0, ovec, OVECSIZE); - if (nMatch < 0) - fsldebug(L2_LEVEL_TRACE, "processcfg: matching ident/facility \"%s\" against section \"%s\" failed.", cpISF, argmatch); + + /* compile regular expression into finite state machine and optimize */ + if ((pcreRegex = pcre_compile(argmatch, PCRE_CASELESS, &cpError, &iError, NULL)) == NULL) { + fsldebug(L2_LEVEL_ERROR, "processcfg: pcre_compile() failed with error %s (%d)", cpError, iError); CU(FSL_ERR_CUS); } + pcreExtra = pcre_study(pcreRegex, 0, &cpError); + if (cpError != NULL) { + fsldebug(L2_LEVEL_ERROR, "processcfg: pcre_study() failed with error %s", cpError); CU(FSL_ERR_CUS); } + + nMatch = pcre_exec(pcreRegex, pcreExtra, cpISF, strlen(cpISF), 0, 0, ovec, OVECSIZE); + if (nMatch < 0) + fsldebug(L2_LEVEL_TRACE, "processcfg: matching ident/facility \"%s\" against section \"%s\" failed.", cpISF, argmatch); + else + if (nMatch == 0) + fsldebug(L2_LEVEL_TRACE, "processcfg: matching ident/facility \"%s\" against section \"%s\" succeeded, found $0", cpISF, argmatch); else - if (nMatch == 0) - fsldebug(L2_LEVEL_TRACE, "processcfg: matching ident/facility \"%s\" against section \"%s\" succeeded, found $0", cpISF, argmatch); - else - fsldebug(L2_LEVEL_TRACE, "processcfg: matching ident/facility \"%s\" against section \"%s\" succeeded, found $0...$%d", cpISF, argmatch, (nMatch-1) > 9 ? 9 : (nMatch-1)); - if (nMatch >= 1) { - pcre_get_substring_list(cpISF, ovec, nMatch, &acpMatch); - if (acpMatch != NULL) - for (i = 0; i < nMatch; i++) - fsldebug(L2_LEVEL_DEBUG, "processcfg: regex reference[%d]=\'%s\'", i, acpMatch[i] == NULL ? "(UNDEFINED)" : acpMatch[i]); - n = substcapture(argl2spec, strlen(argl2spec), acpMatch, nMatch, NULL); - if ((cp = (char *)malloc(n + 1)) == NULL) { - fsldebug(L2_LEVEL_ERROR, "processcfg: malloc() failed"); CU(FSL_ERR_CUS); } - if (substcapture(argl2spec, strlen(argl2spec), acpMatch, nMatch, cp) != n) { - fsldebug(L2_LEVEL_ERROR, "processcfg: substcapture() failed"); CU(FSL_ERR_CUS); } - argl2spec = cp; - fsldebug(L2_LEVEL_DEBUG, "processcfg: argident=%s, argmatch=%s, argl2spec=%s", argident, argmatch, argl2spec); - - /* create L2 channel throuh spec and link into root channel */ - if ((l2rv = l2_spec(&ch, ctx.l2_env, "%s", argl2spec)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "processcfg: logging failed to create stream from spec %s(%d)", cp, l2rv); CU(FSL_ERR_CUS); } - if ((l2rv = l2_channel_link(ctx.l2_nch, L2_LINK_CHILD, ch, NULL)) != L2_OK) { - cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "processcfg: logging failed to link child channel %s(%d)", cp, l2rv); CU(FSL_ERR_CUS); } - matchcount++; - free(argl2spec); - } + fsldebug(L2_LEVEL_TRACE, "processcfg: matching ident/facility \"%s\" against section \"%s\" succeeded, found $0...$%d", cpISF, argmatch, (nMatch-1) > 9 ? 9 : (nMatch-1)); + if (nMatch >= 1) { + pcre_get_substring_list(cpISF, ovec, nMatch, &acpMatch); + if (acpMatch != NULL) + for (i = 0; i < nMatch; i++) + fsldebug(L2_LEVEL_DEBUG, "processcfg: regex reference[%d]=\'%s\'", i, acpMatch[i] == NULL ? "(UNDEFINED)" : acpMatch[i]); + n = substcapture(argl2spec, strlen(argl2spec), acpMatch, nMatch, NULL); + if ((cp = (char *)malloc(n + 1)) == NULL) { + fsldebug(L2_LEVEL_ERROR, "processcfg: malloc() failed"); CU(FSL_ERR_CUS); } + if (substcapture(argl2spec, strlen(argl2spec), acpMatch, nMatch, cp) != n) { + fsldebug(L2_LEVEL_ERROR, "processcfg: substcapture() failed"); CU(FSL_ERR_CUS); } + argl2spec = cp; + fsldebug(L2_LEVEL_DEBUG, "processcfg: argident=%s, argmatch=%s, argl2spec=%s", argident, argmatch, argl2spec); + + /* create L2 channel throuh spec and link into root channel */ + if ((l2rv = l2_spec(&ch, ctx.l2_env, "%s", argl2spec)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "processcfg: logging failed to create stream from spec %s(%d)", cp, l2rv); CU(FSL_ERR_CUS); } + if ((l2rv = l2_channel_link(ctx.l2_nch, L2_LINK_CHILD, ch, NULL)) != L2_OK) { + cp = l2_env_strerror(ctx.l2_env, l2rv); fsldebug(L2_LEVEL_ERROR, "processcfg: logging failed to link child channel %s(%d)", cp, l2rv); CU(FSL_ERR_CUS); } + matchcount++; + free(argl2spec); + } + if (pcreExtra != NULL) { + pcre_free(pcreExtra); + pcreExtra = NULL; + } + if (pcreRegex != NULL) { + pcre_free(pcreRegex); + pcreRegex = NULL; } } else @@ -605,6 +612,14 @@ else CU(FSL_OK); CUS: + if (pcreExtra != NULL) { + pcre_free(pcreExtra); + pcreExtra = NULL; + } + if (pcreRegex != NULL) { + pcre_free(pcreRegex); + pcreRegex = NULL; + } return rc; }