|
|
1.1 ! root 1: #include <sys/param.h> ! 2: #include <fio.h> ! 3: #include <ipc.h> ! 4: #include <sys/ttyio.h> ! 5: #include <signal.h> ! 6: #include <libc.h> ! 7: ! 8: struct sgttyb old; ! 9: struct tchars chars; ! 10: int cfd; ! 11: ! 12: done() ! 13: { ! 14: cleanup(); ! 15: exit(0); ! 16: } ! 17: ! 18: intr() ! 19: { ! 20: write(cfd, &chars.t_intrc, 1); ! 21: signal(SIGINT, intr); ! 22: } ! 23: ! 24: dirty() ! 25: { ! 26: struct sgttyb new; ! 27: ! 28: ioctl(0, TIOCGETP, &old); ! 29: ioctl(0, TIOCGETC, &chars); ! 30: new = old; ! 31: new.sg_flags &= ~ECHO; ! 32: new.sg_flags |= CBREAK; ! 33: signal(SIGINT, intr); ! 34: signal(SIGQUIT, done); ! 35: signal(SIGHUP, done); ! 36: signal(SIGPIPE, done); ! 37: ioctl(0, TIOCSETP, &new); ! 38: } ! 39: ! 40: cleanup() ! 41: { ! 42: ioctl(0, TIOCSETP, &old); ! 43: } ! 44: ! 45: usage() ! 46: { ! 47: fprint(2, "usage: scriptcon dest script-file\n"); ! 48: exit(1); ! 49: } ! 50: ! 51: main(ac, av) ! 52: int ac; ! 53: char *av[]; ! 54: { ! 55: int sfd; ! 56: char *lookfor; ! 57: char *sendback; ! 58: fd_set fds; ! 59: ! 60: if (ac!=3) ! 61: usage(); ! 62: sfd = open(av[2], 0); ! 63: if (sfd<0){ ! 64: fprint(2, "can't open %s\n", av[2]); ! 65: exit(1); ! 66: } ! 67: cfd = ipcopen(ipcpath(av[1], "dk", ""), ""); ! 68: if (cfd<0){ ! 69: fprint(2, "can't open %s\n", av[2]); ! 70: exit(1); ! 71: } ! 72: ! 73: /* ! 74: * do the script ! 75: */ ! 76: while((lookfor=Frdline(sfd))!=NULL){ ! 77: await(cfd, lookfor); ! 78: if((sendback=Frdline(sfd))!=NULL){ ! 79: fprint(cfd, "%s\n", sendback); ! 80: } ! 81: } ! 82: close(sfd); ! 83: ! 84: /* ! 85: * shuttle bytes back and forth ! 86: */ ! 87: dirty(); ! 88: FD_ZERO(fds); ! 89: for(;;) { ! 90: FD_SET(cfd, fds); ! 91: FD_SET(0, fds); ! 92: switch(select(NOFILE, &fds, (struct fd_set *)0, 1000)) { ! 93: case -1: ! 94: cleanup(); ! 95: return(0); ! 96: case 0: ! 97: continue; ! 98: } ! 99: if (FD_ISSET(cfd, fds)) ! 100: if (pass(cfd, 1)<0) ! 101: break; ! 102: if (FD_ISSET(0, fds)) ! 103: if (pass(0, cfd)<0) ! 104: break; ! 105: } ! 106: ! 107: cleanup(); ! 108: return(0); ! 109: } ! 110: ! 111: /* ! 112: * wait for the specified string on the fd ! 113: */ ! 114: await(fd, str) ! 115: int fd; ! 116: char *str; ! 117: { ! 118: char buf[128]; ! 119: int c; ! 120: int len; ! 121: ! 122: len = strlen(str); ! 123: if(len>sizeof(buf)-2) ! 124: len = sizeof(buf)-2; ! 125: for(c=0; c<len+2; c++) ! 126: buf[c] = '\0'; ! 127: while((c=Fgetc(fd))>=0){ ! 128: buf[len] = c&0x7f; ! 129: memcpy(buf, buf+1, len+1); ! 130: if(strcmp(buf, str)==0) ! 131: break; ! 132: } ! 133: } ! 134: ! 135: /* ! 136: * copy one record from one fd to another ! 137: */ ! 138: pass(from, to) ! 139: int from, to; ! 140: { ! 141: char buf[4096]; ! 142: int n; ! 143: ! 144: if ((n=read(from, buf, sizeof(buf)))<0) ! 145: return -1; ! 146: if (n == 0) { ! 147: if (to == cfd) { ! 148: write(to, &chars.t_eofc, 1); ! 149: return (0); ! 150: } ! 151: return (-1); ! 152: } ! 153: if (write(to, buf, n)!=n) ! 154: return -1; ! 155: return 0; ! 156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.