|
|
1.1 ! root 1: #define DKMSGS 1 ! 2: #include <dk.h> ! 3: #include <dkerr.h> ! 4: #include <sgtty.h> ! 5: #include <stdio.h> ! 6: #include <signal.h> ! 7: #include <errno.h> ! 8: #include "dkdial.h" ! 9: ! 10: #define SUBR "/etc/dkdialsub" ! 11: ! 12: int dkverbose; ! 13: int dkrchan; ! 14: int dkerrno; ! 15: char *dkerror; ! 16: ! 17: static char *msgs[] = { ! 18: NULL, /* NORM */ ! 19: "bad call to dk dialler", /* ILLEG */ ! 20: "can't tell who you are", /* NOUID */ ! 21: "remote system doesn't respond", /* NOREP */ ! 22: "can't find dial program", /* NODIAL */ ! 23: "can't find outgoing channel", /* NOOCHAN */ ! 24: "can't open manager channel", /* NOMGR */ ! 25: "can't get dial tone", /* NODIALT */ ! 26: "DK controller system error", ! 27: "destination busy", ! 28: "remote node not answering", ! 29: "destination not answering", ! 30: "unassigned destination", ! 31: "DK system overload", ! 32: "server already exists", ! 33: "permission denied by destination", ! 34: }; ! 35: ! 36: static char *argbuf; ! 37: static char **bufptr; ! 38: extern int rdk_ld, dkp_ld; ! 39: extern int errno ; ! 40: ! 41: int ! 42: tdkdial(dialstr, traffic) ! 43: int traffic ; ! 44: char * dialstr ; ! 45: { ! 46: return (_tdkdial(1, traffic, dialstr)) ; ! 47: } ! 48: ! 49: int ! 50: tdkserv(srvname, maxtraf) ! 51: int maxtraf ; ! 52: char * srvname ; ! 53: { ! 54: return (_tdkdial(2, maxtraf, srvname)) ; ! 55: } ! 56: ! 57: ! 58: int ! 59: _tdkdial (type, traffic, dialstr) ! 60: int type ; ! 61: int traffic ; ! 62: char * dialstr ; ! 63: { ! 64: register int fd, pid, rc; ! 65: char args[100]; ! 66: char *argptrs[10]; ! 67: int status; ! 68: struct dialout reply; ! 69: int pipefd[2]; ! 70: register i; ! 71: char outname[64]; ! 72: int popld ; ! 73: int oldchdie ; ! 74: int n3dig = 0, n2dig = 0; ! 75: extern errno; ! 76: static char alph[] = "0123456789abcdefghijklmnopqrstuvwxyz"; ! 77: ! 78: /* establish the initial connection */ ! 79: if (traffic) ! 80: traffic = 2; ! 81: for (i=3; i<256; i+=2) { ! 82: if (n3dig<3) { ! 83: sprintf(outname, "/dev/dk/dk%d%c%d", traffic, ! 84: alph[i/10], i%10); ! 85: if ((fd = open(outname, 2)) >= 0) ! 86: break; ! 87: if (errno==ENOENT) ! 88: n3dig++; ! 89: } ! 90: if (n2dig < 5) { ! 91: sprintf(outname, "/dev/dk/dk%c%d", alph[i/10], i%10); ! 92: if ((fd = open(outname, 2)) >= 0) ! 93: break; ! 94: if (errno==ENOENT) ! 95: ++n2dig; ! 96: } ! 97: } ! 98: if (fd < 0) { ! 99: dkerrno = NOOCHAN ; ! 100: dkerror = msgs[NOOCHAN]; ! 101: return fd; ! 102: } ! 103: /* Install URP now if traffic-type is 2, to permit */ ! 104: /* window-size setting in dkdialsub */ ! 105: if (traffic==2) ! 106: dkproto(fd, dkp_ld); ! 107: ioctl(fd, FIOPUSHLD, &rdk_ld) ; ! 108: ! 109: /* create a pipe to the sub-process */ ! 110: if (pipe (pipefd) < 0) { ! 111: dkerrno = NODIALT ; ! 112: dkerror = "Can't pipe to dialler"; ! 113: close (fd); ! 114: return -1; ! 115: } ! 116: ! 117: /* build the arg list for the sub-process */ ! 118: arginit (args, argptrs); ! 119: strarg ("tdkdial"); ! 120: intarg (fd); ! 121: intarg (pipefd[1]); ! 122: intarg (type); ! 123: intarg(traffic) ; ! 124: strarg(dialstr) ; ! 125: argend(); ! 126: oldchdie = (int)signal(SIGCHLD, SIG_IGN) ; ! 127: ! 128: /* start up a sub-process */ ! 129: switch (pid = fork()) { ! 130: ! 131: /* child */ ! 132: case 0: ! 133: close (pipefd[0]); ! 134: setuid (geteuid()); ! 135: execv (SUBR, argptrs); ! 136: exit (NODIAL); ! 137: ! 138: /* error */ ! 139: case -1: ! 140: close (pipefd[0]); ! 141: close (pipefd[1]); ! 142: close(fd); ! 143: dkerrno = NODIAL ; ! 144: dkerror = "DK dialler can't fork"; ! 145: signal(SIGCHLD, oldchdie) ; ! 146: return -1; ! 147: ! 148: /* parent */ ! 149: default: ! 150: close (pipefd[1]); ! 151: ! 152: /* wait for the child to complete */ ! 153: do ! 154: rc = wait (&status); ! 155: while (rc > 0 && rc != pid); ! 156: signal(SIGCHLD, oldchdie) ; ! 157: /* figure out what happened */ ! 158: if (rc < 0 || status&0xff) { ! 159: dkerrno = NODIAL ; ! 160: dkerror = "DK dialler exited abnormally"; ! 161: goto bad; ! 162: } ! 163: /* read the reply */ ! 164: rc = read (pipefd[0], &reply, sizeof (reply)); ! 165: if (rc != sizeof (reply)) { ! 166: dkerrno = NODIAL ; ! 167: dkerror = "Bad reply from DK dialler"; ! 168: goto bad; ! 169: } ! 170: close (pipefd[0]); ! 171: if ((status & 0xFF00) == 0) { ! 172: ioctl(fd, FIOPOPLD, 0) ; ! 173: dkerrno = 0 ; ! 174: dkerror = NULL ; ! 175: return fd; ! 176: } ! 177: status >>= 8; ! 178: dkerrno = status ; ! 179: if (status < sizeof(msgs)/sizeof(msgs[0])) ! 180: dkerror = msgs[status]; ! 181: else { ! 182: static char msg[32]; ! 183: sprintf(msg, "DK dial error %d", status-8); ! 184: dkerror = msg; ! 185: } ! 186: goto bad; ! 187: } ! 188: bad: ! 189: close (pipefd[0]); ! 190: close (fd); ! 191: return -1; ! 192: } ! 193: ! 194: ! 195: tdkerrmess (s) ! 196: register char *s; ! 197: { ! 198: if (dkverbose) ! 199: write (2, s, strlen(s)); ! 200: } ! 201: ! 202: ! 203: /* ! 204: * The following subroutines help build argument lists ! 205: */ ! 206: ! 207: static ! 208: arginit (x, y) ! 209: char *x; ! 210: char **y; ! 211: { ! 212: argbuf = x; ! 213: bufptr = y; ! 214: } ! 215: ! 216: ! 217: static ! 218: strarg (x) ! 219: register char *x; ! 220: { ! 221: *bufptr++ = x; ! 222: } ! 223: ! 224: ! 225: static ! 226: intarg (x) ! 227: int x; ! 228: { ! 229: *bufptr++ = argbuf; ! 230: if (x < 0) ! 231: *argbuf++ = '-'; ! 232: else ! 233: x = -x; ! 234: convint (x); ! 235: *argbuf++ = '\0'; ! 236: } ! 237: ! 238: ! 239: static ! 240: convint (x) ! 241: register int x; ! 242: { ! 243: if (x <= -10) ! 244: convint (x / 10); ! 245: *argbuf++ = '0' - x % 10; ! 246: } ! 247: ! 248: ! 249: static ! 250: argend() ! 251: { ! 252: *bufptr++ = 0; ! 253: } ! 254: ! 255:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.