|
|
1.1 root 1: /*
2: * setup a datakit manager process
3: * and receive requests for its service.
4: */
5:
6: #include <dk.h>
7: #include <dkmgr.h>
8: #include <sys/ioctl.h>
9: #include <stdio.h>
10: #include <errno.h>
11:
12: char dkmgribuf[128] ;
13: int dkmgropen = 0 ;
14: int dkmgrreply = 0 ;
15: int ntries = 0;
16: struct mgrmsg dkmgrmsg ;
17: extern int dkp_ld ;
18: extern int rdk_ld ;
19:
20:
21:
22: struct mgrmsg *
23: dkmgr(mgrname, traffic)
24: char * mgrname ;
25: {
26: register fd ;
27: extern int errno ;
28: register char *cp ;
29: char *savcp ;
30: int i;
31:
32: ntries = 0;
33: again:
34: if (dkmgrreply <= 0) {
35: dkmgrreply = dkctlchan(traffic) ;
36: if (dkmgrreply < 0) {
37: fprintf(stderr, "MGR %s: cannot open control chan\n",
38: mgrname) ;
39: if (ntries==0)
40: exit(1);
41: nwait(ntries);
42: ntries++;
43: goto again;
44: }
45: }
46: if ((fd = dkmgropen) == 0) {
47: extern char *dkerror;
48: fd = tdkserv(mgrname, traffic) ;
49: if (fd < 0) {
50: fprintf(stderr, "dkmgr: can't create server %s (%s)\n",
51: mgrname, dkerror) ;
52: nwait(ntries);
53: ntries++;
54: goto again ;
55: }
56: dkmgropen = fd ;
57: fprintf(stderr, "MGR %s: successful initialization\r\n",
58: mgrname) ;
59: dkproto(fd, dkp_ld);
60: ntries = 0;
61: }
62: errno = 0 ;
63: if ((i= read(fd, dkmgribuf, 128)) <= 0) {
64: if (errno == EINTR)
65: return NULL ;
66: close(fd) ; /* a host restart */
67: dkmgropen = 0 ;
68: close(dkmgrreply);
69: dkmgrreply = 0;
70: fprintf(stderr, "MGR %s: dk-eof, restarting\r\n",
71: mgrname) ;
72: ntries = 1;
73: sleep(30);
74: goto again ;
75: }
76: dkmgribuf[i] = '\0';
77: cp = dkmgribuf ;
78: dkmgrmsg.m_chan = 0 ;
79: while (*cp >= '0' && *cp <= '7')
80: dkmgrmsg.m_chan = (dkmgrmsg.m_chan << 3) + (*cp++ & 07) ;
81: dkmgrmsg.m_tstamp = 0 ;
82: if (*cp == '.') {
83: cp++ ;
84: while (*cp >= '0' && *cp <= '7')
85: dkmgrmsg.m_tstamp =
86: (dkmgrmsg.m_tstamp << 3) + (*cp++ & 07) ;
87: }
88: dkmgrmsg.m_traffic = 0 ;
89: if (*cp == '.') {
90: cp++ ;
91: while (*cp >= '0' && *cp <= '7')
92: dkmgrmsg.m_traffic =
93: (dkmgrmsg.m_traffic << 3) + (*cp++ & 07) ;
94: }
95: if (*cp++ != '\n') {
96: fprintf(stderr, "bad char %o: ", cp[-1]);
97: fprintf(stderr, "mgr %s: bad incall message = %s\r\n", mgrname,
98: dkmgribuf) ;
99: goto again ;
100: }
101: dkmgrmsg.m_dial = cp ;
102: dkmgrmsg.m_service = NULL ;
103: while (*cp != '\n' && *cp != '\0' && *cp != '.')
104: cp++ ;
105: if (*cp == '.') {
106: *cp++ = '\0' ;
107: dkmgrmsg.m_service = cp ;
108: while (*cp != '\n' && *cp != '\0') cp++ ;
109: }
110: if (*cp == '\n')
111: *cp++ = '\0' ;
112: dkmgrmsg.m_param1 = NULL ;
113: dkmgrmsg.m_param2 = NULL ;
114: dkmgrmsg.m_uid = NULL ;
115: dkmgrmsg.m_source = NULL ;
116: dkmgrmsg.m_origin = NULL ;
117: if (*cp == '\0')
118: return (&dkmgrmsg) ;
119: dkmgrmsg.m_source = cp ;
120: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
121: if (*cp == '.') {
122: *cp++ = '\0' ;
123: dkmgrmsg.m_uid = cp ;
124: }
125: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
126: if (*cp == '.') {
127: *cp++ = '\0' ;
128: dkmgrmsg.m_param1 = cp ;
129: }
130: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
131: if (*cp == '.') {
132: *cp++ = '\0' ;
133: dkmgrmsg.m_param2 = cp ;
134: }
135: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
136: if (*cp == '\n') { /* 3-liner from generic 2 VCS node */
137: dkmgrmsg.m_param2 = dkmgrmsg.m_param1 ;
138: dkmgrmsg.m_param1 = dkmgrmsg.m_uid ;
139: dkmgrmsg.m_uid = dkmgrmsg.m_source ;
140: *cp++ = '\0' ;
141: dkmgrmsg.m_source = cp ;
142: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
143: if (*cp == '.') {
144: *cp++ = 0 ;
145: dkmgrmsg.m_origin = cp ;
146: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
147: if (*cp == '.') cp++ ; /* end of node name */
148: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
149: if (*cp == '.') cp++ ; /* end of mod number */
150: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
151: /* end of chan number */
152: }
153: }
154: *cp++ = '\0' ;
155: return (&dkmgrmsg) ;
156: }
157:
158: dkmgrack(chan)
159: {
160: struct listenin d ;
161:
162: d.l_lchan = 1 ;
163: d.l_type = T_REPLY ;
164: d.l_srv = D_OPEN ;
165: d.l_param0 = chan ;
166: d.l_param1 = 0 ;
167: d.l_param2 = chan ;
168: d.l_param3 = dkmgrmsg.m_tstamp ;
169: d.l_param4 = 0 ;
170: d.l_param5 = 0 ;
171: write(dkmgrreply, &d, sizeof(d)) ;
172: }
173:
174:
175: dkmgrnak(chan, error)
176: {
177: struct listenin d ;
178:
179: d.l_lchan = 1 ;
180: d.l_type = T_REPLY ;
181: d.l_srv = D_FAIL ;
182: d.l_param0 = chan ;
183: d.l_param1 = error ;
184: d.l_param2 = chan ;
185: d.l_param3 = dkmgrmsg.m_tstamp ;
186: d.l_param4 = 0 ;
187: d.l_param5 = 0 ;
188: write(dkmgrreply, &d, sizeof(d)) ;
189: }
190:
191: nwait(ntries)
192: {
193: sleep(ntries<10?5:(ntries<20?30:600)) ;
194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.