|
|
researchv10 Norman
/*
* setup a datakit manager process
* and receive requests for its service.
*/
#include <dk.h>
#include <dkmgr.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <errno.h>
char dkmgribuf[128] ;
int dkmgropen = 0 ;
int dkmgrreply = 0 ;
int ntries = 0;
struct mgrmsg dkmgrmsg ;
extern int dkp_ld ;
extern int rdk_ld ;
struct mgrmsg *
dkmgr(mgrname, traffic)
char * mgrname ;
{
register fd ;
extern int errno ;
register char *cp ;
char *savcp ;
int i;
ntries = 0;
again:
if (dkmgrreply <= 0) {
dkmgrreply = dkctlchan(traffic) ;
if (dkmgrreply < 0) {
fprintf(stderr, "MGR %s: cannot open control chan\n",
mgrname) ;
if (ntries==0)
exit(1);
nwait(ntries);
ntries++;
goto again;
}
}
if ((fd = dkmgropen) == 0) {
extern char *dkerror;
fd = tdkserv(mgrname, traffic) ;
if (fd < 0) {
fprintf(stderr, "dkmgr: can't create server %s (%s)\n",
mgrname, dkerror) ;
nwait(ntries);
ntries++;
goto again ;
}
dkmgropen = fd ;
fprintf(stderr, "MGR %s: successful initialization\r\n",
mgrname) ;
dkproto(fd, dkp_ld);
ntries = 0;
}
errno = 0 ;
if ((i= read(fd, dkmgribuf, 128)) <= 0) {
if (errno == EINTR)
return NULL ;
close(fd) ; /* a host restart */
dkmgropen = 0 ;
close(dkmgrreply);
dkmgrreply = 0;
fprintf(stderr, "MGR %s: dk-eof, restarting\r\n",
mgrname) ;
ntries = 1;
sleep(30);
goto again ;
}
dkmgribuf[i] = '\0';
cp = dkmgribuf ;
dkmgrmsg.m_chan = 0 ;
while (*cp >= '0' && *cp <= '7')
dkmgrmsg.m_chan = (dkmgrmsg.m_chan << 3) + (*cp++ & 07) ;
dkmgrmsg.m_tstamp = 0 ;
if (*cp == '.') {
cp++ ;
while (*cp >= '0' && *cp <= '7')
dkmgrmsg.m_tstamp =
(dkmgrmsg.m_tstamp << 3) + (*cp++ & 07) ;
}
dkmgrmsg.m_traffic = 0 ;
if (*cp == '.') {
cp++ ;
while (*cp >= '0' && *cp <= '7')
dkmgrmsg.m_traffic =
(dkmgrmsg.m_traffic << 3) + (*cp++ & 07) ;
}
if (*cp++ != '\n') {
fprintf(stderr, "bad char %o: ", cp[-1]);
fprintf(stderr, "mgr %s: bad incall message = %s\r\n", mgrname,
dkmgribuf) ;
goto again ;
}
dkmgrmsg.m_dial = cp ;
dkmgrmsg.m_service = NULL ;
while (*cp != '\n' && *cp != '\0' && *cp != '.')
cp++ ;
if (*cp == '.') {
*cp++ = '\0' ;
dkmgrmsg.m_service = cp ;
while (*cp != '\n' && *cp != '\0') cp++ ;
}
if (*cp == '\n')
*cp++ = '\0' ;
dkmgrmsg.m_param1 = NULL ;
dkmgrmsg.m_param2 = NULL ;
dkmgrmsg.m_uid = NULL ;
dkmgrmsg.m_source = NULL ;
dkmgrmsg.m_origin = NULL ;
if (*cp == '\0')
return (&dkmgrmsg) ;
dkmgrmsg.m_source = cp ;
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '.') {
*cp++ = '\0' ;
dkmgrmsg.m_uid = cp ;
}
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '.') {
*cp++ = '\0' ;
dkmgrmsg.m_param1 = cp ;
}
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '.') {
*cp++ = '\0' ;
dkmgrmsg.m_param2 = cp ;
}
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '\n') { /* 3-liner from generic 2 VCS node */
dkmgrmsg.m_param2 = dkmgrmsg.m_param1 ;
dkmgrmsg.m_param1 = dkmgrmsg.m_uid ;
dkmgrmsg.m_uid = dkmgrmsg.m_source ;
*cp++ = '\0' ;
dkmgrmsg.m_source = cp ;
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '.') {
*cp++ = 0 ;
dkmgrmsg.m_origin = cp ;
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '.') cp++ ; /* end of node name */
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
if (*cp == '.') cp++ ; /* end of mod number */
while (*cp != '.' && *cp != '\0' && *cp != '\n') cp++ ;
/* end of chan number */
}
}
*cp++ = '\0' ;
return (&dkmgrmsg) ;
}
dkmgrack(chan)
{
struct listenin d ;
d.l_lchan = 1 ;
d.l_type = T_REPLY ;
d.l_srv = D_OPEN ;
d.l_param0 = chan ;
d.l_param1 = 0 ;
d.l_param2 = chan ;
d.l_param3 = dkmgrmsg.m_tstamp ;
d.l_param4 = 0 ;
d.l_param5 = 0 ;
write(dkmgrreply, &d, sizeof(d)) ;
}
dkmgrnak(chan, error)
{
struct listenin d ;
d.l_lchan = 1 ;
d.l_type = T_REPLY ;
d.l_srv = D_FAIL ;
d.l_param0 = chan ;
d.l_param1 = error ;
d.l_param2 = chan ;
d.l_param3 = dkmgrmsg.m_tstamp ;
d.l_param4 = 0 ;
d.l_param5 = 0 ;
write(dkmgrreply, &d, sizeof(d)) ;
}
nwait(ntries)
{
sleep(ntries<10?5:(ntries<20?30:600)) ;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.