recognize and handle carrier loss
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 9 Oct 1983 05:58:41 +0000 (21:58 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 9 Oct 1983 05:58:41 +0000 (21:58 -0800)
SCCS-vsn: usr.bin/tip/acu.c 4.11
SCCS-vsn: usr.bin/tip/cmds.c 4.13
SCCS-vsn: usr.bin/tip/tip.c 4.17
SCCS-vsn: usr.bin/tip/tipout.c 4.9

usr/src/usr.bin/tip/acu.c
usr/src/usr.bin/tip/cmds.c
usr/src/usr.bin/tip/tip.c
usr/src/usr.bin/tip/tipout.c

index 0ee72b7..4e416e3 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)acu.c      4.10 (Berkeley) %G%";
+static char sccsid[] = "@(#)acu.c      4.11 (Berkeley) %G%";
 #endif
 
 #include "tip.h"
 #endif
 
 #include "tip.h"
@@ -52,7 +52,7 @@ connect()
                if (acu != NOACU) {
                        boolean(value(VERBOSE)) = FALSE;
                        if (conflag)
                if (acu != NOACU) {
                        boolean(value(VERBOSE)) = FALSE;
                        if (conflag)
-                               disconnect();
+                               disconnect(NOSTR);
                        else
                                (*acu->acu_abort)();
                }
                        else
                                (*acu->acu_abort)();
                }
@@ -121,13 +121,17 @@ connect()
        return (tried ? "call failed" : "missing phone number");
 }
 
        return (tried ? "call failed" : "missing phone number");
 }
 
-disconnect()
+disconnect(reason)
+       char *reason;
 {
        if (!conflag)
                return;
 {
        if (!conflag)
                return;
-       logent(value(HOST), "", acu->acu_name, "call terminated");
-       if (boolean(value(VERBOSE)))
-               printf("\r\ndisconnecting...");
+       if (reason != NOSTR) {
+               logent(value(HOST), "", acu->acu_name, "call terminated");
+               if (boolean(value(VERBOSE)))
+                       printf("\r\ndisconnecting...");
+       } else 
+               logent(value(HOST), "", acu->acu_name, reason);
        (*acu->acu_disconnect)();
 }
 
        (*acu->acu_disconnect)();
 }
 
index 575b780..f4911a1 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)cmds.c     4.12 (Berkeley) %G%";
+static char sccsid[] = "@(#)cmds.c     4.13 (Berkeley) %G%";
 #endif
 
 #include "tip.h"
 #endif
 
 #include "tip.h"
@@ -539,22 +539,31 @@ chdirectory()
        printf("!\r\n");
 }
 
        printf("!\r\n");
 }
 
-finish()
+abort(msg)
+       char *msg;
 {
 {
-       char *dismsg;
 
 
-       if ((dismsg = value(DISCONNECT)) != NOSTR) {
-               write(FD,dismsg,strlen(dismsg));
-               sleep(5);
-       }
        kill(pid, SIGTERM);
        kill(pid, SIGTERM);
-       disconnect();
+       disconnect(msg);
+       if (msg != NOSTR)
+               printf("\r\n%s", msg);
        printf("\r\n[EOT]\r\n");
        delock(uucplock);
        unraw();
        exit(0);
 }
 
        printf("\r\n[EOT]\r\n");
        delock(uucplock);
        unraw();
        exit(0);
 }
 
+finish()
+{
+       char *dismsg;
+
+       if ((dismsg = value(DISCONNECT)) != NOSTR) {
+               write(FD, dismsg, strlen(dismsg));
+               sleep(5);
+       }
+       abort(NOSTR);
+}
+
 intcopy()
 {
 
 intcopy()
 {
 
index f328b80..dc2efae 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)tip.c      4.16 (Berkeley) %G%";
+static char sccsid[] = "@(#)tip.c      4.17 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -451,13 +451,19 @@ pwrite(fd, buf, n)
 {
        register int i;
        register char *bp;
 {
        register int i;
        register char *bp;
+       extern int errno;
 
        bp = buf;
        for (i = 0; i < n; i++) {
                *bp = partab[(*bp) & 0177];
                bp++;
        }
 
        bp = buf;
        for (i = 0; i < n; i++) {
                *bp = partab[(*bp) & 0177];
                bp++;
        }
-       write(fd, buf, n);
+       if (write(fd, buf, n) < 0) {
+               if (errno == EIO)
+                       abort("Lost carrier.");
+               /* this is questionable */
+               perror("write");
+       }
 }
 
 /*
 }
 
 /*
index de7aa7c..a45e7bb 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)tipout.c   4.8 (Berkeley) %G%";
+static char sccsid[] = "@(#)tipout.c   4.9 (Berkeley) %G%";
 #endif
 
 #include "tip.h"
 #endif
 
 #include "tip.h"
@@ -80,6 +80,7 @@ tipout()
        char buf[BUFSIZ];
        register char *cp;
        register int cnt;
        char buf[BUFSIZ];
        register char *cp;
        register int cnt;
+       extern int errno;
        int omask;
 
        signal(SIGINT, SIG_IGN);
        int omask;
 
        signal(SIGINT, SIG_IGN);
@@ -92,9 +93,16 @@ tipout()
        (void) setjmp(sigbuf);
        for (omask = 0;; sigsetmask(omask)) {
                cnt = read(FD, buf, BUFSIZ);
        (void) setjmp(sigbuf);
        for (omask = 0;; sigsetmask(omask)) {
                cnt = read(FD, buf, BUFSIZ);
-               if (cnt <= 0)
-                       continue;
+               if (cnt <= 0) {
+                       /* lost carrier */
+                       if (cnt < 0 && errno == EIO) {
 #define        mask(s) (1 << ((s) - 1))
 #define        mask(s) (1 << ((s) - 1))
+                               sigblock(mask(SIGTERM));
+                               intTERM();
+                               /*NOTREACHED*/
+                       }
+                       continue;
+               }
 #define        ALLSIGS mask(SIGEMT)|mask(SIGTERM)|mask(SIGIOT)|mask(SIGSYS)
                omask = sigblock(ALLSIGS);
                for (cp = buf; cp < buf + cnt; cp++)
 #define        ALLSIGS mask(SIGEMT)|mask(SIGTERM)|mask(SIGIOT)|mask(SIGSYS)
                omask = sigblock(ALLSIGS);
                for (cp = buf; cp < buf + cnt; cp++)