FreeCalypso > hg > freecalypso-reveng
view pircharge/interf.c @ 247:1e1191fbdf90
pirelli/fw-disasm: abb_core_inth located
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Dec 2017 01:19:25 +0000 |
parents | fec90990f613 |
children |
line wrap: on
line source
/* * This module implements the link to rvinterf. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <rvinterf/localsock.h> #include <rvinterf/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(); } } void send_pkt_to_target(pkt, pktlen) u_char *pkt; { u_char hdrbuf[3]; int len1; len1 = pktlen + 1; hdrbuf[0] = len1 >> 8; hdrbuf[1] = len1 & 0xFF; hdrbuf[2] = CLI2RVI_PKT_TO_TARGET; write(sock, hdrbuf, 3); write(sock, pkt, pktlen); }