|
|
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: if (*cp == '\0') ! 117: return (&dkmgrmsg) ; ! 118: dkmgrmsg.m_source = cp ; ! 119: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ; ! 120: if (*cp == '.') { ! 121: *cp++ = '\0' ; ! 122: dkmgrmsg.m_uid = cp ; ! 123: } ! 124: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ; ! 125: if (*cp == '.') { ! 126: *cp++ = '\0' ; ! 127: dkmgrmsg.m_param1 = cp ; ! 128: } ! 129: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ; ! 130: if (*cp == '.') { ! 131: *cp++ = '\0' ; ! 132: dkmgrmsg.m_param2 = cp ; ! 133: } ! 134: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ; ! 135: if (*cp == '\n') { /* 3-liner from generic 2 VCS node */ ! 136: dkmgrmsg.m_param2 = dkmgrmsg.m_param1 ; ! 137: dkmgrmsg.m_param1 = dkmgrmsg.m_uid ; ! 138: dkmgrmsg.m_uid = dkmgrmsg.m_source ; ! 139: *cp++ = '\0' ; ! 140: dkmgrmsg.m_source = cp ; ! 141: while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ; ! 142: } ! 143: *cp++ = '\0' ; ! 144: return (&dkmgrmsg) ; ! 145: } ! 146: ! 147: dkmgrack(chan) ! 148: { ! 149: struct listenin d ; ! 150: ! 151: d.l_lchan = 1 ; ! 152: d.l_type = T_REPLY ; ! 153: d.l_srv = D_OPEN ; ! 154: d.l_param0 = chan ; ! 155: d.l_param1 = 0 ; ! 156: d.l_param2 = chan ; ! 157: d.l_param3 = dkmgrmsg.m_tstamp ; ! 158: d.l_param4 = 0 ; ! 159: d.l_param5 = 0 ; ! 160: write(dkmgrreply, &d, sizeof(d)) ; ! 161: } ! 162: ! 163: ! 164: dkmgrnak(chan, error) ! 165: { ! 166: struct listenin d ; ! 167: ! 168: d.l_lchan = 1 ; ! 169: d.l_type = T_REPLY ; ! 170: d.l_srv = D_FAIL ; ! 171: d.l_param0 = chan ; ! 172: d.l_param1 = error ; ! 173: d.l_param2 = chan ; ! 174: d.l_param3 = dkmgrmsg.m_tstamp ; ! 175: d.l_param4 = 0 ; ! 176: d.l_param5 = 0 ; ! 177: write(dkmgrreply, &d, sizeof(d)) ; ! 178: } ! 179: ! 180: nwait(ntries) ! 181: { ! 182: sleep(ntries<10?5:(ntries<20?30:600)) ; ! 183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.