/*---------------------------------------------------------------------------*/ static void slip_input_callback(void) { PRINTF("SR-SIN: %u '%c%c'\n", uip_len, uip_buf[0], uip_buf[1]); cmd_input(uip_buf, uip_len); uip_len = 0; }
void command_parse(const u08 *cmd, u08 len) { u08 result = 0; switch(cmd[0]) { case 'c': result = cmd_color(cmd,len); break; case 'f': result = cmd_flags(cmd, len); break; case 'd': result = cmd_draw(cmd, len); break; case 'g': result = cmd_goto(cmd, len); break; case 'e': result = cmd_erase(cmd, len); break; case 's': /* do nothing - only return status */ result = CMD_OK; break; case 'q': result = cmd_query(cmd, len); break; case 'i': result = cmd_input(cmd, len); break; case 'p': result = cmd_picture(cmd, len); break; case 'y': result = cmd_display(cmd, len); break; default: result = CMD_UNKNOWN_ERR; break; } // report status back if(result != CMD_NO_REPLY) { cmd_status(result); } }
/* * Read from serial, when we have a packet call slip_packet_input. No output * buffering, input buffered by stdio. */ void serial_input(FILE *inslip) { static union { unsigned char inbuf[2000]; } uip; static int inbufptr = 0; int ret,i; unsigned char c; #ifdef linux ret = fread(&c, 1, 1, inslip); if(ret == -1 || ret == 0) err(1, "serial_input: read"); goto after_fread; #endif read_more: if(inbufptr >= sizeof(uip.inbuf)) { fprintf(stderr, "*** dropping large %d byte packet\n", inbufptr); inbufptr = 0; } ret = fread(&c, 1, 1, inslip); #ifdef linux after_fread: #endif if(ret == -1) { err(1, "serial_input: read"); } if(ret == 0) { clearerr(inslip); return; } slip_received++; switch(c) { case SLIP_END: if(inbufptr > 0) { if(uip.inbuf[0] == '!') { cmd_input(uip.inbuf, inbufptr); } else if(uip.inbuf[0] == '?') { #define DEBUG_LINE_MARKER '\r' } else if(uip.inbuf[0] == DEBUG_LINE_MARKER) { fwrite(uip.inbuf + 1, inbufptr - 1, 1, stdout); } else if(is_sensible_string(uip.inbuf, inbufptr)) { if(slip_config_verbose == 1) { /* strings already echoed below for verbose>1 */ fwrite(uip.inbuf, inbufptr, 1, stdout); } } else { if(slip_config_verbose > 2) { printf("Packet from SLIP of length %d - write TUN\n", inbufptr); if(slip_config_verbose > 4) { #if WIRESHARK_IMPORT_FORMAT printf("0000"); for(i = 0; i < inbufptr; i++) printf(" %02x", uip.inbuf[i]); #else printf(" "); for(i = 0; i < inbufptr; i++) { printf("%02x", uip.inbuf[i]); if((i & 3) == 3) printf(" "); if((i & 15) == 15) printf("\n "); } #endif printf("\n"); } } slip_packet_input(uip.inbuf, inbufptr); } inbufptr = 0; } break; case SLIP_ESC: if(fread(&c, 1, 1, inslip) != 1) { clearerr(inslip); /* Put ESC back and give up! */ ungetc(SLIP_ESC, inslip); return; } switch(c) { case SLIP_ESC_END: c = SLIP_END; break; case SLIP_ESC_ESC: c = SLIP_ESC; break; } /* FALLTHROUGH */ default: uip.inbuf[inbufptr++] = c; /* Echo lines as they are received for verbose=2,3,5+ */ /* Echo all printable characters for verbose==4 */ if(slip_config_verbose == 4) { if(c == 0 || c == '\r' || c == '\n' || c == '\t' || (c >= ' ' && c <= '~')) { fwrite(&c, 1, 1, stdout); } } else if(slip_config_verbose >= 2) { if(c == '\n' && is_sensible_string(uip.inbuf, inbufptr)) { fwrite(uip.inbuf, inbufptr, 1, stdout); inbufptr = 0; } } break; } goto read_more; }
/* * Read from serial, when we have a packet call slip_packet_input. No output * buffering, input buffered by stdio. */ void serial_input(FILE * inslip) { static unsigned char inbuf[2048]; static int inbufptr = 0; int ret, i; unsigned char c; #ifdef linux ret = fread(&c, 1, 1, inslip); if(ret == -1 || ret == 0) { LOG6LBR_FATAL("read() : %s\n", strerror(errno)); exit(1); } goto after_fread; #endif read_more: if(inbufptr >= sizeof(inbuf)) { LOG6LBR_ERROR("*** dropping large %d byte packet\n", inbufptr); inbufptr = 0; } ret = fread(&c, 1, 1, inslip); #ifdef linux after_fread: #endif if(ret == -1) { LOG6LBR_FATAL("read() : %s\n", strerror(errno)); exit(1); } if(ret == 0) { clearerr(inslip); return; } slip_received++; switch (c) { case SLIP_END: if(inbufptr > 0) { slip_message_received++; LOG6LBR_PRINTF(PACKET, SLIP_IN, "read: %d\n", inbufptr); if (LOG6LBR_COND(DUMP, SLIP_IN)) { printf(" "); for(i = 0; i < inbufptr; i++) { printf("%02x", inbuf[i]); if((i & 3) == 3) printf(" "); if((i & 15) == 15) printf("\n "); } printf("\n"); } if(inbuf[0] == '!') { command_context = CMD_CONTEXT_RADIO; cmd_input(inbuf, inbufptr); } else if(inbuf[0] == '?') { } else if(inbuf[0] == DEBUG_LINE_MARKER) { LOG6LBR_WRITE(INFO, SLIP_DBG, inbuf + 1, inbufptr - 1); } else if(inbuf[0] == 'E' && is_sensible_string(inbuf, inbufptr) ) { LOG6LBR_WRITE(ERROR, GLOBAL, inbuf + 1, inbufptr - 1); LOG6LBR_APPEND(ERROR, GLOBAL, "\n"); } else if(is_sensible_string(inbuf, inbufptr)) { LOG6LBR_WRITE(INFO, SLIP_DBG, inbuf, inbufptr); } else { slip_packet_input(inbuf, inbufptr); } inbufptr = 0; } break; case SLIP_ESC: if(fread(&c, 1, 1, inslip) != 1) { clearerr(inslip); /* Put ESC back and give up! */ ungetc(SLIP_ESC, inslip); return; } switch (c) { case SLIP_ESC_END: c = SLIP_END; break; case SLIP_ESC_ESC: c = SLIP_ESC; break; } /* FALLTHROUGH */ default: inbuf[inbufptr++] = c; break; } goto read_more; }