LOCAL int reader_libpcapfile_process(char *filename) { char errbuf[1024]; if (!realpath(filename, offlinePcapFilename)) { LOG("ERROR - pcap open failed - Couldn't realpath file: '%s' with %d", filename, errno); return 1; } if (config.pcapSkip && moloch_db_file_exists(offlinePcapFilename, NULL)) { if (config.debug) LOG("Skipping %s", filename); return 1; } if (config.pcapReprocess && !moloch_db_file_exists(offlinePcapFilename, NULL)) { LOG("Can't reprocess %s", filename); return 1; } errbuf[0] = 0; LOG ("Processing %s", filename); pktsToRead = config.pktsToRead; pcap = pcap_open_offline(filename, errbuf); if (!pcap) { LOG("Couldn't process '%s' error '%s'", filename, errbuf); return 1; } reader_libpcapfile_opened(); return 0; }
int reader_libpcapfile_next() { char errbuf[1024]; gchar *fullfilename; pcap = 0; if (config.pcapReadFiles) { static int pcapFilePos = 0; fullfilename = config.pcapReadFiles[pcapFilePos]; errbuf[0] = 0; if (!fullfilename) { goto filesDone; } pcapFilePos++; LOG ("Processing %s", fullfilename); pcap = pcap_open_offline(fullfilename, errbuf); if (!pcap) { LOG("Couldn't process '%s' error '%s'", fullfilename, errbuf); return reader_libpcapfile_next(); } if (!realpath(fullfilename, offlinePcapFilename)) { LOG("ERROR - pcap open failed - Couldn't realpath file: '%s' with %d", fullfilename, errno); exit(1); } reader_libpcapfile_opened(); return 1; } filesDone: if (config.pcapReadDirs) { static int pcapDirPos = 0; static GDir *pcapGDir[21]; static char *pcapBase[21]; static int pcapGDirLevel = -1; GError *error = 0; if (pcapGDirLevel == -2) { goto dirsDone; } if (pcapGDirLevel == -1) { pcapGDirLevel = 0; pcapBase[0] = config.pcapReadDirs[pcapDirPos]; if (!pcapBase[0]) { pcapGDirLevel = -2; goto dirsDone; } } if (!pcapGDir[pcapGDirLevel]) { pcapGDir[pcapGDirLevel] = g_dir_open(pcapBase[pcapGDirLevel], 0, &error); if (error) { LOG("ERROR: Couldn't open pcap directory: Receive Error: %s", error->message); exit(0); } } const gchar *filename; while (1) { filename = g_dir_read_name(pcapGDir[pcapGDirLevel]); // No more files, stop processing this directory if (!filename) { break; } // Skip hidden files/directories if (filename[0] == '.') continue; fullfilename = g_build_filename (pcapBase[pcapGDirLevel], filename, NULL); // If recursive option and a directory then process all the files in that dir if (config.pcapRecursive && g_file_test(fullfilename, G_FILE_TEST_IS_DIR)) { if (pcapGDirLevel >= 20) continue; pcapBase[pcapGDirLevel+1] = fullfilename; pcapGDirLevel++; return reader_libpcapfile_next(); } if (!g_regex_match(config.offlineRegex, filename, 0, NULL)) { g_free(fullfilename); continue; } if (!realpath(fullfilename, offlinePcapFilename)) { g_free(fullfilename); continue; } if (config.pcapSkip && moloch_db_file_exists(offlinePcapFilename)) { if (config.debug) LOG("Skipping %s", fullfilename); g_free(fullfilename); continue; } LOG ("Processing %s", fullfilename); errbuf[0] = 0; pcap = pcap_open_offline(fullfilename, errbuf); if (!pcap) { LOG("Couldn't process '%s' error '%s'", fullfilename, errbuf); g_free(fullfilename); continue; } reader_libpcapfile_opened(); g_free(fullfilename); return 1; } g_dir_close(pcapGDir[pcapGDirLevel]); pcapGDir[pcapGDirLevel] = 0; if (pcapGDirLevel > 0) { g_free(pcapBase[pcapGDirLevel]); pcapGDirLevel--; return reader_libpcapfile_next(); } else { pcapDirPos++; pcapGDirLevel = -1; return reader_libpcapfile_next(); } } dirsDone: while (DLL_COUNT(s_, &monitorQ) > 0) { MolochString_t *string; DLL_POP_HEAD(s_, &monitorQ, string); fullfilename = string->str; MOLOCH_TYPE_FREE(MolochString_t, string); if (!realpath(fullfilename, offlinePcapFilename)) { g_free(fullfilename); continue; } if (config.pcapSkip && moloch_db_file_exists(offlinePcapFilename)) { if (config.debug) LOG("Skipping %s", fullfilename); g_free(fullfilename); continue; } LOG ("Processing %s", fullfilename); errbuf[0] = 0; pcap = pcap_open_offline(fullfilename, errbuf); if (!pcap) { LOG("Couldn't process '%s' error '%s'", fullfilename, errbuf); g_free(fullfilename); continue; } reader_libpcapfile_opened(); g_free(fullfilename); return 1; } return 0; }