e1cap_dump: Add capability to filter on a given line+timeslot and for binary output
diff --git a/src/e1cap_dump.c b/src/e1cap_dump.c
index 03b86f7..b732449 100644
--- a/src/e1cap_dump.c
+++ b/src/e1cap_dump.c
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <time.h>
+#include <unistd.h>
 
 #include <sys/time.h>
 
@@ -12,6 +13,15 @@
 
 struct e1_recorder g_recorder;
 
+enum mode {
+	MODE_PRINT,
+	MODE_BIN,
+};
+
+static enum mode g_mode = MODE_PRINT;
+static int g_filter_line = -1;
+static int g_filter_slot = -1;
+
 static char *timeval2str(struct timeval *tv)
 {
 	time_t nowtime;
@@ -26,27 +36,75 @@
 	return buf;
 }
 
+static int handle_options(int argc, char **argv)
+{
+	int opt;
+
+	while ((opt = getopt(argc, argv, "l:s:b")) != -1) {
+		switch (opt) {
+		case 'l':
+			g_filter_line = atoi(optarg);
+			break;
+		case 's':
+			g_filter_slot = atoi(optarg);
+			break;
+		case 'b':
+			g_mode = MODE_BIN;
+			break;
+		default:
+			fprintf(stderr, "Unknown option '%c'\n", opt);
+			exit(EXIT_FAILURE);
+			break;
+		}
+	}
+
+	return 0;
+}
+
 int main(int argc, char **argv)
 {
 	struct osmo_e1cap_file *f;
 	struct osmo_e1cap_pkthdr *pkt;
+	unsigned long num_pkt = 0;
 
 	printf("sizeof(timeval) = %zu\n", sizeof(struct timeval));
 	printf("sizeof(osmo_e1cap_pkthdr) = %zu\n", sizeof(*pkt));
 
-	if (argc < 2)
-		exit(2);
+	handle_options(argc, argv);
 
-	f = osmo_e1cap_open(NULL, argv[1]);
-	if (!f)
+	if (optind >= argc) {
+		fprintf(stderr, "Missing input file name\n");
+		exit(2);
+	}
+
+	f = osmo_e1cap_open(NULL, argv[optind++]);
+	if (!f) {
+		fprintf(stderr, "Unable to open input file\n");
 		exit(1);
+	}
 
 	while ((pkt = osmo_e1cap_read_next(f))) {
-		printf("%s %02u/%02u %u (%u): %s\n",
-			timeval2str(&pkt->ts),
-			pkt->line_nr, pkt->ts_nr, pkt->capture_mode,
-			pkt->len,
-			osmo_hexdump_nospc(pkt->data, pkt->len));
+		num_pkt++;
+
+		if (g_filter_line >= 0 && pkt->line_nr != g_filter_line)
+			continue;
+		if (g_filter_slot >= 0 && pkt->ts_nr != g_filter_slot)
+			continue;
+
+		switch (g_mode) {
+		case MODE_PRINT:
+			printf("%s %02u/%02u %u (%u): %s\n",
+				timeval2str(&pkt->ts),
+				pkt->line_nr, pkt->ts_nr, pkt->capture_mode,
+				pkt->len,
+				osmo_hexdump_nospc(pkt->data, pkt->len));
+			break;
+		case MODE_BIN:
+			write(1, pkt->data, pkt->len);
+			break;
+		}
 		talloc_free(pkt);
 	}
+
+	fprintf(stderr, "Processed a total of %lu packets\n", num_pkt);
 }