summaryrefslogtreecommitdiffstats
path: root/src/reader.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/reader.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/reader.cpp b/src/reader.cpp
new file mode 100644
index 0000000..dae5376
--- /dev/null
+++ b/src/reader.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2017-2024 OARC, Inc.
+ * Copyright (c) 2011-2017, IIS - The Internet Foundation in Sweden
+ * All rights reserved.
+ *
+ * This file is part of PacketQ.
+ *
+ * PacketQ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PacketQ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with PacketQ. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "reader.h"
+#include "packet_handler.h"
+
+namespace packetq {
+
+void Reader::seek_to_start()
+{
+ currently_reading = filenames.begin();
+ pcap.reset();
+ packets_read = 0;
+}
+
+bool Reader::done()
+{
+ return (!pcap && currently_reading == filenames.end()) || (max_packets > 0 && packets_read >= max_packets);
+}
+
+bool Reader::read_next(Packet_handler* handler, const std::vector<int>& columns, Row& destination_row, int skip_packets)
+{
+ bool filled_in_row = false;
+
+ while (!filled_in_row and !done()) {
+ // try opening pcap file
+ if (!pcap && currently_reading != filenames.end()) {
+ FILE* fp = fopen(currently_reading->c_str(), "rb");
+ if (fp) {
+ pcap.reset(new Pcap_file(fp, Pcap_file::TAKE_OVER_FP));
+
+ if (!pcap->get_header())
+ pcap.reset();
+ }
+
+ if (!pcap)
+ ++currently_reading;
+ }
+
+ // try reading a row
+ if (pcap) {
+ int len, s, us;
+ unsigned char* data = pcap->get_packet(len, s, us);
+ bool read_success = len && data;
+ ++packets_read; // we count all packets
+ if (read_success) {
+ Packet packet(data, len, s, us, packets_read, pcap->get_link_layer_type());
+ Packet::ParseResult res = packet.parse(handler, columns, destination_row, skip_packets == 0);
+
+ if (res == Packet::NOT_SAMPLED)
+ --skip_packets;
+
+ filled_in_row = res == Packet::OK;
+ } else {
+ // last row in file
+ pcap.reset();
+ if (currently_reading != filenames.end())
+ ++currently_reading;
+ }
+ }
+ }
+
+ return filled_in_row;
+}
+
+} // namespace packetq