|
|
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.