]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - utils/sterm.c
Add scape sequence and an option to ignore it
[can-benchmark.git] / utils / sterm.c
index a3e9786ab82fd0e3e273b0e79f81f31e7183e7f7..ee7f8d70433e64d47db376efa2925dd188bbd5ee 100644 (file)
@@ -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': {
@@ -174,9 +192,21 @@ int main(int argc, char *argv[])
                CHECK(write(tmp, pid, strlen(pid)));
                close(tmp);
                snprintf(lockfile, sizeof(lockfile), "/var/lock/LCK..%s", dev + 5);
+       retry:
                if (link(template, lockfile) == -1) {
-                       perror(lockfile);
-                       exit(1);
+                       tmp = CHECK(open(lockfile, O_RDONLY));
+                       CHECK(read(tmp, pid, sizeof(pid)));
+                       close(tmp);
+                       int p = atoi(pid);
+                       char proc[50];
+                       snprintf(proc, sizeof(proc), "/proc/%d", p);
+                       if (access(proc, F_OK) == 0) {
+                               fprintf(stderr, "%s is used by PID %d\n", dev, p);
+                               exit(1);
+                       }
+                       fprintf(stderr, "Stale lock file %s (PID %d) - removing it!\n", lockfile, p);
+                       CHECK(unlink(lockfile));
+                       goto retry;
                }
                rm_file(0, template);
                on_exit(rm_file, lockfile);
@@ -240,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);