|
|
1.1 ! root 1: #define DKMSGS 1 ! 2: #include <sys/types.h> ! 3: #include <stdio.h> ! 4: #include <dk.h> ! 5: #include <pwd.h> ! 6: #include <signal.h> ! 7: #include <sys/ioctl.h> ! 8: #include "dkdial.h" ! 9: #include <sys/stat.h> ! 10: ! 11: void alarmcatch(); ! 12: struct passwd *getpwuid(); ! 13: struct dialout reply; ! 14: int pipefd; ! 15: ! 16: main (argc, argv) ! 17: int argc; ! 18: char **argv; ! 19: { ! 20: int fd, server ; ! 21: int retval, listener; ! 22: struct listenin d; ! 23: register char **p; ! 24: struct passwd *pw; ! 25: struct stat st; ! 26: char dialstr[64] ; ! 27: char dialtone[2] ; ! 28: int rc ; ! 29: int traffic ; ! 30: char *cp ; ! 31: ! 32: /* pick up and decode arguments */ ! 33: if (argc != 6) ! 34: bugout(ILLEG); ! 35: p = argv + 1; ! 36: fd = atoi (*p++); ! 37: pipefd = atoi (*p++); ! 38: server = atoi (*p++); ! 39: if (server==1) ! 40: server = 3; ! 41: traffic = atoi(*p++) ; ! 42: strcpy(dialstr, *p) ; ! 43: cp = dialstr ; ! 44: while (*cp) { ! 45: if (*cp == '\n') ! 46: *cp = '\0' ; ! 47: cp++ ; ! 48: } ! 49: ! 50: /* set up the parameter block for the initial request */ ! 51: fstat(fd, &st); ! 52: d.l_type = T_SRV; ! 53: d.l_lchan = minor(st.st_rdev); ! 54: d.l_srv = 256 - server; ! 55: d.l_param0 = traffic ; ! 56: d.l_param1 = 0; ! 57: d.l_param2 = 0; ! 58: d.l_param3 = 0; ! 59: d.l_param4 = 0; ! 60: d.l_param5 = 0; ! 61: strcat(dialstr, "\n") ; ! 62: pw = getpwuid(getuid()) ; ! 63: if (pw == 0) ! 64: bugout(NOUID) ; ! 65: strcat(dialstr, pw->pw_name) ; ! 66: strcat(dialstr, "\n") ; ! 67: signal (SIGALRM, alarmcatch); ! 68: alarm (15); ! 69: listener = dkctlchan(traffic) ; ! 70: if (listener < 0) ! 71: bugout(NOMGR); ! 72: write(listener, (char *)&d, sizeof(d)); ! 73: close(listener); ! 74: rc = read(fd, dialtone, 1) ; ! 75: if (rc < 0) ! 76: bugout(NODIALT) ; ! 77: if (dialtone[0] != 'O') ! 78: bugout(NODIALT) ; ! 79: ioctl(fd, DIOCSTOP, 0); ! 80: write(fd, dialstr, strlen(dialstr)) ; ! 81: alarm(60); ! 82: rc = read(fd, &reply, sizeof reply); ! 83: alarm (0); ! 84: if (rc <= 0) ! 85: bugout(NOREP); ! 86: write(pipefd, &reply, sizeof reply); ! 87: ! 88: /* assume normal exit */ ! 89: retval = NORM; ! 90: ! 91: /* successful reply, analyze it */ ! 92: switch (reply.srv) { ! 93: case D_OPEN: ! 94: break ; ! 95: case D_FAIL: ! 96: exit(ERRBASE + (reply.param1&0x7f)); ! 97: } ! 98: return retval; ! 99: } ! 100: ! 101: void ! 102: alarmcatch() ! 103: { ! 104: } ! 105: ! 106: /* ! 107: * write some sort of reply ! 108: * (obsolete, but some old callers use it) ! 109: */ ! 110: bugout(r) ! 111: { ! 112: reply.srv = D_FAIL; ! 113: write(pipefd, (char *)&reply, sizeof(reply)); ! 114: exit(r); ! 115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.