Annotation of researchv8dc/netfs/dkstuff.c, revision 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.