From a6346f7b5bf6d4ccda029d881d9f62dc54e9e9bb Mon Sep 17 00:00:00 2001 From: Chris Kuethe Date: Mon, 15 Jan 2007 21:36:41 +0000 Subject: Add a pair of simpleminded utilities for capturing and replaying data on a pty. This is probably useful for developing new protocols or when gpsfake may be suspect. --- contrib/binreplay.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 contrib/binreplay.c (limited to 'contrib/binreplay.c') diff --git a/contrib/binreplay.c b/contrib/binreplay.c new file mode 100644 index 00000000..d1838e4e --- /dev/null +++ b/contrib/binreplay.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WRLEN 256 +void spinner(int); + +int main( int argc, char **argv){ + struct stat sb; + struct termios term; + char *buf, tn[32]; + int ifd, ofd, sfd, t, l, speed; + + if (argc != 3 ){ + fprintf(stderr, "usage: binreplay \n"); + return 1; + } + + speed = atoi(argv[1]); + switch (speed) { + case 230400: + case 115200: + case 57600: + case 38400: + case 28800: + case 14400: + case 9600: + case 4800: + break; + default: + fprintf(stderr, "invalid speed\n"); + return 1; + } + + if ((ifd = open(argv[2], O_RDONLY, 0444)) == -1) + err(1, "open"); + + if (fstat(ifd, &sb) == -1) + err(1, "fstat"); + + if ((buf = mmap(0, sb.st_size, PROT_READ, MAP_FILE, ifd, 0)) == MAP_FAILED) + err(1, "mmap"); + + cfmakeraw(&term); + cfsetospeed(&term, speed); + cfsetispeed(&term, speed); + if (openpty(&ofd, &sfd, tn, &term, NULL) == -1) + err(1, "openpty"); + + tcsetattr(ofd, TCSANOW, &term); + tcsetattr(sfd, TCSANOW, &term); + + chmod(tn, 0444); + printf("configured %s for %dbps\n", tn, speed); + t = 1000000 / (speed / 8); + + for(l = 0; l < sb.st_size; l += WRLEN ){ + write(ofd, buf+l, WRLEN ); + tcdrain(ofd); +// tcdrain(sfd); + tcflush(ofd, TCIFLUSH); + tcflush(sfd, TCIFLUSH); + spinner( l ); + usleep(t); + } + + munmap(buf, sb.st_size); + close(ifd); + close(ofd); + fprintf(stderr, "\010\010\010\010\010\010\010\010\010\010\010\010\n"); + return 0; +} + +void spinner(int n){ + char *s = "|/-\\"; + + if (n % (WRLEN * 4)) + return; + + n /= (WRLEN * 4); + + fprintf(stderr, "\010\010\010\010\010\010\010\010\010\010\010\010\010"); + fprintf(stderr, "%c %d", s[n%4], n); + fflush(stderr); +} + -- cgit v1.2.1