|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: #include <../boot/boot.h> ! 4: ! 5: static void configasync(char*, char*); ! 6: static void connect(int, int); ! 7: static void kill(int); ! 8: ! 9: void ! 10: config9600(Method *mp) ! 11: { ! 12: configasync("B9600", mp->arg); ! 13: } ! 14: ! 15: int ! 16: auth9600(void) ! 17: { ! 18: return dkauth(); ! 19: } ! 20: ! 21: int ! 22: connect9600(void) ! 23: { ! 24: return dkconnect(); ! 25: } ! 26: ! 27: void ! 28: config19200(Method *mp) ! 29: { ! 30: configasync("B19200", mp->arg); ! 31: } ! 32: ! 33: int ! 34: auth19200(void) ! 35: { ! 36: return dkauth(); ! 37: } ! 38: ! 39: int ! 40: connect19200(void) ! 41: { ! 42: return dkconnect(); ! 43: } ! 44: ! 45: ! 46: static void ! 47: configasync(char *baud, char *dev) ! 48: { ! 49: int cfd, dfd; ! 50: char devname[NAMELEN]; ! 51: char eianame[NAMELEN]; ! 52: char port[5]; ! 53: ! 54: if(*sys == '/' || *sys == '#') ! 55: dev = sys; ! 56: else if(dev == 0) ! 57: dev = "#t/eia0"; ! 58: if(readfile("#e/modemport", port, sizeof(port)) == 0){ ! 59: sprint(devname, "#t/eia%d", atoi(port)); ! 60: dev = devname; ! 61: } ! 62: sprint(eianame, "%sctl", dev); ! 63: cfd = open(eianame, ORDWR); ! 64: if(cfd < 0) ! 65: fatal(eianame); ! 66: sendmsg(cfd, baud); ! 67: ! 68: sprint(eianame, "%s", dev); ! 69: dfd = open(eianame, ORDWR); ! 70: if(dfd < 0) ! 71: fatal(eianame); ! 72: connect(dfd, cfd); ! 73: close(dfd); ! 74: sendmsg(cfd, "push async"); ! 75: sendmsg(cfd, "push dkmux"); ! 76: sendmsg(cfd, "config 1 16 restart dk 4"); ! 77: close(cfd); ! 78: } ! 79: ! 80: enum ! 81: { ! 82: CtrlD = 0x4, ! 83: CtrlE = 0x5, ! 84: CtrlO = 0xf, ! 85: Cr = 13, ! 86: View = 0x80, ! 87: }; ! 88: ! 89: static void ! 90: connect(int fd, int cfd) ! 91: { ! 92: char xbuf[128]; ! 93: int i, pid, n, ctl; ! 94: ! 95: print("Connect to file system now, type ctrl-d when done.\n"); ! 96: print("...(Use the view or down arrow key to send a break)\n"); ! 97: print("...(Use ctrl-e to set even parity or ctrl-o for odd)\n"); ! 98: ! 99: switch(pid = fork()) { ! 100: case -1: ! 101: fatal("fork failed"); ! 102: case 0: ! 103: for(;;) { ! 104: n = read(fd, xbuf, sizeof(xbuf)); ! 105: if(n < 0) { ! 106: errstr(xbuf); ! 107: print("[remote read error (%s)]\n", xbuf); ! 108: for(;;); ! 109: } ! 110: for(i = 0; i < n; i++) ! 111: if(xbuf[i] == Cr) ! 112: xbuf[i] = ' '; ! 113: write(1, xbuf, n); ! 114: } ! 115: break; ! 116: default: ! 117: ctl = open("#c/consctl", OWRITE); ! 118: if(ctl < 0) ! 119: fatal("opening consctl"); ! 120: write(ctl, "rawon", 5); ! 121: ! 122: for(;;){ ! 123: read(0, xbuf, 1); ! 124: switch(xbuf[0]&0xff) { ! 125: case CtrlD: /* done */ ! 126: kill(pid); ! 127: close(ctl); ! 128: return; ! 129: case CtrlE: /* set even parity */ ! 130: write(cfd, "pe", 2); ! 131: break; ! 132: case CtrlO: /* set odd parity */ ! 133: write(cfd, "po", 2); ! 134: break; ! 135: case View: /* send a break */ ! 136: write(cfd, "k250", 4); ! 137: break; ! 138: default: ! 139: n = write(fd, xbuf, 1); ! 140: if(n < 0) { ! 141: errstr(xbuf); ! 142: kill(pid); ! 143: close(ctl); ! 144: print("[remote write error (%s)]\n", xbuf); ! 145: } ! 146: } ! 147: } ! 148: } ! 149: } ! 150: ! 151: static void ! 152: kill(int pid) ! 153: { ! 154: char xbuf[32]; ! 155: int f; ! 156: ! 157: sprint(xbuf, "#p/%d/note", pid); ! 158: f = open(xbuf, OWRITE); ! 159: write(f, "die", 3); ! 160: close(f); ! 161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.