|
|
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: #define MAXRETRIES 2
21:
22: struct mgrmsg *
23: dkmgr(mgrname, traffic)
24: char * mgrname ;
25: {
26: extern char *dkerror;
27: register fd ;
28: extern int errno ;
29: register char *cp ;
30: char *savcp ;
31:
32: ntries = 0;
33: again:
34: if (dkmgrreply <= 0) {
35: dkmgrreply = dkctlchan(0);
36: if (dkmgrreply < 0) {
37: fprintf(stderr, "MGR %s: cannot open channel 1\r\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: fd = tdkserv(mgrname, traffic) ;
48: if (fd < 0) {
49: fprintf(stderr, "dkmgr: can't create server %s (%s)\r\n",
50: mgrname, dkerror) ;
51: nwait(ntries);
52: if (ntries++ > MAXRETRIES)
53: exit (2);
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: return ((struct mgrmsg *)0);
62: }
63: errno = 0 ;
64: if (read(fd, dkmgribuf, 128) <= 0) {
65: if (errno == EINTR)
66: return NULL ;
67: close(fd) ; /* a host restart */
68: dkmgropen = 0 ;
69: close(dkmgrreply);
70: dkmgrreply = 0;
71: fprintf(stderr, "MGR %s: dk-eof, restarting\r\n",
72: mgrname) ;
73: return ((struct mgrmsg *)0);
74: }
75: cp = dkmgribuf ;
76: dkmgrmsg.m_chan = 0 ;
77: while (*cp >= '0' && *cp <= '7')
78: dkmgrmsg.m_chan = (dkmgrmsg.m_chan << 3) + (*cp++ & 07) ;
79: dkmgrmsg.m_tstamp = 0 ;
80: if (*cp == '.') {
81: cp++ ;
82: while (*cp >= '0' && *cp <= '7')
83: dkmgrmsg.m_tstamp =
84: (dkmgrmsg.m_tstamp << 3) + (*cp++ & 07) ;
85: }
86: dkmgrmsg.m_traffic = 0 ;
87: if (*cp == '.') {
88: cp++ ;
89: while (*cp >= '0' && *cp <= '7')
90: dkmgrmsg.m_traffic =
91: (dkmgrmsg.m_traffic << 3) + (*cp++ & 07) ;
92: }
93: if (*cp++ != '\n') {
94: fprintf(stderr, "mgr %s: bad incall message = %s\r\n", mgrname,
95: dkmgribuf) ;
96: goto again ;
97: }
98: dkmgrmsg.m_dial = cp ;
99: dkmgrmsg.m_service = NULL ;
100: while (*cp != '\n' && *cp != '\0' && *cp != '.')
101: cp++ ;
102: if (*cp == '.') {
103: *cp++ = '\0' ;
104: dkmgrmsg.m_service = cp ;
105: while (*cp != '\n' && *cp != '\0') cp++ ;
106: }
107: if (*cp == '\n')
108: *cp++ = '\0' ;
109: dkmgrmsg.m_traffic = 0 ;
110: dkmgrmsg.m_param1 = NULL ;
111: dkmgrmsg.m_param2 = NULL ;
112: dkmgrmsg.m_uid = NULL ;
113: dkmgrmsg.m_source = NULL ;
114: if (*cp == '\0')
115: return (&dkmgrmsg) ;
116: dkmgrmsg.m_source = cp ;
117: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
118: if (*cp == '.') {
119: *cp++ = '\0' ;
120: dkmgrmsg.m_uid = cp ;
121: }
122: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
123: if (*cp == '.') {
124: *cp++ = '\0' ;
125: dkmgrmsg.m_param1 = cp ;
126: }
127: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
128: if (*cp == '.') {
129: *cp++ = '\0' ;
130: dkmgrmsg.m_param2 = cp ;
131: }
132: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
133: *cp++ = '\0' ;
134: return (&dkmgrmsg) ;
135: }
136:
137: dkmgrack(chan)
138: {
139: struct listenin d ;
140:
141: d.l_lchan = 1 ;
142: d.l_type = T_REPLY ;
143: d.l_srv = D_OPEN ;
144: d.l_param0 = chan ;
145: d.l_param1 = 0 ;
146: d.l_param2 = chan ;
147: d.l_param3 = dkmgrmsg.m_tstamp ;
148: d.l_param4 = 0 ;
149: d.l_param5 = 0 ;
150: write(dkmgrreply, &d, sizeof(d)) ;
151: }
152:
153:
154: dkmgrnak(chan, error)
155: {
156: struct listenin d ;
157:
158: d.l_lchan = 1 ;
159: d.l_type = T_REPLY ;
160: d.l_srv = D_FAIL ;
161: d.l_param0 = chan ;
162: d.l_param1 = error ;
163: d.l_param2 = chan ;
164: d.l_param3 = dkmgrmsg.m_tstamp ;
165: d.l_param4 = 0 ;
166: d.l_param5 = 0 ;
167: write(dkmgrreply, &d, sizeof(d)) ;
168: }
169:
170: nwait(ntries)
171: {
172: sleep(ntries<10?5:(ntries<20?30:600)) ;
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.