Annotation of researchv9/netb/src/setup.c, revision 1.1

1.1     ! root        1: /* the client set up end of the connection */
        !             2: /* the first message is 16 bytes, (buf-len in 1024's, dev, prot, dbg, 13 unused)
        !             3:  * the second message is the client's passwd file (name uid '\n') and zeros
        !             4:  * the third message is client's gid's and zeros
        !             5:  * each of these is acked by a single byte of 1, 2, resp 3.
        !             6:  */
        !             7: #include "share.h"
        !             8: #include "pwd.h"
        !             9: #include "grp.h"
        !            10: struct stat rootstat;
        !            11: extern int errno;
        !            12: extern char *sys_errlist[];
        !            13: int dbgfd = 2, devnum;
        !            14: 
        !            15: /* setup host-name remote-server-to-execute mount-point protocol[dt] */
        !            16: main(argc, argv)
        !            17: char **argv;
        !            18: {      int fd;
        !            19:        if(argc != 6 && argc != 7)
        !            20:                fatal("usage: setup host server mount protocol devnum [dbg]\n");
        !            21:        switch(argv[4][0]) {
        !            22:        default:        /* cf /n/bowell/usr/jerq/src/sam/io.c */
        !            23:                fatal("weird net type %s\n", argv[4]);
        !            24:        case 'd':       /* datakit */
        !            25: #ifdef OLD
        !            26:                fd = tdkexec(argv[1], argv[2]);
        !            27: #else
        !            28:                fd = ipcopen(ipcpath(argv[1], "dk", "fsb"), "heavy");
        !            29: #endif
        !            30:                break;
        !            31:        case 't':
        !            32: #ifdef OLD
        !            33:                fd = tcp_rcmd(argv[1], "shell", "pjw", "pjw", "share/zarf", 0);
        !            34: #else
        !            35:                fd = ipcrexec(argv[1], "heavy", argv[2]);
        !            36: #endif
        !            37:                break;
        !            38:        }
        !            39:        devnum = atoi(argv[5]);
        !            40:        errno = 0;
        !            41:        if(fd >= 0)
        !            42:                setup(fd, argv[3], argv[4], argc == 7? argv[6]: 0);
        !            43:        else
        !            44:                perror("couldn't call");
        !            45:        debug("setup(%s,%s,%s,%s) errno %d\n", argv[1], argv[2], argv[3], argv[4],
        !            46:                errno);
        !            47: }
        !            48: 
        !            49: char msg[16];
        !            50: setup(fd, dir, net, dbg)
        !            51: char *dir, *net;
        !            52: {      struct stat stb;
        !            53:        int i;
        !            54:        if(stat(dir, &rootstat) < 0)
        !            55:                fatal("setup: couldn't stat dir %d\n", dir);
        !            56:        msg[0] = 5;     /* 5*1024 is the largest message i'll send */
        !            57:                /* that number is known in the kernel in netb.c */
        !            58:        msg[1] = devnum;        /* client dev, when shifted left 8 */
        !            59:        msg[2] = net[0];        /* so server knows about messages */
        !            60:        msg[3] = dbg;
        !            61: #if mc68000
        !            62:        msg[4] = 's';
        !            63: #endif
        !            64: #if vax
        !            65:        msg[4] = 'v';
        !            66: #endif
        !            67: #if cray
        !            68:        msg[4] = 'c';
        !            69: #endif
        !            70:        /* the next 12 bytes could be used for authentication or something */
        !            71:        i = write(fd, msg, 16);
        !            72:        if(i != 16)
        !            73:                fatal("write on setup returned %d\n", i);
        !            74:        i = read(fd, msg, 16);
        !            75:        if(i != 1)
        !            76:                fatal("read on setup returned %d |%s|\n", i, msg);
        !            77:        if(msg[0] != 1)
        !            78:                fatal("setup read char %d\b", msg[0]);
        !            79:        /* whew, paranoia is costly, and they're still out there */
        !            80:        /* now send uid table */
        !            81:        senduid(fd);
        !            82:        /* now send gid table */
        !            83:        sendgid(fd);
        !            84:        i = fmount(4 /*fstyp*/, fd, dir, devnum<<8);
        !            85:        if(i < 0)
        !            86:                fatal("gmount returned %d, errno %d:%s\n", i, errno, sys_errlist[errno]);
        !            87:        /* and that's that */
        !            88: }
        !            89: 
        !            90: char uidbuf[5*1024];   /* 1024*msg[0] */
        !            91: senduid(cfd)
        !            92: {      struct passwd *p;
        !            93:        char *s = uidbuf, *t;
        !            94:        int i;
        !            95:        while(p = getpwent()) {
        !            96:                for(t = p->pw_name; *t; t++)
        !            97:                        *s++ = *t;
        !            98:                *s++ = ' ';
        !            99:                sprintf(s, "%d\n", p->pw_uid);
        !           100:                while(*s)
        !           101:                        s++;
        !           102:        }
        !           103:        endpwent();
        !           104:        *s++ = 0;
        !           105:        if(s >= uidbuf + sizeof(uidbuf))
        !           106:                fatal("client password file too big\n");
        !           107:        /* send and ack */
        !           108:        i = write(cfd, uidbuf, sizeof(uidbuf)); /* write has known length */
        !           109:        if(i != sizeof(uidbuf))
        !           110:                fatal("write uid %d (%d)\n", i, errno);
        !           111:        i = read(cfd, uidbuf, 16);
        !           112:        if(i != 1)
        !           113:                fatal("senduid ack read %d (%d)\n", i, errno);
        !           114:        if(uidbuf[0] != 2)
        !           115:                fatal("send uid ack was %d not 2\n", uidbuf[0]);
        !           116: }
        !           117: 
        !           118: sendgid(cfd)
        !           119: {      struct group *p;
        !           120:        char *s = uidbuf, *t;
        !           121:        int i;
        !           122:        for(i = 0; i < sizeof(uidbuf); i++)
        !           123:                uidbuf[i] = 0;
        !           124:        while(p = getgrent()) {
        !           125:                for(t = p->gr_name; *t; t++)
        !           126:                        *s++ = *t;
        !           127:                *s++ = ' ';
        !           128:                sprintf(s, "%d\n", p->gr_gid);
        !           129:                while(*s)
        !           130:                        s++;
        !           131:        }
        !           132:        endgrent();
        !           133:        *s++ = 0;
        !           134:        if(s >= uidbuf + sizeof(uidbuf))
        !           135:                fatal("client group file too big\n");
        !           136:        /* send and ack */
        !           137:        i = write(cfd, uidbuf, sizeof(uidbuf));
        !           138:        if(i != sizeof(uidbuf))
        !           139:                fatal("write gid %d (%d)\n", i, errno);
        !           140:        i = read(cfd, uidbuf, 16);
        !           141:        if(i != 1)
        !           142:                fatal("sendgid ack read %d (%d)\n", i, errno);
        !           143:        if(uidbuf[0] != 3)
        !           144:                fatal("send gid ack was %d not 2\n", uidbuf[0]);
        !           145: }
        !           146: 
        !           147: char msgbuf[1024];
        !           148: /* VARARGS1 */
        !           149: fatal(s, a, b, c, d, e, f)
        !           150: char *s;
        !           151: {
        !           152:        sprintf(msgbuf, s, a, b, c, d, e, f);
        !           153:        write(dbgfd, msgbuf, strlen(msgbuf));
        !           154:        exit(1);
        !           155: }
        !           156: 
        !           157: /* VARARGS1 */
        !           158: debug(s, a, b, c, d, e, f)
        !           159: char *s;
        !           160: {
        !           161:        sprintf(msgbuf, s, a, b, c, d, e, f);
        !           162:        write(dbgfd, msgbuf, strlen(msgbuf));
        !           163: }

unix.superglobalmegacorp.com

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