|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/ioctl.h> ! 3: #include <signal.h> ! 4: ! 5: #ifndef BSD ! 6: #include <sys/stream.h> ! 7: ! 8: char umesgf[]= "/dev/pt/pt109"; ! 9: extern int mesg_ld; ! 10: struct ttydevb devmodes; ! 11: #endif BSD ! 12: ! 13: #include "jerq.h" ! 14: #include "frame.h" ! 15: ! 16: char *shell; ! 17: struct sgttyb sttymodes; ! 18: struct tchars tcharmodes; ! 19: extern char *getenv(); ! 20: ! 21: #ifdef BSD ! 22: main(argc, argv) ! 23: char *argv[]; ! 24: { ! 25: if((shell=getenv("SHELL")) == 0) ! 26: shell="sh"; ! 27: if (doshell() < 0) ! 28: exit(1); ! 29: initdisplay(argc, argv); ! 30: initcursors(); ! 31: windowproc(); ! 32: } ! 33: #else ! 34: main(argc, argv) ! 35: char *argv[]; ! 36: { ! 37: if((shell=getenv("SHELL")) == 0) ! 38: shell="sh"; ! 39: initdisplay(argc, argv); ! 40: if (ioctl(3, TIOCGETP, &sttymodes) == -1) ! 41: readmodes(); ! 42: else { ! 43: ioctl(3, TIOCGDEV, &devmodes); ! 44: ioctl(3, TIOCGETC, &tcharmodes); ! 45: } ! 46: if (doshell() < 0) ! 47: exit(1); ! 48: initcursors(); ! 49: windowproc(); ! 50: } ! 51: ! 52: readmodes() ! 53: { ! 54: char filename[256], *p; ! 55: int fd; ! 56: ! 57: if((p=getenv("HOME")) == 0) ! 58: exit(1); ! 59: strcpy(filename, p); ! 60: strcat(filename, "/.sttymodes"); ! 61: if ((fd = open(filename, 0)) < 0) ! 62: exit(1); ! 63: read(fd, &sttymodes, sizeof(struct sgttyb)); ! 64: read(fd, &devmodes, sizeof(struct ttydevb)); ! 65: read(fd, &tcharmodes, sizeof(struct tchars)); ! 66: close(fd); ! 67: } ! 68: #endif BSD ! 69: ! 70: jerqsizehints() ! 71: { ! 72: setsizehints (fontwidth(&defont) * 80 + 3*SCROLLWIDTH/2 + 5, ! 73: fontheight(&defont) * 24 + 5, 0); ! 74: } ! 75: ! 76: #ifdef BSD ! 77: void ! 78: dosig(sig) ! 79: {} ! 80: ! 81: delim() ! 82: {} ! 83: #else ! 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: void ! 167: dosig(sig) /* Interrupt shell */ ! 168: { ! 169: char sigbuf[MSGHLEN+1]; ! 170: register struct mesg *mp; ! 171: ! 172: mp = (struct mesg *)sigbuf; ! 173: mp->type=M_SIGNAL; ! 174: mp->magic=MSGMAGIC; ! 175: mp->losize=sizeof(char); ! 176: mp->hisize=0; ! 177: sigbuf[MSGHLEN]=sig; ! 178: write(1, sigbuf, MSGHLEN+1); ! 179: mp->type=M_FLUSH; ! 180: mp->magic=MSGMAGIC; ! 181: mp->losize=0; ! 182: mp->hisize=0; ! 183: write(1, sigbuf, MSGHLEN); ! 184: } ! 185: ! 186: wrmesgb(cp, n) ! 187: register char *cp; ! 188: int n; ! 189: { ! 190: char wrbuf[128+MSGHLEN]; ! 191: register char *bp; ! 192: register struct mesg *mp; ! 193: register int i; ! 194: ! 195: mp = (struct mesg *)wrbuf; ! 196: mp->type=M_DATA; ! 197: mp->magic=MSGMAGIC; ! 198: mp->losize=n; ! 199: mp->hisize=n>>8; ! 200: if (n <= 128) { ! 201: bp=wrbuf+MSGHLEN; ! 202: i=n; ! 203: while(i--) ! 204: *bp++= *cp++; ! 205: write(1, wrbuf, MSGHLEN+n); ! 206: } else { ! 207: write(1, wrbuf, MSGHLEN); ! 208: write(1, cp, n); ! 209: } ! 210: } ! 211: ! 212: delim() ! 213: { ! 214: struct mesg delbuf; ! 215: ! 216: delbuf.type=M_DELIM; ! 217: delbuf.magic=MSGMAGIC; ! 218: delbuf.losize=0; ! 219: delbuf.hisize=0; ! 220: write(1, (char *)&delbuf, MSGHLEN); ! 221: } ! 222: ! 223: doshell() ! 224: { ! 225: register fd, slave; ! 226: if((fd=ptopen(umesgf))<0){ ! 227: return -1; ! 228: } ! 229: if((slave=open(umesgf, 2))==-1){ ! 230: close(fd); ! 231: return -1; ! 232: } ! 233: if(ioctl(fd, FIOPUSHLD, &mesg_ld) == -1){ ! 234: close(fd); ! 235: return -1; ! 236: } ! 237: switch(fork()){ ! 238: case 0: ! 239: /* close every file descriptor in sight, and then some */ ! 240: for(fd=0; fd<10; fd++) ! 241: if(fd!=slave) ! 242: close(fd); ! 243: dup(slave); dup(slave); dup(slave); dup(slave); ! 244: close(slave); ! 245: ioctl(0, TIOCSPGRP, 0); ! 246: signal(SIGPIPE, (int (*)())0); ! 247: execlp(shell, shell, 0); ! 248: perror(shell); ! 249: exit(1); ! 250: break; ! 251: case -1: ! 252: close(fd); ! 253: return -1; ! 254: } ! 255: close(slave); ! 256: close(0); close(1); ! 257: dup(fd); dup(fd); ! 258: return(fd); ! 259: } ! 260: #endif BSD ! 261: ! 262: clear(r, inh) ! 263: Rectangle r; ! 264: { ! 265: rectf(&display, r, F_CLR); ! 266: } ! 267: ! 268: whichbutton() ! 269: { ! 270: static int which[]={0, 3, 2, 2, 1, 1, 2, 2, }; ! 271: return which[mouse.buttons&7]; ! 272: } ! 273: ! 274: #ifdef BSD ! 275: doshell() ! 276: { ! 277: static struct sgttyb sg; ! 278: static struct tchars tc; ! 279: static struct ltchars ltc; ! 280: int discipline; ! 281: int pid; ! 282: long lmode; ! 283: int tty, pgrp, slave; ! 284: register fd, i; ! 285: ! 286: for(i = 0; i < NSIG; i++) ! 287: signal(i, SIG_DFL); ! 288: ! 289: tty = open ("/dev/tty", 2); ! 290: ioctl(tty, TIOCGETP, (char *)&sg); ! 291: ioctl(tty, TIOCGETC, (char *)&tc); ! 292: ioctl(tty, TIOCGETD, (char *)&discipline); ! 293: ioctl(tty, TIOCGLTC, (char *)<c); ! 294: ioctl(tty, TIOCLGET, (char *)&lmode); ! 295: ioctl(tty, TIOCNOTTY, (char *)0); ! 296: close (tty); ! 297: sttymodes = sg; ! 298: sttymodes.sg_flags = RAW; ! 299: tcharmodes = tc; ! 300: if((fd=ptopen(&slave))<0) ! 301: return -1; ! 302: switch(fork()){ ! 303: case 0: ! 304: pid = getpid(); ! 305: ioctl(slave, TIOCSPGRP, &pid); ! 306: setpgrp (pid, pid); ! 307: dup2(slave, 0); dup2(slave, 1); dup2(slave, 2); ! 308: /* close every file descriptor in sight, and then some */ ! 309: for(fd=3; fd<10; fd++) ! 310: close(fd); ! 311: sg.sg_flags &= ~(ALLDELAY | XTABS | CBREAK | RAW); ! 312: sg.sg_flags |= ECHO | CRMOD; ! 313: sg.sg_ispeed = B9600; ! 314: sg.sg_ospeed = B9600; ! 315: tc.t_brkc = -1; ! 316: ioctl (0, TIOCSETD, (char *)&discipline); ! 317: ioctl (0, TIOCSETP, (char *)&sg); ! 318: ioctl (0, TIOCSETC, (char *)&tc); ! 319: ioctl (0, TIOCSLTC, (char *)<c); ! 320: ioctl (0, TIOCLSET, (char *)&lmode); ! 321: execlp(shell, shell, 0); ! 322: perror(shell); ! 323: exit(1); ! 324: break; ! 325: case -1: ! 326: close(fd); ! 327: return -1; ! 328: } ! 329: signal(SIGINT, SIG_IGN); ! 330: signal(SIGQUIT, SIG_IGN); ! 331: close(slave); ! 332: dup2(fd, 0); ! 333: dup2(fd, 1); ! 334: return(fd); ! 335: } ! 336: ! 337: ptopen (tty) ! 338: int *tty; ! 339: { ! 340: int devindex, letter = 0; ! 341: int masterfd; ! 342: static char ttydev[] = "/dev/ttyxx"; ! 343: static char ptydev[] = "/dev/ptyxx"; ! 344: ! 345: while (letter < 11) { ! 346: ttydev [8] = ptydev [8] = "pqrstuvwxyz" [letter++]; ! 347: devindex = 0; ! 348: ! 349: while (devindex < 16) { ! 350: ttydev [9] = ptydev [9] = "0123456789abcdef" [devindex++]; ! 351: if ((masterfd = open (ptydev, 2)) < 0) ! 352: continue; ! 353: if ((*tty = open (ttydev, 2)) < 0) { ! 354: close(masterfd); ! 355: continue; ! 356: } ! 357: return masterfd; ! 358: } ! 359: } ! 360: return -1; ! 361: } ! 362: #endif BSD
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.