void ArgusClientTimeout () { struct ArgusAggregatorStruct *agg = ArgusParser->ArgusAggregator; while (agg) { int i, count; if (agg->statusint > 0) { if ((count = agg->queue->count) > 0) { for (i = 0; i < count; i++) { struct ArgusRecordStruct *ns = (void *) ArgusPopQueue(agg->queue, ARGUS_LOCK); double nsst = ArgusFetchStartTime(ns); double nslt = ArgusFetchLastTime(ns); double glt = (double)(ArgusParser->ArgusGlobalTime.tv_sec * 1.0) + (double)(ArgusParser->ArgusGlobalTime.tv_usec/1000000.0); if (agg->statusint && ((glt - nsst) >= agg->statusint)) { RaSendArgusRecord(ns); } else { if (agg->idleint && ((glt - nslt) >= agg->idleint)) { ArgusRemoveHashEntry(&ns->htblhdr); RaSendArgusRecord(ns); ArgusDeleteRecordStruct (ArgusParser, ns); ns = NULL; } } if (ns != NULL) ArgusAddToQueue(agg->queue, &ns->qhdr, ARGUS_LOCK); } } } else { if (agg->idleint) { int done = 0; while ((!done) && (agg->queue->count > 0)) { struct ArgusRecordStruct *ns = (void *) agg->queue->start; double nslt = ArgusFetchLastTime(ns); double glt = (double)(ArgusParser->ArgusGlobalTime.tv_sec * 1.0) + (double)(ArgusParser->ArgusGlobalTime.tv_usec/1000000.0); if ((glt - nslt) >= agg->idleint) { ArgusRemoveHashEntry(&ns->htblhdr); RaSendArgusRecord(ns); ArgusDeleteRecordStruct (ArgusParser, ns); } else done = 1; } } } agg = agg->nxt; } #ifdef ARGUSDEBUG ArgusDebug (6, "ArgusClientTimeout()\n"); #endif }
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); } } }