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