diff rvinterf/etm/interf.c @ 182:13a0348ffce4

rvinterf/etm: checkpointing not-yet-compilable code
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 24 Nov 2013 06:59:09 +0000
parents
children 85222710dc92
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etm/interf.c	Sun Nov 24 06:59:09 2013 +0000
@@ -0,0 +1,72 @@
+/*
+ * This module implements the link to rvinterf.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "../localsock.h"
+
+extern int sock;
+
+u_char rvi_msg[LOCALSOCK_MAX_MSG];
+int rvi_msg_len;
+
+static int rx_state, rx_left;
+static u_char *rx_ptr;
+
+void
+localsock_prep_for_length_rx()
+{
+	rx_state = 0;
+	rx_ptr = rvi_msg;
+	rx_left = 2;
+}
+
+static void
+prep_for_message_rx()
+{
+	rx_state = 1;
+	rx_ptr = rvi_msg;
+	rx_left = rvi_msg_len;
+}
+
+void
+process_msg_from_rvinterf()
+{
+
+
+}
+
+void
+handle_rvinterf_input()
+{
+	int cc;
+
+	cc = read(sock, rx_ptr, rx_left);
+	if (cc <= 0) {
+		tty_cleanup();
+		perror("read from rvinterf socket");
+		exit(1);
+	}
+	rx_ptr += cc;
+	rx_left -= cc;
+	if (rx_left)
+		return;
+	/* got the thing, process it */
+	if (rx_state) {
+		process_msg_from_rvinterf();
+		localsock_prep_for_length_rx();
+	} else {
+		rvi_msg_len = rvi_msg[0] << 8 | rvi_msg[1];
+		if (rvi_msg_len < 1 || rvi_msg_len > LOCALSOCK_MAX_MSG) {
+			tty_cleanup();
+			fprintf(stderr,
+				"Invalid length from rvinterf: %02X%02X\n",
+				rvi_msg[0], rvi_msg[1]);
+			exit(1);
+		}
+		prep_for_message_rx();
+	}
+}