Annotation of src/usr.bin/tip/tipout.c, Revision 1.1.1.1
1.1 deraadt 1: /* $NetBSD: tipout.c,v 1.3 1994/12/08 09:31:12 jtc Exp $ */
2:
3: /*
4: * Copyright (c) 1983, 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by the University of
18: * California, Berkeley and its contributors.
19: * 4. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: */
35:
36: #ifndef lint
37: #if 0
38: static char sccsid[] = "@(#)tipout.c 8.1 (Berkeley) 6/6/93";
39: #endif
40: static char rcsid[] = "$NetBSD: tipout.c,v 1.3 1994/12/08 09:31:12 jtc Exp $";
41: #endif /* not lint */
42:
43: #include "tip.h"
44: /*
45: * tip
46: *
47: * lower fork of tip -- handles passive side
48: * reading from the remote host
49: */
50:
51: static jmp_buf sigbuf;
52:
53: /*
54: * TIPOUT wait state routine --
55: * sent by TIPIN when it wants to posses the remote host
56: */
57: void
58: intIOT()
59: {
60:
61: write(repdes[1],&ccc,1);
62: read(fildes[0], &ccc,1);
63: longjmp(sigbuf, 1);
64: }
65:
66: /*
67: * Scripting command interpreter --
68: * accepts script file name over the pipe and acts accordingly
69: */
70: void
71: intEMT()
72: {
73: char c, line[256];
74: register char *pline = line;
75: char reply;
76:
77: read(fildes[0], &c, 1);
78: while (c != '\n') {
79: *pline++ = c;
80: read(fildes[0], &c, 1);
81: }
82: *pline = '\0';
83: if (boolean(value(SCRIPT)) && fscript != NULL)
84: fclose(fscript);
85: if (pline == line) {
86: boolean(value(SCRIPT)) = FALSE;
87: reply = 'y';
88: } else {
89: if ((fscript = fopen(line, "a")) == NULL)
90: reply = 'n';
91: else {
92: reply = 'y';
93: boolean(value(SCRIPT)) = TRUE;
94: }
95: }
96: write(repdes[1], &reply, 1);
97: longjmp(sigbuf, 1);
98: }
99:
100: void
101: intTERM()
102: {
103:
104: if (boolean(value(SCRIPT)) && fscript != NULL)
105: fclose(fscript);
106: exit(0);
107: }
108:
109: void
110: intSYS()
111: {
112:
113: boolean(value(BEAUTIFY)) = !boolean(value(BEAUTIFY));
114: longjmp(sigbuf, 1);
115: }
116:
117: /*
118: * ****TIPOUT TIPOUT****
119: */
120: tipout()
121: {
122: char buf[BUFSIZ];
123: register char *cp;
124: register int cnt;
125: extern int errno;
126: int omask;
127:
128: signal(SIGINT, SIG_IGN);
129: signal(SIGQUIT, SIG_IGN);
130: signal(SIGEMT, intEMT); /* attention from TIPIN */
131: signal(SIGTERM, intTERM); /* time to go signal */
132: signal(SIGIOT, intIOT); /* scripting going on signal */
133: signal(SIGHUP, intTERM); /* for dial-ups */
134: signal(SIGSYS, intSYS); /* beautify toggle */
135: (void) setjmp(sigbuf);
136: for (omask = 0;; sigsetmask(omask)) {
137: cnt = read(FD, buf, BUFSIZ);
138: if (cnt <= 0) {
139: /* lost carrier */
140: if (cnt < 0 && errno == EIO) {
141: sigblock(sigmask(SIGTERM));
142: intTERM();
143: /*NOTREACHED*/
144: }
145: continue;
146: }
147: #define ALLSIGS sigmask(SIGEMT)|sigmask(SIGTERM)|sigmask(SIGIOT)|sigmask(SIGSYS)
148: omask = sigblock(ALLSIGS);
149: for (cp = buf; cp < buf + cnt; cp++)
150: *cp &= 0177;
151: write(1, buf, cnt);
152: if (boolean(value(SCRIPT)) && fscript != NULL) {
153: if (!boolean(value(BEAUTIFY))) {
154: fwrite(buf, 1, cnt, fscript);
155: continue;
156: }
157: for (cp = buf; cp < buf + cnt; cp++)
158: if ((*cp >= ' ' && *cp <= '~') ||
159: any(*cp, value(EXCEPTIONS)))
160: putc(*cp, fscript);
161: }
162: }
163: }