|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/stat.h> ! 3: #include <sys/filio.h> ! 4: #include <dk.h> ! 5: #include <dkerr.h> ! 6: #include <stdio.h> ! 7: #include <signal.h> ! 8: #include <errno.h> ! 9: #include <ipc.h> ! 10: #include <libc.h> ! 11: #include "defs.h" ! 12: #include <dkwindow.h> ! 13: #include <sys/dkio.h> ! 14: ! 15: /* imported */ ! 16: extern int rdk_ld; ! 17: extern int dkp_ld; ! 18: extern int dt_ld; ! 19: extern int errno; ! 20: extern int unit; ! 21: extern int lastdkchan; ! 22: ! 23: ! 24: int ! 25: net_dial(ip) ! 26: ipcinfo *ip; ! 27: { ! 28: return dkdial(ip, 3); ! 29: } ! 30: ! 31: int ! 32: net_announce(ip) ! 33: ipcinfo *ip; ! 34: { ! 35: register char *dp; ! 36: ! 37: /* ! 38: * hack: assertively set unit ! 39: * when announcing, use traffic type to decide on interface to use ! 40: */ ! 41: if (unit == 'b') { ! 42: ! 43: /* get type of request and properties */ ! 44: unit = '0'; ! 45: for(dp = ip->param; *dp; dp++) { ! 46: for(;*dp && *dp==' '; dp++); ! 47: if (strncmp(dp, "heavy", 5)==0 && (dp[5]=='\0'||dp[5]==' ')) ! 48: unit = '2'; ! 49: for(;*dp && *dp!=' '; dp++); ! 50: } ! 51: } ! 52: ! 53: return dkdial(ip, 2); ! 54: } ! 55: ! 56: int ! 57: net_redial(ip) ! 58: ipcinfo *ip; ! 59: { ! 60: return -1; ! 61: } ! 62: ! 63: int ! 64: dkdial(ip, serv) ! 65: ipcinfo *ip; ! 66: int serv; ! 67: { ! 68: int fd; ! 69: int listener; ! 70: int i; ! 71: struct listenin d; ! 72: char dialstr[128]; ! 73: char dialtone[2]; ! 74: register char *dp, *cp; ! 75: int chan; ! 76: struct dialout reply; ! 77: int traffic=0; ! 78: int al_catch(); ! 79: ! 80: /* get type of request and properties */ ! 81: for(dp = ip->param; *dp; dp++) { ! 82: for(;*dp && *dp==' '; dp++); ! 83: if (strncmp(dp, "heavy", 5)==0 && (dp[5]=='\0'||dp[5]==' ')) ! 84: traffic = 2; ! 85: for(;*dp && *dp!=' '; dp++); ! 86: } ! 87: ! 88: /* establish the initial connection */ ! 89: signal(SIGALRM, al_catch); ! 90: fd = dkchan(traffic, unit, &chan); ! 91: if (fd < 0) ! 92: return ABORT(EBUSY, "out of output channels", NULLINFO); ! 93: dkproto(fd, dkp_ld); ! 94: ioctl(fd, FIOPUSHLD, &rdk_ld); ! 95: ! 96: /* set up the parameter block for the initial request */ ! 97: d.l_type = T_SRV; ! 98: d.l_lchan = chan; ! 99: d.l_srv = 256 - serv; ! 100: d.l_param0 = traffic; ! 101: d.l_param1 = 0; ! 102: d.l_param2 = 0; ! 103: d.l_param3 = 0; ! 104: d.l_param4 = 0; ! 105: d.l_param5 = 0; ! 106: ! 107: /* ! 108: * Convert first two '!'s to '.'s to comply with generic's form ! 109: * of destination.service[.more-things]. Escape any '.'s in the ! 110: * service part with '\'s. ! 111: */ ! 112: for(i=0, cp=ip->name, dp=dialstr; *cp; cp++) ! 113: if (i<2 && *cp=='!'){ ! 114: *dp++ = '.'; ! 115: i++; ! 116: } else if (i==1 && *cp=='.') { ! 117: *dp++ = '\\'; ! 118: *dp++ = '.'; ! 119: } else if (*cp=='\n') { ! 120: close(fd); ! 121: return ABORT(EACCES, "illegal dial string", NULLINFO); ! 122: } else ! 123: *dp++ = *cp; ! 124: *dp = '\0'; ! 125: strcat(dialstr, "\n"); ! 126: strcat(dialstr, ip->user); ! 127: strcat(dialstr, "\n"); ! 128: alarm(15); ! 129: listener = dkctlchan(traffic, unit); ! 130: if (listener < 0) ! 131: return ABORT(errno,"can't get dk control channel",NULLINFO); ! 132: i = write(listener, (char *)&d, sizeof(d)); ! 133: close(listener); ! 134: if (i != sizeof(d)) { ! 135: close(fd); ! 136: return ABORT(EIO, "can't dial out on dk", NULLINFO); ! 137: } ! 138: alarm(15); ! 139: i = read(fd, dialtone, 1); ! 140: if (i < 0) { ! 141: close(fd); ! 142: return ABORT(EIO, "no dial tone from dk", NULLINFO); ! 143: } ! 144: if (dialtone[0] != 'O') { ! 145: close(fd); ! 146: return ABORT(EIO, "wrong dial tone from dk", NULLINFO); ! 147: } ! 148: ioctl(fd, DIOCSTOP, 0); ! 149: alarm(60); ! 150: logevent("%s", dialstr); ! 151: write(fd, dialstr, strlen(dialstr)); ! 152: i = read(fd, (char *)&reply, sizeof reply); ! 153: if (i <= 0) { ! 154: close(fd); ! 155: return ABORT(EIO,"remote system doesn't respond", ! 156: (ipcinfo *)NULL); ! 157: } ! 158: ! 159: alarm(0); ! 160: /* successful reply, analyze it */ ! 161: if (reply.srv!=D_OPEN) { ! 162: close(fd); ! 163: dktouerr(reply.param1&0x7f); ! 164: return -1; ! 165: } ! 166: if (W_VALID(reply.param4)) { /* check window sizes */ ! 167: char ws[5]; ! 168: long wins = W_VALUE(W_DEST(reply.param4))>>2; ! 169: /* use 3 X wins/4 */ ! 170: ws[0] = wins; ! 171: ws[1] = wins>>8; ! 172: ws[2] = wins>>16; ! 173: ws[3] = wins>>24; ! 174: ws[4] = 3; ! 175: ioctl(fd, DIOCXWIN, ws); ! 176: } ! 177: if (dkproto(fd, dkp_ld) < 0) { ! 178: close(fd); ! 179: return ABORT(EIO, "can't push line discipline",NULLINFO); ! 180: } ! 181: ioctl(fd, FIOPOPLD, 0); /* dump rdk */ ! 182: ip->machine = ""; ! 183: ip->myname = ""; ! 184: return fd; ! 185: } ! 186: ! 187: al_catch() ! 188: { ! 189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.