|
|
1.1 root 1: #include <sys/types.h>
2: #ifdef BSD
3: #include <sgtty.h>
4: #include <setjmp.h>
5: #include <errno.h>
6: #else
7: #include <sys/stream.h>
8: #include <sys/ioctl.h>
9:
10: extern int tty_ld, mesg_ld;
11: static struct ttydevb devmodes;
12: #endif BSD
13: #include <signal.h>
14: #include "jerq.h"
15:
16: static char umesgf[]= "/dev/pt/pt109";
17: static char *shell;
18: static struct sgttyb sttymodes;
19: static struct tchars tcharmodes;
20: int childid;
21:
22: extern char *getenv();
23:
24: dsegment(b, p, q, f, linetype)
25: Bitmap *b;
26: Point p, q;
27: char *linetype;
28: {
29: #ifdef X11
30: if (linetype) {
31: XSetLineAttributes(dpy,gc,0,LineDoubleDash,CapButt,JoinMiter);
32: XSetDashes(dpy,gc,0, linetype, strlen(linetype));
33: }
34: #endif X11
35: segment(b,p,q,f);
36: #ifdef X11
37: if (linetype)
38: XSetLineAttributes(dpy,gc,0,LineSolid,CapButt,JoinMiter);
39: #endif X11
40: }
41:
42: #ifdef BSD
43: startshell()
44: {
45: if((shell=getenv("SHELL")) == 0)
46: shell="sh";
47: if (doshell() < 0)
48: exit(1);
49: }
50: #else
51: startshell()
52: {
53: if((shell=getenv("SHELL")) == 0)
54: shell="sh";
55: if (ioctl(3, TIOCGETP, &sttymodes) == -1)
56: readmodes();
57: else {
58: ioctl(3, TIOCGDEV, &devmodes);
59: ioctl(3, TIOCGETC, &tcharmodes);
60: }
61: if (doshell() < 0)
62: exit(1);
63: }
64:
65: readmodes()
66: {
67: char filename[256], *p;
68: int fd;
69:
70: if((p=getenv("HOME")) == 0)
71: exit(1);
72: strcpy(filename, p);
73: strcat(filename, "/.sttymodes");
74: if ((fd = open(filename, 0)) < 0)
75: exit(1);
76: read(fd, &sttymodes, sizeof(struct sgttyb));
77: read(fd, &devmodes, sizeof(struct ttydevb));
78: read(fd, &tcharmodes, sizeof(struct tchars));
79: close(fd);
80: }
81: #endif BSD
82:
83: #ifndef BSD
84: /*
85: * Unpack a message
86: */
87: rcvfill()
88: {
89: register struct mesg *mp;
90: register int size;
91: char buf[1024];
92: int i, n;
93: register char *bp;
94:
95: n = read(0, buf, sizeof(buf));
96: bp = buf;
97: mp = (struct mesg *)bp;
98: size = mp->losize + (mp->hisize<<8);
99: if(n<=0)
100: mp->type=M_HANGUP;
101: switch (mp->type) {
102: case M_HANGUP:
103: exit(1);
104: case M_DELAY:
105: default:
106: return;
107: case M_DELIM:
108: case M_DATA:
109: if(size==0)
110: return;
111: break;
112: case M_IOCTL:
113: mp->type = M_IOCACK;
114: switch (*(int *)(bp+MSGHLEN)) {
115: case TIOCSETP:
116: case TIOCSETN:
117: sttymodes = *(struct sgttyb *)(bp+MSGHLEN+sizeof(int)); size = 0;
118: break;
119: case TIOCGETP:
120: *(struct sgttyb *)(bp+MSGHLEN+sizeof(int)) = sttymodes;
121: size=sizeof(struct sgttyb)+sizeof(int);
122: break;
123: case TIOCSETC:
124: tcharmodes = *(struct tchars *)(bp+MSGHLEN+sizeof(int));
125: size=0;
126: break;
127: case TIOCGETC:
128: *(struct tchars *)(bp+MSGHLEN+sizeof(int)) = tcharmodes;
129: size=sizeof (struct tchars) + sizeof (int);
130: break;
131: case TIOCSDEV:
132: size=0;
133: break;
134: case TIOCGDEV:
135: size=sizeof(struct ttydevb)+sizeof(int);
136: *(struct ttydevb *)(bp+MSGHLEN+sizeof(int))=devmodes;
137: break;
138: default:
139: mp->type = M_IOCNAK;
140: size = 0;
141: }
142: mp->magic = MSGMAGIC; /* safety net */
143: mp->losize = size;
144: mp->hisize = size>>8;
145: write(1, bp, MSGHLEN+size);
146: return;
147: }
148: bp += MSGHLEN;
149: rcvbfill(bp, size);
150: }
151:
152: sendchar(c)
153: {
154: unsigned char uc = c;
155:
156: wrmesgb(&uc, 1);
157: delim();
158: }
159:
160: sendnchars(n, cp)
161: char *cp;
162: {
163: wrmesgb(cp, n);
164: }
165:
166: wrmesgb(cp, n)
167: register char *cp;
168: int n;
169: {
170: char wrbuf[128+MSGHLEN];
171: register char *bp;
172: register struct mesg *mp;
173: register int i;
174:
175: mp = (struct mesg *)wrbuf;
176: mp->type=M_DATA;
177: mp->magic=MSGMAGIC;
178: mp->losize=n;
179: mp->hisize=n>>8;
180: if (n <= 128) {
181: bp=wrbuf+MSGHLEN;
182: i=n;
183: while(i--)
184: *bp++= *cp++;
185: write(1, wrbuf, MSGHLEN+n);
186: } else {
187: write(1, wrbuf, MSGHLEN);
188: write(1, cp, n);
189: }
190: }
191:
192: delim()
193: {
194: struct mesg delbuf;
195:
196: delbuf.type=M_DELIM;
197: delbuf.magic=MSGMAGIC;
198: delbuf.losize=0;
199: delbuf.hisize=0;
200: write(1, (char *)&delbuf, MSGHLEN);
201: }
202:
203: doshell()
204: {
205: register fd, slave;
206: if((fd=ptopen(umesgf))<0){
207: return -1;
208: }
209: if((slave=open(umesgf, 2))==-1){
210: close(fd);
211: return -1;
212: }
213: if(ioctl(fd, FIOPUSHLD, &mesg_ld) == -1){
214: close(slave);
215: close(fd);
216: return -1;
217: }
218: if(ioctl(slave, FIOPUSHLD, &tty_ld) == -1){
219: close(slave);
220: close(fd);
221: return -1;
222: }
223:
224: switch(childid = fork()){
225: case 0:
226: /* close every file descriptor in sight, and then some */
227: for(fd=0; fd<10; fd++)
228: if(fd!=slave)
229: close(fd);
230: dup(slave); dup(slave); dup(slave); dup(slave);
231: close(slave);
232: ioctl (0, TIOCSETP, (char *)&sttymodes);
233: ioctl (0, TIOCSETC, (char *)&tcharmodes);
234: ioctl(0, TIOCSPGRP, 0);
235: signal(SIGPIPE, (int (*)())0);
236: execlp(shell, shell, 0);
237: perror(shell);
238: exit(1);
239: break;
240: case -1:
241: close(fd);
242: return -1;
243: }
244: close(slave);
245: close(0); close(1);
246: dup(fd); dup(fd);
247: return(fd);
248: }
249: #endif BSD
250:
251: #ifdef BSD
252: static jmp_buf env;
253: hungtty()
254: {
255: longjmp(env, 1);
256: }
257:
258: doshell()
259: {
260: static struct ltchars ltc;
261: int discipline;
262: long lmode;
263: int tty, pgrp, slave;
264: register fd, i;
265:
266: for(i = 0; i < NSIG; i++)
267: signal(i, SIG_DFL);
268:
269: tty = open ("/dev/tty", 2);
270: ioctl(tty, TIOCGETP, (char *)&sttymodes);
271: ioctl(tty, TIOCGETC, (char *)&tcharmodes);
272: ioctl(tty, TIOCGETD, (char *)&discipline);
273: ioctl(tty, TIOCGLTC, (char *)<c);
274: ioctl(tty, TIOCLGET, (char *)&lmode);
275: ioctl(tty, TIOCNOTTY, (char *)0);
276: close (tty);
277: if((fd=ptopen(&slave))<0)
278: return -1;
279: switch(childid = fork()){
280: case 0:
281: childid = getpid();
282: ioctl(slave, TIOCSPGRP, &childid);
283: setpgrp (childid, childid);
284: dup2(slave, 0); dup2(slave, 1); dup2(slave, 2);
285: /* close every file descriptor in sight, and then some */
286: for(fd=3; fd<10; fd++)
287: close(fd);
288: sttymodes.sg_flags &= ~(ALLDELAY | XTABS | CBREAK | RAW);
289: sttymodes.sg_flags |= ECHO | CRMOD;
290: sttymodes.sg_ispeed = B9600;
291: sttymodes.sg_ospeed = B9600;
292: tcharmodes.t_brkc = -1;
293: ioctl (0, TIOCSETD, (char *)&discipline);
294: ioctl (0, TIOCSETP, (char *)&sttymodes);
295: ioctl (0, TIOCSETC, (char *)&tcharmodes);
296: ioctl (0, TIOCSLTC, (char *)<c);
297: ioctl (0, TIOCLSET, (char *)&lmode);
298: execlp(shell, shell, 0);
299: execlp(shell, shell, 0);
300: perror(shell);
301: exit(1);
302: break;
303: case -1:
304: close(fd);
305: return -1;
306: }
307: close(slave);
308: dup2(fd, 0);
309: dup2(fd, 1);
310: return(fd);
311: }
312:
313: ptopen (tty)
314: int *tty;
315: {
316: int devindex, letter = 0;
317: static char ttydev[] = "/dev/ttyxx";
318: static char ptydev[] = "/dev/ptyxx";
319: int masterfd;
320:
321: while (letter < 11) {
322: ttydev [8] = ptydev [8] = "pqrstuvwxyz" [letter++];
323: devindex = 0;
324:
325: while (devindex < 16) {
326: ttydev [9] = ptydev [9] = "0123456789abcdef" [devindex++];
327: if ((masterfd = open (ptydev, 2)) < 0)
328: continue;
329: if ((*tty = open (ttydev, 2)) < 0) {
330: close(masterfd);
331: continue;
332: }
333: return masterfd;
334: }
335: }
336: return -1;
337: }
338: #endif BSD
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.