Annotation of researchv8dc/netfs/dkstuff.c, revision 1.1.1.1

1.1       root        1: #include "fserv.h"
                      2: #include "dk.h"
                      3: #include "dkmgr.h"
                      4: #include "sys/ioctl.h"
                      5: #include "signal.h"
                      6: #include "errno.h"
                      7: 
                      8: extern int dkp_ld, rdk_ld;
                      9: extern int dkmgrreply; /* global variable for dkmgrack */
                     10: extern int dkmgropen;
                     11: char mgrbuf[128];
                     12: struct mgrmsg mesg;
                     13: char buf[1024];
                     14: 
                     15: announce(s)    /* hello world, here we are */
                     16: char *s;
                     17: {      int i, fd;
                     18: persist:
                     19:        for(i = 0; i < 5; i++) {
                     20:                fd = tdkserv(s, 2);
                     21:                if(fd < 0) {
                     22:                        debug("announce(%s) failed", s);
                     23:                        sleep(5);
                     24:                        continue;
                     25:                }
                     26:                dkmgropen = cntlfd = fd;
                     27:                debug("announce %d", cntlfd);
                     28:                dkproto(fd, dkp_ld);
                     29:                /*fd = open("/dev/dk/dk01", 2);*/
                     30:                fd = dkctlchan(2);
                     31:                if(fd < 0) {
                     32:                        perror("dkctlchan");
                     33:                        break;
                     34:                }
                     35:                dkmgrreply = ackfd = fd;
                     36:                debug("ackfd %d", ackfd);
                     37:                FD_SET(cntlfd, active);
                     38:                return;
                     39:        }
                     40:        debug("sleeping 100 and trying again");
                     41:        for(i = 4; i < NOFILE; i++)     /* smash some just in case */
                     42:                close(fd);
                     43:        sleep(100);
                     44:        goto persist;
                     45: }
                     46: 
                     47: newone()
                     48: {      int n, i, fd;
                     49:        char *p;
                     50:        n = read(cntlfd, mgrbuf, sizeof(mgrbuf));
                     51:        if(n < 0) {
                     52:                perror("select lied about control channel");
                     53:                exit(1);
                     54:        }
                     55:        if(n == 0) {
                     56:                debug("0 length read on control channel");
                     57:                debug("assuming datakit died, killing children");
                     58:                if(chdir("/usr/net") == -1)
                     59:                        chdir("/etc/net");
                     60:                for(i = 0; i < NORMAN; i++)
                     61:                        if(children[i].pid && children[i].flags == SPLIT)
                     62:                                kill(children[i].pid, SIGKILL);
                     63:                close(cntlfd);
                     64:                cntlfd = -1;
                     65:                return;
                     66:        }
                     67:        if(!readmgr())
                     68:                return;
                     69:        if(!(n = isfriend(mesg.m_source))) {
                     70:                debug("not friend, nak");
                     71: nakit:
                     72:                dkmgrnak(mesg.m_chan, 4);
                     73:                return;
                     74:        }
                     75:        for(i = 0; i < NORMAN; i++)
                     76:                if(children[i].who && strcmp(children[i].who, mesg.m_source) == 0) {
                     77:                        debug("already attached");
                     78:                        free(children[i].who);
                     79:                        children[i].who = 0;
                     80:                        /* some more? */
                     81:                        if (children[i].pid)
                     82:                                kill(children[i].pid, SIGKILL); /* who did we kill?*/
                     83:                        break;
                     84:                }
                     85:        /*sprintf(buf, "/dev/dk/dk%02d", mesg.m_chan);*/
                     86:        p = (char *) dkfilename(mesg.m_chan);
                     87:        if((fd = open(p, 2)) < 0) {
                     88:                perror(p);
                     89:                goto nakit;
                     90:        }
                     91:        if (fd >= NORMAN) {
                     92:                close(fd);
                     93:                debug("too many connections, nak");
                     94:                goto nakit;
                     95:        }
                     96:        if(children[fd].flags) {
                     97:                debug("opened %s twice", buf);
                     98:                debug("pid %d fd %d flags %d %s\n", children[fd].pid,
                     99:                        children[fd].fd, children[fd].flags,
                    100:                        children[fd].who);
                    101:                /* who should we believe?  the new one */
                    102:                if(children[fd].pid != 0)
                    103:                        kill(children[fd].pid, SIGKILL);
                    104:                /* did that pid exist, and was it us? */
                    105:        }
                    106:        children[fd].pid = 0;
                    107:        children[fd].fd = fd;
                    108:        children[fd].flags = UNINIT;
                    109:        children[fd].host = n;
                    110:        children[fd].lastheard = time(0);
                    111:        children[fd].who = malloc(strlen(mesg.m_source) + 1);
                    112:        strcpy(children[fd].who, mesg.m_source);
                    113:        debug("ok, %s (%d) on fd %d", mesg.m_source, n, fd);
                    114:        if((i = dkproto(fd, rdk_ld)) < 0) {
                    115:        /*if((i = ioctl(fd, FIOPUSHLD, &rdk_ld)) <0) {*/
                    116:                perror("rdk_ld");
                    117:                close(fd);
                    118:                goto nakit;
                    119:        }
                    120:        dkmgrack(mesg.m_chan);
                    121:        ioctl(fd, FIOPOPLD, 0);
                    122:        if((i = dkproto(fd, dkp_ld)) < 0) {
                    123:        /*if((i = ioctl(fd, FIOPUSHLD, &dkp_ld)) < 0) {*/
                    124:                perror("dkp_ld");
                    125:                close(fd);
                    126:                goto nakit;             /* clean up.  too late to nak */
                    127:        }
                    128:        FD_SET(fd, active);
                    129: }
                    130: 
                    131: #define skip   while(*p != '.' && *p && *p != '\n') p++
                    132: readmgr()
                    133: {      char *p;
                    134:        debug("mgrbuf: %s", mgrbuf);
                    135:        p = mgrbuf;
                    136:        mesg.m_chan = 0;
                    137:        while(*p >= '0' && *p <= '7')
                    138:                mesg.m_chan = mesg.m_chan * 8 + *p++ - '0';
                    139:        if(mesg.m_chan == 0) {
                    140:                debug("incall wanted channel 0");
                    141:                return(0);
                    142:        }
                    143:        while(*p && *p != '\n')
                    144:                p++;
                    145:        if(*p++ != '\n') {
                    146:                debug("bad incall message %s", mgrbuf);
                    147:                return(0);
                    148:        }
                    149:        mesg.m_dial = p;
                    150:        mesg.m_service = 0;
                    151:        skip;
                    152:        if(*p == '.') {
                    153:                *p++ = 0;
                    154:                mesg.m_service = p;
                    155:                while(*p != '\n' && *p)
                    156:                        p++;
                    157:        }
                    158:        if(*p == '\n')
                    159:                *p++ = 0;
                    160:        mesg.m_param1 = 0;
                    161:        mesg.m_param2 = 0;
                    162:        mesg.m_uid = 0;
                    163:        mesg.m_source = 0;
                    164:        if(*p == 0) {
                    165:                dkmgrnak(mesg.m_chan, 4);
                    166:                debug("nak, no source");
                    167:                return(0);
                    168:        }
                    169:        /* two forms for source and uid are:
                    170:         *      uid
                    171:         *      source
                    172:         * and
                    173:         *      source.uid
                    174:         */
                    175:        mesg.m_source = p;
                    176:        skip;
                    177:        if(*p == '.') {
                    178:                /* form 2 */
                    179:                *p++ = 0;
                    180:                mesg.m_uid = p;
                    181:        } else {
                    182:                /* form 1 */
                    183:                *p++ = 0;
                    184:                mesg.m_uid = mesg.m_source;
                    185:                mesg.m_source = p;
                    186:        }
                    187:        skip;
                    188:        *p++ = 0;
                    189:        /* ignore the rest */
                    190:        return(1);
                    191: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.