This patch addresses a few long-standing bugs and usability issues. Retries have been corrected (previously if rdbfs had to retry, it would always fail). Setting the baudrate for the underlying serial console has also been made optional. Forcing the baudrate to 9600 causes issues on systems that default to a different value. Status was changed such that rdbfs processes now show up in the Broken state with a meaningful user and name. A note file was also added to send a serial break on a kill note. Reference: /n/sources/patch/maybe/rdbfs-retry-speed-broken Date: Thu Jul 4 22:48:04 CES 2013 Signed-off-by: sstallion@gmail.com --- /sys/man/4/rdbfs Mon Aug 12 08:07:16 2013 +++ /sys/man/4/rdbfs Mon Aug 12 08:07:03 2013 @@ -7,6 +7,10 @@ .B -d ] [ +.B -b +.I baudrate +] +[ .B -p .I pid ] @@ -31,7 +35,10 @@ a kernel over the serial line .I device (default -.BR /dev/eia0 ). +.BR /dev/eia0 ), +optionally setting the baudrate if the +.B -b +option is specified. If the .B -s option is given, --- /sys/src/cmd/rdbfs.c Thu Jul 4 11:19:35 2013 +++ /sys/src/cmd/rdbfs.c Thu Dec 5 21:51:35 2013 @@ -124,6 +124,7 @@ Xfpregs, Xkregs, Xmem, + Xnote, Xproc, Xregs, Xtext, @@ -134,6 +135,8 @@ int textfd; int rfd; Biobuf rfb; +int cfd; +char* baudrate; char* portname = "/dev/eia0"; char* textfile = "/386/9pc"; char* procname = "1"; @@ -143,10 +146,21 @@ void usage(void) { - fprint(2, "usage: rdbfs [-p procnum] [-s srvname] [-t textfile] [serialport]\n"); + fprint(2, "usage: rdbfs [-b baudrate] [-p procnum] [-s srvname] [-t textfile] [serialport]\n"); exits("usage"); } +char * +basename(char *s) +{ + char *p; + + p = strrchr(s, '/'); + if(p == nil) + return p; + return p+1; +} + void noalarm(void*, char *msg) { @@ -224,9 +238,11 @@ goto Break2; }else{ DBG(2, "unknown message\n"); + break; } } } + respond(r, "timed out"); Break2:; } } @@ -234,7 +250,6 @@ void attachremote(char* name) { - int fd; char buf[128]; print("attach %s\n", name); @@ -243,11 +258,13 @@ sysfatal("can't open remote %s", name); sprint(buf, "%sctl", name); - fd = open(buf, OWRITE); - if(fd < 0) - sysfatal("can't set baud rate on %s", buf); - write(fd, "B9600", 6); - close(fd); + cfd = open(buf, OWRITE); + if(cfd < 0) + sysfatal("can't open ctl %s", buf); + + if(baudrate) + fprint(cfd, "b%s", baudrate); + Binit(&rfb, rfd, OREAD); } @@ -301,7 +318,7 @@ respond(r, nil); break; case Xstatus: - n = sprint(buf, "%-28s%-28s%-28s", "remote", "system", "New"); + n = sprint(buf, "%-28s%-28s%-28s", basename(portname), getuser(), "Broken"); for(i = 0; i < 9; i++) n += sprint(buf+n, "%-12d", 0); readstr(r, buf); @@ -317,13 +334,15 @@ { char buf[ERRMAX]; + r->ofcall.count = r->ifcall.count; switch((uintptr)r->fid->file->aux) { case Xctl: + case Xnote: if(strncmp(r->ifcall.data, "kill", 4) == 0 || strncmp(r->ifcall.data, "exit", 4) == 0) { + fprint(cfd, "k"); respond(r, nil); - postnote(PNGROUP, getpid(), "umount"); - exits(nil); + threadexitsall(nil); }else if(strncmp(r->ifcall.data, "refresh", 7) == 0){ flushcache(); respond(r, nil); @@ -362,6 +381,7 @@ "fpregs", Xfpregs, 0666, "kregs", Xkregs, 0666, "mem", Xmem, 0666, + "note", Xnote, 0222, "proc", Xproc, 0444, "regs", Xregs, 0666, "text", Xtext, 0444, @@ -392,6 +412,9 @@ case 'D': chatty9p++; break; + case 'b': + baudrate = EARGF(usage()); + break; case 'd': dbg = 1; break; @@ -434,4 +457,3 @@ threadpostmountsrv(&fs, srvname, "/proc", MBEFORE); exits(0); } -