summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2012-01-28 20:45:47 +0000
committerphk <phk@FreeBSD.org>2012-01-28 20:45:47 +0000
commita433ea32c05cb790d05087cb08365da0c46ed89e (patch)
treecc0bfdf9c50c598ca4313a8492827d1c190399ff
parent145048562133356607edaba1a7cea047d967feea (diff)
downloadFreeBSD-src-a433ea32c05cb790d05087cb08365da0c46ed89e.zip
FreeBSD-src-a433ea32c05cb790d05087cb08365da0c46ed89e.tar.gz
Make tip exit if the device disappears, for instance when unplugging
or resetting USB serial devices. Somebody[tm] should rewrite tip(1) to use two thread instead of two processes or maybe even use that new-fangled "select(2)" or positively futuristic "poll(2)" system call.
-rw-r--r--usr.bin/tip/tip/tip.c2
-rw-r--r--usr.bin/tip/tip/tipout.c5
2 files changed, 4 insertions, 3 deletions
diff --git a/usr.bin/tip/tip/tip.c b/usr.bin/tip/tip/tip.c
index 058a99b..066d679 100644
--- a/usr.bin/tip/tip/tip.c
+++ b/usr.bin/tip/tip/tip.c
@@ -584,7 +584,7 @@ parwrite(int fd, char *buf, size_t n)
bp++;
}
if (write(fd, buf, n) < 0) {
- if (errno == EIO)
+ if (errno == EIO || errno == ENXIO)
tipabort("Lost carrier.");
/* this is questionable */
perror("write");
diff --git a/usr.bin/tip/tip/tipout.c b/usr.bin/tip/tip/tipout.c
index 3dff3bd..db6afe4 100644
--- a/usr.bin/tip/tip/tipout.c
+++ b/usr.bin/tip/tip/tipout.c
@@ -148,11 +148,12 @@ tipout(void)
scnt = read(FD, buf, BUFSIZ);
if (scnt <= 0) {
/* lost carrier */
- if (scnt == 0 || (scnt < 0 && errno == EIO)) {
+ if (scnt == 0 ||
+ (scnt < 0 && (errno == EIO || errno == ENXIO))) {
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
sigprocmask(SIG_BLOCK, &mask, NULL);
- intTERM(0);
+ intTERM(SIGHUP);
/*NOTREACHED*/
}
continue;
OpenPOWER on IntegriCloud