|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <signal.h> ! 3: #include <ipc.h> ! 4: #include <string.h> ! 5: ! 6: #include "auth.h" ! 7: ! 8: #define RLOGIN "/usr/bin/rlogin" ! 9: ! 10: int callee = -1; ! 11: int cpid = -1; ! 12: ! 13: int ! 14: doconnect(path, user) ! 15: char *path; ! 16: char *user; ! 17: { ! 18: char *cp; ! 19: int status; ! 20: ! 21: ! 22: if (strncmp(path, "tcp!", 4) != 0) { ! 23: char *svc; /* this service stuff is a hack */ ! 24: if ((strchr(path, '/') == NULL) || ! 25: (strncmp(path, "phone/", 6) == 0) || ! 26: (strncmp(path, "homer/", 6) == 0) || ! 27: (strncmp(path, "mercury/", 8) == 0)) ! 28: svc = "dcon"; /* dcon requires no passwd on V10 unix */ ! 29: else ! 30: svc = ""; ! 31: restoretty(); ! 32: redial(path, user, svc); ! 33: settty(); ! 34: return FALSE; ! 35: } ! 36: ! 37: signal(SIGALRM, SIG_IGN); ! 38: switch (cpid=fork()) { ! 39: case -1: ! 40: perror("Fork error"); ! 41: return FALSE; ! 42: case 0: ! 43: close(2); ! 44: dup(1, 2); ! 45: setlogname(user); ! 46: execl(RLOGIN, RLOGIN, path, NULL); ! 47: perror("exec failed"); ! 48: exit(100); ! 49: default: ! 50: /* do we need a timeout? */ ! 51: wait(&status); ! 52: if (((status >> 8) & 0xFF) != 0) { ! 53: ! 54: return FALSE; ! 55: } ! 56: return TRUE; ! 57: } ! 58: } ! 59: ! 60: redial(path, user, svc) ! 61: char *path, *user, *svc; ! 62: { ! 63: ipcinfo info; ! 64: char buf[100]; ! 65: ! 66: /* The options are U (for gnots) and - (for us) */ ! 67: ! 68: strcpy(buf, "->"); ! 69: strcat(buf, path); ! 70: ! 71: strcpy(buf, "->"); ! 72: if (strncmp(path, "dk!", 3) == NULL) ! 73: path += 3; ! 74: strcat(buf, path); ! 75: ! 76: info.rfd = -1; ! 77: info.cfd = 0; /* pass back fd 0 */ ! 78: info.myname = NULL; ! 79: info.user = user; ! 80: info.machine = ""; ! 81: info.uid = info.gid = -1; ! 82: info.name = ipcpath(buf, "/cs/dk", svc); ! 83: info.param = "light"; /* bogus */ ! 84: info.flags = 0; ! 85: if(ipcredial(&info) != 0) { ! 86: fprintf(stderr, "Redial failed, destination was %s\n", info.name); ! 87: } ! 88: } ! 89: ! 90: ! 91: #ifdef notused ! 92: int ! 93: dkcall(path) ! 94: char *path; ! 95: { ! 96: char *fullpath, *service; ! 97: ! 98: fullpath = ipcpath(path, "dk", "dcon"); ! 99: service = strrchr(fullpath, "!"); ! 100: service++; ! 101: ! 102: if (strcmp(service, "dcon") == 0) { /* try a dcon */ ! 103: char answer[2]; ! 104: ! 105: callee = ipcopen(fullpath, "light"); ! 106: if (callee >= 0) { ! 107: read(callee, answer, 2); ! 108: if (strcmp(answer, "OK") == 0) ! 109: return callee; /* dcon likes us */ ! 110: } ! 111: } ! 112: ! 113: fullpath = ipcpath(path, "dk", ""); ! 114: callee = ipcopen(fullpath, "light"); ! 115: return callee; ! 116: } ! 117: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.