|
|
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 "dkdial.h" ! 8: ! 9: #define SUBR "/etc/dkdialsub" ! 10: ! 11: int dkverbose; ! 12: int dkrchan; ! 13: ! 14: static char *argbuf; ! 15: static char **bufptr; ! 16: extern int rdk_ld; ! 17: extern int errno ; ! 18: ! 19: int ! 20: tdkdial(dialstr, traffic) ! 21: int traffic ; ! 22: char * dialstr ; ! 23: { ! 24: return (_tdkdial(1, traffic, dialstr)) ; ! 25: } ! 26: ! 27: int ! 28: tdkserv(srvname, maxtraf) ! 29: int maxtraf ; ! 30: char * srvname ; ! 31: { ! 32: return (_tdkdial(2, maxtraf, srvname)) ; ! 33: } ! 34: ! 35: ! 36: int ! 37: _tdkdial (type, traffic, dialstr) ! 38: int type ; ! 39: int traffic ; ! 40: char * dialstr ; ! 41: { ! 42: register int fd, pid, rc; ! 43: char args[100]; ! 44: char *argptrs[10]; ! 45: int status; ! 46: struct dialout reply; ! 47: int pipefd[2]; ! 48: register i; ! 49: char outname[64]; ! 50: int popld ; ! 51: int oldchdie ; ! 52: ! 53: /* establish the initial connection */ ! 54: strcpy(outname, "/dev/dk/dkxx"); ! 55: for (i=3; i<64; i+=2) { ! 56: outname[10] = i/10 + '0'; ! 57: outname[11] = i%10 + '0'; ! 58: if ((fd = open(outname, 2)) >= 0) ! 59: break; ! 60: } ! 61: if (fd < 0) { ! 62: tdkerrmess ("dk busy or no listener\n"); ! 63: return fd; ! 64: } ! 65: ioctl(fd, FIOPUSHLD, &rdk_ld) ; ! 66: ! 67: /* create a pipe to the sub-process */ ! 68: if (pipe (pipefd) < 0) { ! 69: tdkerrmess ("cannot create a pipe\n"); ! 70: close (fd); ! 71: return -1; ! 72: } ! 73: ! 74: /* build the arg list for the sub-process */ ! 75: arginit (args, argptrs); ! 76: strarg ("tdkdial"); ! 77: intarg (fd); ! 78: intarg (pipefd[PIPEWRITE]); ! 79: intarg (type); ! 80: intarg(traffic) ; ! 81: strarg(dialstr) ; ! 82: argend(); ! 83: oldchdie = (int)signal(SIGCHLD, SIG_IGN) ; ! 84: ! 85: /* start up a sub-process */ ! 86: switch (pid = fork()) { ! 87: ! 88: /* child */ ! 89: case 0: ! 90: close (pipefd[PIPEREAD]); ! 91: setuid (geteuid()); ! 92: execv (SUBR, argptrs); ! 93: tdkerrmess ("cannot execute dialer\n"); ! 94: exit (GENERR); ! 95: ! 96: /* error */ ! 97: case -1: ! 98: close (pipefd[PIPEREAD]); ! 99: close (pipefd[PIPEWRITE]); ! 100: close(fd); ! 101: tdkerrmess ("cannot fork\n"); ! 102: signal(SIGCHLD, oldchdie) ; ! 103: return -1; ! 104: ! 105: /* parent */ ! 106: default: ! 107: close (pipefd[PIPEWRITE]); ! 108: ! 109: /* wait for the child to complete */ ! 110: do ! 111: rc = wait (&status); ! 112: while (rc > 0 && rc != pid); ! 113: ! 114: signal(SIGCHLD, oldchdie) ; ! 115: /* figure out what happened */ ! 116: if (rc < 0) { ! 117: tdkerrmess ("tdkdial process disappeared\n"); ! 118: goto bad; ! 119: } ! 120: ! 121: /* read the reply */ ! 122: rc = read (pipefd[PIPEREAD], &reply, sizeof (reply)); ! 123: if (rc != sizeof (reply)) { ! 124: tdkerrmess ("wrong length in reading pipe\n"); ! 125: goto bad; ! 126: } ! 127: close (pipefd[PIPEREAD]); ! 128: ! 129: /* save the real channel number in case someone wants it */ ! 130: dkrchan = reply.param2; ! 131: ! 132: /* pretty normal return -- figure out what happened */ ! 133: switch (status) { ! 134: ! 135: /* successfully connected */ ! 136: case NORM << 8: ! 137: ioctl(fd, FIOPOPLD, 0) ; ! 138: return fd; ! 139: ! 140: ! 141: /* couldn't connect */ ! 142: default: ! 143: if ((status & 0xff) == 0) { ! 144: register int x = status >> 8; ! 145: if (x > ERRBASE && x < ERRBASE + NDKERR) ! 146: tdkerrmess(dkmsgs[x-ERRBASE]); ! 147: } ! 148: goto bad; ! 149: } ! 150: } ! 151: ! 152: bad: ! 153: close (pipefd[PIPEREAD]); ! 154: close (fd); ! 155: return -1; ! 156: } ! 157: ! 158: ! 159: tdkerrmess (s) ! 160: register char *s; ! 161: { ! 162: if (dkverbose) ! 163: write (2, s, strlen(s)); ! 164: } ! 165: ! 166: ! 167: /* ! 168: * The following subroutines help build argument lists ! 169: */ ! 170: ! 171: static ! 172: arginit (x, y) ! 173: char *x; ! 174: char **y; ! 175: { ! 176: argbuf = x; ! 177: bufptr = y; ! 178: } ! 179: ! 180: ! 181: static ! 182: strarg (x) ! 183: register char *x; ! 184: { ! 185: *bufptr++ = x; ! 186: } ! 187: ! 188: ! 189: static ! 190: intarg (x) ! 191: int x; ! 192: { ! 193: *bufptr++ = argbuf; ! 194: if (x < 0) ! 195: *argbuf++ = '-'; ! 196: else ! 197: x = -x; ! 198: convint (x); ! 199: *argbuf++ = '\0'; ! 200: } ! 201: ! 202: ! 203: static ! 204: convint (x) ! 205: register int x; ! 206: { ! 207: if (x <= -10) ! 208: convint (x / 10); ! 209: *argbuf++ = '0' - x % 10; ! 210: } ! 211: ! 212: ! 213: static ! 214: argend() ! 215: { ! 216: *bufptr++ = 0; ! 217: } ! 218: ! 219:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.