X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/5edad1549c82ef1f634b9d92052b4a3138f39469..982e490cbf0d9dafd25393580c31b149a2ad71e1:/utils/sterm.c diff --git a/utils/sterm.c b/utils/sterm.c index e708a68..0e124e5 100644 --- a/utils/sterm.c +++ b/utils/sterm.c @@ -47,9 +47,10 @@ #define CHECK(cmd) ({ int ret = (cmd); if (ret == -1) { perror(#cmd " line " TOSTRING(__LINE__)); exit(1); }; ret; }) #define CHECKPTR(cmd) ({ void *ptr = (cmd); if (ptr == (void*)-1) { perror(#cmd " line " TOSTRING(__LINE__)); exit(1); }; ptr; }) -#define VERBOSE(format, ...) do { if (verbose) fprintf(stderr, format, ##__VA_ARGS__); } while (0) +#define VERBOSE(format, ...) do { if (verbose) fprintf(stderr, "sterm: " format, ##__VA_ARGS__); } while (0) bool verbose = false; +bool exit_on_escape = true; char template[] = "/var/lock/TMPXXXXXX"; char lockfile[100]; @@ -89,6 +90,33 @@ int dtr_rts_arg(const char option) return val; } +void exit_on_escapeseq(const char *buf, int len) +{ + static const char escseq[] = "\r~."; + static const char *state = escseq+1; + int i; + + for (i = 0; i < len; i++) { + if (buf[i] == *state) { + state++; + if (*state == 0) + exit(0); + } else + state = escseq; + } +} + +void usage(const char* argv0) +{ + fprintf(stderr, "Usage: %s [options] \n", argv0); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -d [+|-] create short positive/negative pulse on DTR\n"); + fprintf(stderr, " -e ignore '~.' escape sequence\n"); + fprintf(stderr, " -n do not switch the device to raw mode\n"); + fprintf(stderr, " -r [+|-] create short positive/negative pulse on RTS\n"); + fprintf(stderr, " -s \n"); + fprintf(stderr, " -v verbose\n"); +} int main(int argc, char *argv[]) { @@ -106,9 +134,10 @@ int main(int argc, char *argv[]) atexit(restore_stdin_term); } - while ((opt = getopt(argc, argv, "nd::r::s:v")) != -1) { + while ((opt = getopt(argc, argv, "nd::er::s:v")) != -1) { switch (opt) { case 'd': dtr = dtr_rts_arg(opt); break; + case 'e': exit_on_escape = false; break; case 'n': raw = false; break; case 'r': rts = dtr_rts_arg(opt); break; case 's': { @@ -145,7 +174,7 @@ int main(int argc, char *argv[]) verbose = true; break; default: /* '?' */ - fprintf(stderr, "Usage: %s [-s baudrate] [-v] \n", argv[0]); + usage(argv[0]); exit(1); } } @@ -155,6 +184,7 @@ int main(int argc, char *argv[]) if (!dev) { fprintf(stderr, "No device specified\n"); + usage(argv[0]); exit(1); } @@ -242,16 +272,21 @@ int main(int argc, char *argv[]) CHECK(tcsetattr(0, TCSANOW, &tio)); } - VERBOSE("Connected.\n"); + VERBOSE("Connected.\r\n"); + if (exit_on_escape) + VERBOSE("Use '~.' sequence to exit.\r\n"); + while (1) { int r1, r2; CHECK(poll(fds, 2, -1)); if (fds[0].revents & POLLIN) { r1 = CHECK(read(0, buf, sizeof(buf))); if (r1 == 0) { - VERBOSE("EOF on stdin\n"); + VERBOSE("EOF on stdin\r\n"); break; } + if (exit_on_escape) + exit_on_escapeseq(buf, r1); r2 = CHECK(write(fd, buf, r1)); if (r1 != r2) { fprintf(stderr, "Not all data written to %s (%d/%d)\n", dev, r1, r2); @@ -261,7 +296,7 @@ int main(int argc, char *argv[]) if (fds[1].revents & POLLIN) { r1 = CHECK(read(fd, buf, sizeof(buf))); if (r1 == 0) { - VERBOSE("EOF on %s\n", dev); + VERBOSE("EOF on %s\r\n", dev); break; } r2 = CHECK(write(1, buf, r1));