From e4650b67e773b1fc5686b20674c30a51f896cef6 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Tue, 8 Jul 2014 12:14:23 +0200 Subject: [PATCH] Add scape sequence and an option to ignore it Ignoring is useful for transfering binary files. --- utils/sterm.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/utils/sterm.c b/utils/sterm.c index e708a68..ee7f8d7 100644 --- a/utils/sterm.c +++ b/utils/sterm.c @@ -50,6 +50,7 @@ #define VERBOSE(format, ...) do { if (verbose) fprintf(stderr, format, ##__VA_ARGS__); } while (0) bool verbose = false; +bool exit_on_escape = true; char template[] = "/var/lock/TMPXXXXXX"; char lockfile[100]; @@ -89,6 +90,22 @@ 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; + } +} + int main(int argc, char *argv[]) { @@ -106,9 +123,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': { @@ -252,6 +270,8 @@ int main(int argc, char *argv[]) VERBOSE("EOF on stdin\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); -- 2.39.2