Annotation of researchv10no/cmd/mount.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <fstab.h>
        !             3: #include <string.h>
        !             4: #include <libc.h>
        !             5: 
        !             6: /*
        !             7:  * mount
        !             8:  */
        !             9: 
        !            10: #define        NMOUNT  64
        !            11: 
        !            12: struct mtab mtab[NMOUNT];
        !            13: 
        !            14: main(argc, argv)
        !            15: int argc;
        !            16: char **argv;
        !            17: {
        !            18:        register struct mtab *mp;
        !            19:        register struct fstab *fsp;
        !            20:        int type, flag;
        !            21:        char *spec, *file;
        !            22:        int mf;
        !            23:        int mountall = 0;
        !            24: 
        !            25:        mf = open(MTAB, 0);
        !            26:        read(mf, (char *)mtab, sizeof(mtab));
        !            27:        close(mf);
        !            28:        if (argc == 1) {
        !            29:                for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
        !            30:                        if (mp->file[0]) {
        !            31:                                printf("%s on %s", mp->spec, mp->file);
        !            32:                                if (mp->type)
        !            33:                                        printf(" type %d", mp->type);
        !            34:                                printf("\n");
        !            35:                        }
        !            36:                exit(0);
        !            37:        }
        !            38:        if (argc == 2){
        !            39:                if (strcmp(argv[1], "-a") == 0)
        !            40:                        mountall++;
        !            41:                else {
        !            42:                        fprintf(stderr, "usage: mount [-a] [special mountpoint [-r] [type flag]\n");
        !            43:                        exit(1);
        !            44:                }
        !            45:        }
        !            46:        if (!mountall){
        !            47:                type = flag = 0;
        !            48:                spec = argv[1];
        !            49:                file = argv[2];
        !            50:                if (argc > 3 && strcmp(argv[3], "-r") == 0) {   /* hack */
        !            51:                        flag = 1;
        !            52:                        argc--;
        !            53:                        argv++;
        !            54:                }
        !            55:                if (argc > 3)
        !            56:                        type = atoi(argv[3]);
        !            57:                if (argc > 4)
        !            58:                        flag = atoi(argv[4]);
        !            59:                if (mountfs(spec, file, type, flag))
        !            60:                        exit(1);
        !            61:                exit(0);
        !            62:        }
        !            63:        if (setfsent() == 0) {
        !            64:                perror(FSTAB);
        !            65:                exit(1);
        !            66:        }
        !            67:        while ((fsp = getfsent()) != 0) {
        !            68:                if (strcmp(fsp->fs_file, "/") == 0)
        !            69:                        continue;
        !            70:                if (fsp->fs_ftype < 0)
        !            71:                        continue;
        !            72:                if (mountfs(fsp->fs_spec, fsp->fs_file, fsp->fs_ftype, fsp->fs_flags) == 0)
        !            73:                        babble(fsp);
        !            74:        }
        !            75:        endfsent();
        !            76:        exit(0);
        !            77: }
        !            78: 
        !            79: /*
        !            80:  * give a reassuring message about the mount
        !            81:  * somewhat customised: knows about fs type 0.
        !            82:  * this is probably silly
        !            83:  */
        !            84: 
        !            85: babble(fsp)
        !            86: register struct fstab *fsp;
        !            87: {
        !            88:        printf("Mounted %s on %s", fsp->fs_spec, fsp->fs_file);
        !            89:        if (fsp->fs_ftype != 0) {
        !            90:                printf(" type %d", fsp->fs_ftype);
        !            91:                if (fsp->fs_flags)
        !            92:                        printf(" flag %d\n", fsp->fs_flags);
        !            93:        } else {
        !            94:                switch (fsp->fs_flags) {
        !            95:                case 0:
        !            96:                        break;
        !            97: 
        !            98:                case 1:
        !            99:                        printf(" readonly");
        !           100:                        break;
        !           101: 
        !           102:                default:
        !           103:                        printf(" type 0 flag %d", fsp->fs_flags);
        !           104:                        break;
        !           105:                }
        !           106:        }
        !           107:        putchar('\n');
        !           108:        fflush(stdout);
        !           109: }
        !           110: 
        !           111: mountfs(spec, name, type, flag)
        !           112: char   *spec, *name;
        !           113: int type, flag;
        !           114: {
        !           115:        register char *np;
        !           116:        register struct mtab *mp;
        !           117:        int fd;
        !           118: 
        !           119:        if ((fd = open(spec, 0)) < 0) {
        !           120:                cant("open %s to mount on %s: ", spec, name, 0);
        !           121:                return (1);
        !           122:        }
        !           123:        if (fmount(type, fd, name, flag) < 0) {
        !           124:                cant("mount %s on %s type %d: ", spec, name, type);
        !           125:                return (1);
        !           126:        }
        !           127:        close(fd);
        !           128:        for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
        !           129:                if (mp->file[0] == 0) {
        !           130:                        strncpy(mp->file, name, sizeof(mp->file)-1);
        !           131:                        strncpy(mp->spec, spec, sizeof(mp->spec)-1);
        !           132:                        mp->type = type;
        !           133:                        mp = &mtab[NMOUNT];
        !           134:                        while ((--mp)->file[0] == 0);
        !           135:                        if ((fd = creat(MTAB, 0644)) < 0)
        !           136:                                return (0);
        !           137:                        write(fd, (char *)mtab, (mp-mtab+1)*sizeof(struct mtab));
        !           138:                        close(fd);
        !           139:                        return(0);
        !           140:                }
        !           141:        }
        !           142:        return(0);
        !           143: }
        !           144: 
        !           145: cant(str, a, b, c)
        !           146: char *str;
        !           147: char *a, *b;
        !           148: int c;
        !           149: {
        !           150:        extern int errno;
        !           151:        int serr;
        !           152: 
        !           153:        serr = errno;
        !           154:        fprintf(stderr, str, a, b, c);
        !           155:        fflush(stderr);
        !           156:        errno = serr;
        !           157:        perror("");
        !           158: }

unix.superglobalmegacorp.com

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