diff rvinterf/l1filter/pktsort.c @ 855:ea458ee48691

rvinterf/l1filter: new program written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 09 Nov 2021 23:14:22 +0000
parents rvinterf/asyncshell/pktsort.c@bbc41034f14c
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/l1filter/pktsort.c	Tue Nov 09 23:14:22 2021 +0000
@@ -0,0 +1,96 @@
+/*
+ * Here we sort out incoming packets from the target relayed via rvinterf.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include "pktmux.h"
+#include "limits.h"
+#include "localsock.h"
+#include "localtypes.h"
+#include "exitcodes.h"
+
+extern u_char rvi_msg[];
+extern int rvi_msg_len;
+extern char **filter_list;
+
+static
+is_filter_match()
+{
+	char **fp;
+	int len;
+
+	for (fp = filter_list; *fp; fp++) {
+		len = strlen(*fp);
+		if (rvi_msg_len < len + 3)
+			continue;
+		if (strncmp(rvi_msg + 2, *fp, len))
+			continue;
+		if (rvi_msg[len+2] != ' ')
+			continue;
+		return 1;
+	}
+	return 0;
+}
+
+static void
+print_l1_trace()
+{
+	u_char *dp, *endp;
+	int c, newline;
+
+	dp = rvi_msg + 2;
+	endp = rvi_msg + rvi_msg_len;
+	while (dp < endp) {
+		c = *dp++;
+		if (c == '\r')
+			continue;
+		if (c == '\n') {
+			putchar(c);
+			newline = 1;
+			continue;
+		}
+		newline = 0;
+		if (c & 0x80) {
+			putchar('M');
+			putchar('-');
+			c &= 0x7F;
+		}
+		if (c == 0x7F) {
+			putchar('^');
+			putchar('?');
+			continue;
+		}
+		if (c < 0x20) {
+			putchar('^');
+			c += '@';
+		}
+		putchar(c);
+	}
+	if (!newline)
+		putchar('\n');
+}
+
+static void
+l1_packet_rx()
+{
+	if (is_filter_match())
+		print_l1_trace();
+}
+
+void
+process_pkt_from_target()
+{
+	switch (rvi_msg[1]) {
+	case RVT_L1_HEADER:
+		l1_packet_rx();
+		return;
+	default:
+		fprintf(stderr, "unexpected fwd of MUX %02X from rvinterf\n",
+			rvi_msg[1]);
+		exit(ERROR_RVINTERF);
+	}
+}