void ArgusClientInit (struct ArgusParserStruct *parser) { struct ArgusModeStruct *mode; int i = 0, x = 0; if (!(parser->RaInitialized)) { (void) signal (SIGHUP, (void (*)(int)) RaParseComplete); (void) signal (SIGTERM, (void (*)(int)) RaParseComplete); (void) signal (SIGQUIT, (void (*)(int)) RaParseComplete); (void) signal (SIGINT, (void (*)(int)) RaParseComplete); parser->RaWriteOut = 0; if (parser->vflag) ArgusReverseSortDir++; if ((ArgusSorter = ArgusNewSorter()) == NULL) ArgusLog (LOG_ERR, "ArgusClientInit ArgusNewSorter error %s", strerror(errno)); bzero ((char *) ArgusSorter->ArgusSortAlgorithms, sizeof(ArgusSorter->ArgusSortAlgorithms)); ArgusSorter->ArgusSortAlgorithms[0] = ArgusSortAlgorithmTable[0]; if ((mode = parser->ArgusModeList) != NULL) { while (mode) { if (!(strcmp ("replace", mode->mode))) { ArgusSorter->ArgusReplaceMode++; if ((parser->ArgusWfileList != NULL) && (!(ArgusListEmpty(parser->ArgusWfileList)))) { ArgusLog (LOG_ERR, "replace mode and -w option are incompatible\n"); } } mode = mode->nxt; } } if ((mode = parser->ArgusMaskList) != NULL) { while (mode) { for (x = 0; x < MAX_SORT_ALG_TYPES; x++) { if (!strncmp (ArgusSortKeyWords[x], mode->mode, strlen(ArgusSortKeyWords[x]))) { ArgusSorter->ArgusSortAlgorithms[i++] = ArgusSortAlgorithmTable[x]; break; } } if (x == MAX_SORT_ALG_TYPES) ArgusLog (LOG_ERR, "sort syntax error. \'%s\' not supported", mode->mode); mode = mode->nxt; } } parser->RaInitialized++; } }
void RaParseComplete (int sig) { struct ArgusModeStruct *mode = NULL; int i = 0, x = 0, nflag = ArgusParser->eNflag; struct ArgusInput *file = ArgusParser->ArgusCurrentFile; char buf[MAXSTRLEN]; int label; if (sig >= 0) { if (!(ArgusParser->RaParseCompleting++)) { struct ArgusAggregatorStruct *agg = ArgusParser->ArgusAggregator; ArgusParser->RaParseCompleting += sig; if (ArgusParser->ArgusReplaceMode && file) { if (!(ArgusParser->ArgusRandomSeed)) srandom(ArgusParser->ArgusRandomSeed); srandom (ArgusParser->ArgusRealTime.tv_usec); label = random() % 100000; bzero(buf, sizeof(buf)); snprintf (buf, MAXSTRLEN, "%s.tmp%d", file->filename, label); setArgusWfile(ArgusParser, buf, NULL); } while (agg != NULL) { if (agg->queue->count) { struct ArgusRecordStruct *argus; if (!(ArgusSorter)) if ((ArgusSorter = ArgusNewSorter(ArgusParser)) == NULL) ArgusLog (LOG_ERR, "RaParseComplete: ArgusNewSorter error %s", strerror(errno)); if ((mode = ArgusParser->ArgusMaskList) != NULL) { while (mode) { for (x = 0; x < MAX_SORT_ALG_TYPES; x++) { if (!strncmp (ArgusSortKeyWords[x], mode->mode, strlen(ArgusSortKeyWords[x]))) { ArgusSorter->ArgusSortAlgorithms[i++] = ArgusSortAlgorithmTable[x]; break; } } mode = mode->nxt; } } ArgusSortQueue (ArgusSorter, agg->queue); argus = ArgusCopyRecordStruct((struct ArgusRecordStruct *) agg->queue->array[0]); if (nflag == 0) ArgusParser->eNflag = agg->queue->count; else ArgusParser->eNflag = nflag > agg->queue->count ? agg->queue->count : nflag; for (i = 1; i < ArgusParser->eNflag; i++) ArgusMergeRecords (agg, argus, (struct ArgusRecordStruct *)agg->queue->array[i]); ArgusParser->ns = argus; for (i = 0; i < ArgusParser->eNflag; i++) { RaSendArgusRecord ((struct ArgusRecordStruct *) agg->queue->array[i]); ArgusDeleteRecordStruct(ArgusParser, (struct ArgusRecordStruct *) agg->queue->array[i]); } ArgusDeleteRecordStruct(ArgusParser, ArgusParser->ns); } agg = agg->nxt; } if (ArgusParser->ArgusAggregator != NULL) ArgusDeleteAggregator(ArgusParser, ArgusParser->ArgusAggregator); if (ArgusParser->ArgusReplaceMode && file) { if (ArgusParser->ArgusWfileList != NULL) { struct ArgusWfileStruct *wfile = NULL; if ((wfile = (void *)ArgusParser->ArgusWfileList->start) != NULL) { fflush (wfile->fd); rename (wfile->filename, file->filename); fclose (wfile->fd); wfile->fd = NULL; } ArgusDeleteList(ArgusParser->ArgusWfileList, ARGUS_WFILE_LIST); ArgusParser->ArgusWfileList = NULL; if (ArgusParser->Vflag) ArgusLog(LOG_INFO, "file %s aggregated", file->filename); } } #ifdef ARGUSDEBUG ArgusDebug (2, "RaParseComplete(caught signal %d)\n", sig); #endif switch (sig) { case SIGHUP: case SIGINT: case SIGTERM: case SIGQUIT: { struct ArgusWfileStruct *wfile = NULL; ArgusShutDown(sig); if (ArgusParser->ArgusWfileList != NULL) { struct ArgusListObjectStruct *lobj = NULL; int i, count = ArgusParser->ArgusWfileList->count; if ((lobj = ArgusParser->ArgusWfileList->start) != NULL) { for (i = 0; i < count; i++) { if ((wfile = (struct ArgusWfileStruct *) lobj) != NULL) { if (wfile->fd != NULL) { #ifdef ARGUSDEBUG ArgusDebug (2, "RaParseComplete: closing %s\n", wfile->filename); #endif fflush (wfile->fd); fclose (wfile->fd); wfile->fd = NULL; } } lobj = lobj->nxt; } } } exit(0); break; } } } } ArgusParser->eNflag = nflag; #ifdef ARGUSDEBUG ArgusDebug (6, "RaParseComplete(%d) done", sig); #endif }