void RaParseComplete (int sig) { int i = 0, count = 0; if (sig >= 0) { if (!ArgusParser->RaParseCompleting++) { count = ArgusSorter->ArgusRecordQueue->count; if (count > 0) { ArgusSortQueue (ArgusSorter, ArgusSorter->ArgusRecordQueue); for (i = 0; i < count; i++) RaSendArgusRecord ((struct ArgusRecordStruct *) ArgusSorter->ArgusRecordQueue->array[i]); } } #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; 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; } } } }
void RaArgusInputComplete (struct ArgusInput *input) { struct ArgusRecordStruct *nsr; struct ArgusWfileStruct *wfile = NULL; char buf[MAXSTRLEN]; int count, label, i, fd; if (ArgusSorter->ArgusReplaceMode) { if (ArgusParser->ArgusWfileList == NULL) ArgusParser->ArgusWfileList = ArgusNewList(); if ((count = ArgusSorter->ArgusRecordQueue->count) > 0) { if (!(ArgusParser->ArgusRandomSeed)) srandom(ArgusParser->ArgusRandomSeed); srandom (ArgusParser->ArgusRealTime.tv_usec); label = random() % 100000; bzero(buf, sizeof(buf)); snprintf (buf, MAXSTRLEN, "%s.tmp%d", input->filename, label); if ((fd = open(buf, O_CREAT|O_EXCL, input->statbuf.st_mode)) < 0) ArgusLog (LOG_ERR, "open %s error: %s", buf, strerror(errno)); close(fd); if ((wfile = (struct ArgusWfileStruct *) ArgusCalloc (1, sizeof (*wfile))) != NULL) { ArgusPushFrontList(ArgusParser->ArgusWfileList, (struct ArgusListRecord *)wfile, ARGUS_NOLOCK); wfile->filename = strdup(buf); } else ArgusLog (LOG_ERR, "setArgusWfile, ArgusCalloc %s", strerror(errno)); ArgusSortQueue (ArgusSorter, ArgusSorter->ArgusRecordQueue); for (i = 0, count = ArgusSorter->ArgusRecordQueue->count; i < count; i++) RaSendArgusRecord ((struct ArgusRecordStruct *)ArgusSorter->ArgusRecordQueue->array[i]); while ((nsr = (struct ArgusRecordStruct *) ArgusPopQueue(ArgusSorter->ArgusRecordQueue, ARGUS_NOLOCK)) != NULL) ArgusDeleteRecordStruct(ArgusParser, nsr); rename (wfile->filename, input->filename); fclose (wfile->fd); ArgusDeleteList (ArgusParser->ArgusWfileList, ARGUS_WFILE_LIST); ArgusParser->ArgusWfileList = NULL; if (ArgusParser->Vflag) ArgusLog(LOG_INFO, "file %s sorted", input->filename); } } }
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 }