X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/d8feebc2af6d893304b40de06ea2e9820044f2f9..981fd33cfbddbf32a45f1ac333fd807e6298fa49:/usr/src/usr.bin/tip/tipout.c diff --git a/usr/src/usr.bin/tip/tipout.c b/usr/src/usr.bin/tip/tipout.c index ea55adef18..e445b9786b 100644 --- a/usr/src/usr.bin/tip/tipout.c +++ b/usr/src/usr.bin/tip/tipout.c @@ -1,4 +1,24 @@ -/* tipout.c 4.3 81/11/20 */ +/* + * Copyright (c) 1983 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef lint +static char sccsid[] = "@(#)tipout.c 5.2 (Berkeley) %G%"; +#endif /* not lint */ + #include "tip.h" /* * tip @@ -7,17 +27,18 @@ * reading from the remote host */ +static jmp_buf sigbuf; + /* * TIPOUT wait state routine -- * sent by TIPIN when it wants to posses the remote host */ intIOT() { - signal(SIGIOT, SIG_IGN); + write(repdes[1],&ccc,1); read(fildes[0], &ccc,1); - signal(SIGIOT, intIOT); - intflag = 1; + longjmp(sigbuf, 1); } /* @@ -30,9 +51,8 @@ intEMT() register char *pline = line; char reply; - signal(SIGEMT, SIG_IGN); read(fildes[0], &c, 1); - while(c != '\n') { + while (c != '\n') { *pline++ = c; read(fildes[0], &c, 1); } @@ -51,13 +71,12 @@ intEMT() } } write(repdes[1], &reply, 1); - signal(SIGEMT, intEMT); - intflag = 1; + longjmp(sigbuf, 1); } intTERM() { - signal(SIGTERM, SIG_IGN); + if (boolean(value(SCRIPT)) && fscript != NULL) fclose(fscript); exit(0); @@ -65,8 +84,9 @@ intTERM() intSYS() { - signal(SIGSYS, intSYS); + boolean(value(BEAUTIFY)) = !boolean(value(BEAUTIFY)); + longjmp(sigbuf, 1); } /* @@ -74,6 +94,12 @@ intSYS() */ tipout() { + char buf[BUFSIZ]; + register char *cp; + register int cnt; + extern int errno; + int omask; + signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGEMT, intEMT); /* attention from TIPIN */ @@ -81,19 +107,32 @@ tipout() signal(SIGIOT, intIOT); /* scripting going on signal */ signal(SIGHUP, intTERM); /* for dial-ups */ signal(SIGSYS, intSYS); /* beautify toggle */ - - while(1) { - do { - intflag = 0; - read(FD,&ch,1); - ch &= 0177; - } while(intflag); - write(1, &ch, 1); + (void) setjmp(sigbuf); + for (omask = 0;; sigsetmask(omask)) { + cnt = read(FD, buf, BUFSIZ); + if (cnt <= 0) { + /* lost carrier */ + if (cnt < 0 && errno == EIO) { + sigblock(sigmask(SIGTERM)); + intTERM(); + /*NOTREACHED*/ + } + continue; + } +#define ALLSIGS sigmask(SIGEMT)|sigmask(SIGTERM)|sigmask(SIGIOT)|sigmask(SIGSYS) + omask = sigblock(ALLSIGS); + for (cp = buf; cp < buf + cnt; cp++) + *cp &= 0177; + write(1, buf, cnt); if (boolean(value(SCRIPT)) && fscript != NULL) { - if (boolean(value(BEAUTIFY)) && ch < 040 && - !any(ch, value(EXCEPTIONS))) - continue; - putc(ch, fscript); + if (!boolean(value(BEAUTIFY))) { + fwrite(buf, 1, cnt, fscript); + continue; + } + for (cp = buf; cp < buf + cnt; cp++) + if ((*cp >= ' ' && *cp <= '~') || + any(*cp, value(EXCEPTIONS))) + putc(*cp, fscript); } } }