-/* 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
* 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);
}
/*
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);
}
}
}
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);
intSYS()
{
- signal(SIGSYS, intSYS);
+
boolean(value(BEAUTIFY)) = !boolean(value(BEAUTIFY));
+ longjmp(sigbuf, 1);
}
/*
*/
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 */
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);
}
}
}