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