FreeCalypso > hg > freecalypso-tools
diff rvinterf/old/before-rvinterf/rvtdump.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/old/before-rvinterf/rvtdump.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,123 @@ +/* + * This program reads bytes from a serial port, parses them assuming + * TI's RVT MUX format, and prints every decoded packet. + */ + +#include <sys/types.h> +#include <sys/errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> + +extern int target_fd; +extern char *baudrate_name; + +extern char pr_item[]; +extern int sendsock_fd; + +char *logfname; +FILE *logF; +time_t logtime; +int background, sendsock_enable; + +main(argc, argv) + char **argv; +{ + extern char *optarg; + extern int optind; + int c, maxfd; + fd_set fds; + + while ((c = getopt(argc, argv, "bB:d:l:s")) != EOF) + switch (c) { + case 'b': + background++; + continue; + case 'B': + baudrate_name = optarg; + continue; + case 'd': + target_fd = atoi(optarg); + continue; + case 'l': + logfname = optarg; + continue; + case 's': + sendsock_enable++; + continue; + case '?': + default: +usage: fprintf(stderr, + "usage: %s [options] ttyport\n", argv[0]); + exit(1); + } + if (background && !logfname) { + fprintf(stderr, "%s: -b is meaningless without -l\n", argv[0]); + exit(1); + } + if (target_fd <= 0) { + if (argc - optind != 1) + goto usage; + open_target_serial(argv[optind]); + } + + set_serial_nonblock(0); + setlinebuf(stdout); + if (logfname) { + logF = fopen(logfname, "w"); + if (!logF) { + perror(logfname); + exit(1); + } + fprintf(logF, "*** Log of decoded RVT output ***\n"); + setlinebuf(logF); + } + if (sendsock_enable) + create_send_socket(); + if (background) { + c = fork(); + if (c < 0) { + perror("fork"); + exit(1); + } + if (c) { + printf("rvtdump forked into background (pid %d)\n", c); + exit(0); + } + } + maxfd = target_fd; + if (sendsock_fd > maxfd) + maxfd = sendsock_fd; + for (;;) { + FD_ZERO(&fds); + FD_SET(target_fd, &fds); + if (sendsock_enable) + FD_SET(sendsock_fd, &fds); + c = select(maxfd+1, &fds, 0, 0, 0); + time(&logtime); + if (c < 0) { + if (errno == EINTR) + continue; + perror("select"); + exit(1); + } + if (FD_ISSET(target_fd, &fds)) + process_serial_rx(); + if (FD_ISSET(sendsock_fd, &fds)) + handle_sendsock(); + } +} + +handle_rx_packet() +{ + print_rx_packet(); +} + +print_item() +{ + if (!background) + printf("%s\n", pr_item); + if (logF) + log_item(); +}