/* * status = readerStart(flow_processor) * * Invoked by input_mode_type->start_fn(); */ static int readerStart( flow_proc_t *fproc) { const char *filename = skpcProbeGetFileSource(fproc->probe); skPDUSource_t *pdu_src; skFlowSourceParams_t params; /* if a pdu_src already exists, just return. */ if (fproc->flow_src != NULL) { return 0; } if (filename == NULL) { ERRMSG("Probe %s not configured for reading from file", skpcProbeGetName(fproc->probe)); return -1; } params.path_name = filename; pdu_src = skPDUSourceCreate(fproc->probe, ¶ms); if (pdu_src == NULL) { ERRMSG("'%s': Could not create PDU source from file '%s'", skpcProbeGetName(fproc->probe), filename); errorDirectoryInsertFile(filename); return -1; } /* zero counts */ fproc->rec_count_total = 0; fproc->rec_count_bad = 0; fproc->flow_src = pdu_src; return 0; }
/* * readerGetNextValidFile(&fc_src); * * Pull the next file name off of the valid-queue and create a * flowsource object to read the flowcap records in it. Fills * 'fproc' with the new flowcap-source object and probe. * * Return 0 on success. Return -1 if getting the file name fails. * If unable to open the file or file not of correct form, return * -2 unless the --error-dir is set, in which case move the file * there and try the next file. */ static int readerGetNextValidFile( flow_proc_t *fproc) { skstream_t *fcfile = NULL; skpc_probe_t *probe = NULL; skPollDirErr_t pderr; char *filename; char path[PATH_MAX]; int rv; do { /* Get next file from the directory poller */ pderr = skPollDirGetNextFile(polldir, path, &filename); if (pderr != PDERR_NONE) { if (pderr == PDERR_STOPPED) { return -1; } CRITMSG("Fatal polldir error ocurred: %s", ((pderr == PDERR_SYSTEM) ? strerror(errno) : skPollDirStrError(pderr))); skAbort(); } INFOMSG((INPUT_MODE_TYPE_NAME " processing %s"), filename); /* open the file to create a source of records */ rv = flowcapSourceCreateFromFile(path, &fcfile, &probe); if (rv) { rv = errorDirectoryInsertFile(path); if (rv != 0) { /* either no --error-dir (rv == 1) or problem moving * the file (rv == -1). either way, return an error * code to the caller. */ return -2; } } } while (fcfile == NULL); fproc->flow_src = fcfile; fproc->probe = probe; return 0; }