FreeCalypso > hg > freecalypso-tools
diff rvinterf/l1filter/rvif_rx.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/libasync/interf.c@09b4fd9b3827 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/l1filter/rvif_rx.c Tue Nov 09 23:14:22 2021 +0000 @@ -0,0 +1,88 @@ +/* + * This module implements message Rx from rvinterf. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include "localsock.h" +#include "exitcodes.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() +{ + switch (rvi_msg[0]) { + case RVI2CLI_PKT_FROM_TARGET: + process_pkt_from_target(); + return; + case RVI2CLI_LOCAL_CMD_RESP: + if (rvi_msg_len < 2) + goto bad; + if (rvi_msg[1] == '+') + return; + fprintf(stderr, "Error from rvinterf: %.*s\n", rvi_msg_len - 1, + rvi_msg + 1); + exit(ERROR_RVINTERF); + default: + bad: + fprintf(stderr, + "Error: unexpected message type %02X from rvinterf\n", + rvi_msg[0]); + exit(ERROR_RVINTERF); + } +} + +void +handle_rvinterf_input() +{ + int cc; + + cc = read(sock, rx_ptr, rx_left); + if (cc <= 0) { + perror("read from rvinterf socket"); + exit(ERROR_RVINTERF); + } + 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) { + fprintf(stderr, + "Invalid length from rvinterf: %02X%02X\n", + rvi_msg[0], rvi_msg[1]); + exit(ERROR_RVINTERF); + } + prep_for_message_rx(); + } +}