Annotation of researchv10no/netfs/libnetb/runfs.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * run and mount a netb file server,
                      3:  * including the uid-login name handshake protocol
                      4:  */
                      5: #include <stdio.h>
                      6: #include <signal.h>
                      7: #include <errno.h>
                      8: #include <pwd.h>
                      9: #include <grp.h>
                     10: #include <sys/types.h> /* for makedev */
                     11: 
                     12: #define        NBFS    4       /* for fmount */
                     13: 
                     14: /*
                     15:  * setup handshake parameters
                     16:  */
                     17: #define        MAXMSG  5       /* largest message 5*MSGBLOCK -- known to kernel too */
                     18: #define        MSGBLOCK 1024
                     19: 
                     20: int debug;     /* debug level, for server */
                     21: 
                     22: char *estr();
                     23: 
                     24: main(argc, argv)
                     25: int argc;
                     26: char **argv;
                     27: {
                     28:        int pfd[2];
                     29:        int pid;
                     30:        int sts;
                     31: 
                     32:        while (--argc > 0 && **++argv == '-') {
                     33:                switch (argv[0][1]) {
                     34:                case 'd':
                     35:                        debug = atoi(&argv[0][2]);
                     36:                        break;
                     37: 
                     38:                default:
                     39:                        fprintf(stderr, "unknown flag %s ignored\n", argv[0]);
                     40:                        break;
                     41:                }
                     42:        }
                     43:        if (argc < 2) {
                     44:                fprintf(stderr, "usage: runfs [-dlevel] mpoint server arg ...\n");
                     45:                exit(1);
                     46:        }
                     47:        if (pipe(pfd) < 0) {
                     48:                perror("pipe");
                     49:                exit(1);
                     50:        }
                     51:        if ((pid = fork()) < 0) {
                     52:                perror("fork");
                     53:                exit(1);
                     54:        }
                     55:        /*
                     56:         * child: run setup handshake, mount filesystem
                     57:         */
                     58:        if (pid == 0) {
                     59:                close(pfd[1]);  /* for clean error */
                     60:                sts = setup(pfd[0], argv[0]);
                     61:                exit(sts);
                     62:        }
                     63:        /*
                     64:         * parent: exec server
                     65:         */
                     66:        close(pfd[0]);
                     67:        dup2(pfd[1], 0);
                     68:        dup2(pfd[1], 1);
                     69:        close(pfd[1]);
                     70:        execv(argv[1], &argv[1]);
                     71:        fprintf(stderr, "exec %s: %s\n", argv[1], estr());
                     72:        exit(1);
                     73: }
                     74: 
                     75: /*
                     76:  * initial protocol with server:
                     77:  * client sends 16 bytes:
                     78:  *     max buffer size in 1024-byte units
                     79:  *     device number in use
                     80:  *     protocol letter
                     81:  *     debugging flag
                     82:  *     12 unused
                     83:  * server sends one byte: 1
                     84:  * client sends a list of userids: maxsize bytes
                     85:  *     if list won't fit in one buffer, last username is `:'
                     86:  *     server acks with one byte 012; client sends more
                     87:  * server sends one byte: 2
                     88:  * client sends a list of groupids: maxsize bytes
                     89:  *     if list won't fit in one buffer, last groupname is `:'
                     90:  *     server acks with one byte 013; client sends more
                     91:  * server sends one byte: 3
                     92:  * then we mount it, and further messages come from the kernel
                     93:  */
                     94: 
                     95: #define        M1LEN   16
                     96: 
                     97: setup(fd, mpoint)
                     98: int fd;
                     99: char *mpoint;
                    100: {
                    101:        char m[M1LEN];
                    102:        register int n;
                    103: 
                    104:        signal(SIGPIPE, SIG_DFL);
                    105:        memset(m, 0, M1LEN);
                    106:        m[0] = MAXMSG;
                    107: /*     m[1] = fp->devnum;. */
                    108:        m[1] = 0;       /* will this work? */
                    109:        m[2] = 'd';     /* ignored by server? */
                    110:        m[3] = debug;
                    111:        alarm(600);
                    112:        if ((n = write(fd, m, M1LEN)) != M1LEN) {
                    113:                fprintf(stderr, "setup 1: write returned %d; %s\n", n, estr());
                    114:                alarm(0);
                    115:                return (-1);
                    116:        }
                    117:        if (getresp(fd, 1, mpoint) == 0)
                    118:                return (-1);
                    119:        alarm(600);
                    120:        if (senduid(fd, mpoint) < 0) {
                    121:                alarm(0);
                    122:                return (-1);
                    123:        }
                    124:        alarm(600);
                    125:        if (sendgid(fd, mpoint) < 0) {
                    126:                alarm(0);
                    127:                return (-1);
                    128:        }
                    129:        alarm(60);
                    130:        alarm(60);
                    131:        funmount(mpoint);       /* bad -- might unmount wrong fs */
                    132:        if (trymount(fd, mpoint) < 0) {
                    133:                fprintf(stderr, "fmount: %s: %s\n", mpoint, estr());
                    134:                alarm(0);
                    135:                return (-1);
                    136:        }
                    137:        alarm(0);
                    138:        return (0);
                    139: }
                    140: 
                    141: /*
                    142:  * fmount, but try to guess unique device number
                    143:  */
                    144: 
                    145: int
                    146: trymount(fd, mpoint)
                    147: int fd;
                    148: char *mpoint;
                    149: {
                    150:        register int dev;
                    151: 
                    152:        for (dev = 200; dev >= 100; --dev) {
                    153:                if (fmount(NBFS, fd, mpoint, makedev(dev, 0)) >= 0)
                    154:                        return (0);
                    155:                if (errno != EBUSY)
                    156:                        return (-1);
                    157:        }
                    158:        return (-1);
                    159: }
                    160: 
                    161: getresp(fd, id, mpoint)
                    162: int fd, id;
                    163: {
                    164:        register int n;
                    165:        char m;
                    166: 
                    167:        alarm(600);
                    168:        n = read(fd, &m, 1);
                    169:        alarm(0);       /* assume errno untouched */
                    170:        if (n != 1) {
                    171:                fprintf(stderr, "setup %d: %s: read returned %d: %s\n", id, mpoint, n, estr());
                    172:                return (0);
                    173:        }
                    174:        if (m != id) {
                    175:                fprintf(stderr, "setup %d: %s: received %d (%c)\n", id, mpoint, (unsigned char)m, m);
                    176:                return (0);
                    177:        }
                    178:        return (1);
                    179: }
                    180: 
                    181: #define        SLOP    50
                    182: 
                    183: senduid(fd, mpoint)
                    184: int fd;
                    185: char *mpoint;
                    186: {
                    187:        char idbuf[MAXMSG*MSGBLOCK+SLOP];
                    188:        char onebuf[SLOP];
                    189:        register char *p;
                    190:        register struct passwd *pw;
                    191:        register int n, wn;
                    192: 
                    193:        setpwent();
                    194:        p = idbuf;
                    195:        while ((pw = getpwent()) != NULL) {
                    196:                sprintf(onebuf, "%s %d\n", pw->pw_name, pw->pw_uid);
                    197:                n = strlen(onebuf);
                    198:                if (n > &idbuf[MAXMSG*MSGBLOCK] - p - 4) { /* room for ": 1\n" */
                    199:                        strcpy(p, ": 1\n");     /* `more coming' */
                    200:                        if ((wn = write(fd, idbuf, MAXMSG*MSGBLOCK)) != MAXMSG*MSGBLOCK) {
                    201:                                fprintf(stderr, "%s: write uid: %d; %s\n", mpoint, wn, estr());
                    202:                                return (-1);
                    203:                        }
                    204:                        if (getresp(fd, 012, mpoint) == 0)
                    205:                                return (-1);
                    206:                        p = idbuf;
                    207:                }
                    208:                strcpy(p, onebuf);
                    209:                p += n;
                    210:        }
                    211:        endpwent();
                    212:        if ((wn = write(fd, idbuf, MAXMSG*MSGBLOCK)) != MAXMSG*MSGBLOCK) {
                    213:                fprintf(stderr, "%s: write uid: %d; %s\n", mpoint, wn, estr());
                    214:                return (-1);
                    215:        }
                    216:        if (getresp(fd, 2, mpoint) == 0)
                    217:                return (-1);
                    218:        return (0);
                    219: }
                    220: 
                    221: sendgid(fd, mpoint)
                    222: int fd;
                    223: char *mpoint;
                    224: {
                    225:        char idbuf[MAXMSG*MSGBLOCK+SLOP];
                    226:        char onebuf[SLOP];
                    227:        register char *p;
                    228:        register struct group *gr;
                    229:        register int n, wn;
                    230: 
                    231:        setgrent();
                    232:        p = idbuf;
                    233:        while ((gr = getgrent()) != NULL) {
                    234:                sprintf(onebuf, "%s %d\n", gr->gr_name, gr->gr_gid);
                    235:                n = strlen(onebuf);
                    236:                if (n > &idbuf[MAXMSG*MSGBLOCK] - p - 4) { /* room for ": 1\n" */
                    237:                        strcpy(p, ": 1\n");     /* `more coming' */
                    238:                        if ((wn = write(fd, idbuf, MAXMSG*MSGBLOCK)) != MAXMSG*MSGBLOCK) {
                    239:                                fprintf(stderr, "%s: write gid: %d; %s\n", mpoint, wn, estr());
                    240:                                return (-1);
                    241:                        }
                    242:                        if (getresp(fd, 013, mpoint) == 0)
                    243:                                return (-1);
                    244:                        p = idbuf;
                    245:                }
                    246:                strcpy(p, onebuf);
                    247:                p += n;
                    248:        }
                    249:        endgrent();
                    250:        if ((wn = write(fd, idbuf, MAXMSG*MSGBLOCK)) != MAXMSG*MSGBLOCK) {
                    251:                fprintf(stderr, "%s: write gid: %d; %s\n", mpoint, wn, estr());
                    252:                return (-1);
                    253:        }
                    254:        if (getresp(fd, 3, mpoint) == 0)
                    255:                return (-1);
                    256:        return (0);
                    257: }
                    258: 
                    259: 
                    260: char *
                    261: estr()
                    262: {
                    263:        static char buf[] = "Error -2147483648";
                    264: 
                    265:        if (errno < 0 || errno >= sys_nerr) {
                    266:                sprintf(buf, "Error %d", errno);
                    267:                return (buf);
                    268:        }
                    269:        return (sys_errlist[errno]);
                    270: }

unix.superglobalmegacorp.com

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