Annotation of 42BSD/etc/umount.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)umount.c    4.8 (Berkeley) 5/28/83";
                      3: #endif
                      4: 
                      5: /*
                      6:  * umount
                      7:  */
                      8: #include <sys/param.h>
                      9: 
                     10: #include <stdio.h>
                     11: #include <fstab.h>
                     12: #include <mtab.h>
                     13: 
                     14: struct mtab mtab[NMOUNT];
                     15: 
                     16: char   *rindex();
                     17: int    vflag, all, errs;
                     18: 
                     19: main(argc, argv)
                     20:        int argc;
                     21:        char **argv;
                     22: {
                     23:        register struct mtab *mp;
                     24:        register char *p1, *p2;
                     25:        int mf;
                     26: 
                     27:        argc--, argv++;
                     28:        sync();
                     29:        mf = open("/etc/mtab", 0);
                     30:        read(mf, (char *)mtab, sizeof (mtab));
                     31: again:
                     32:        if (argc > 0 && !strcmp(*argv, "-v")) {
                     33:                vflag++;
                     34:                argc--, argv++;
                     35:                goto again;
                     36:        }
                     37:        if (argc > 0 && !strcmp(*argv, "-a")) {
                     38:                all++;
                     39:                argc--, argv++;
                     40:                goto again;
                     41:        }
                     42:        if (argc == 0 && !all) {
                     43:                fprintf(stderr, "Usage: umount [ -a ] [ -v ] [ dev ... ]\n");
                     44:                exit(1);
                     45:        }
                     46:        if (all) {
                     47:                if (setfsent() == 0)
                     48:                        perror(FSTAB), exit(1);
                     49:                umountall();
                     50:                exit(0);
                     51:        }
                     52:        while (argc > 0) {
                     53:                if (umountfs(*argv++) == 0)
                     54:                        errs++;
                     55:                argc--;
                     56:        }
                     57:        exit(errs);
                     58: }
                     59: 
                     60: umountall()
                     61: {
                     62:        struct fstab *fs, *allocfsent();
                     63: 
                     64:        if ((fs = getfsent()) == 0)
                     65:                return;
                     66:        fs = allocfsent(fs);
                     67:        umountall();
                     68:        if (strcmp(fs->fs_file, "/") == 0) {
                     69:                freefsent(fs);
                     70:                return;
                     71:        }
                     72:        if (strcmp(fs->fs_type, FSTAB_RW) &&
                     73:            strcmp(fs->fs_type, FSTAB_RO) &&
                     74:            strcmp(fs->fs_type, FSTAB_RQ)) {
                     75:                freefsent(fs);
                     76:                return;
                     77:        }
                     78:        if (umountfs(fs->fs_spec) < 0)
                     79:                perror(fs->fs_spec);
                     80:        freefsent(fs);
                     81: }
                     82: 
                     83: struct fstab *
                     84: allocfsent(fs)
                     85:        register struct fstab *fs;
                     86: {
                     87:        register struct fstab *new;
                     88:        register char *cp;
                     89:        char *malloc();
                     90: 
                     91:        new = (struct fstab *)malloc(sizeof (*fs));
                     92:        cp = malloc(strlen(fs->fs_file) + 1);
                     93:        strcpy(cp, fs->fs_file);
                     94:        new->fs_file = cp;
                     95:        cp = malloc(strlen(fs->fs_type) + 1);
                     96:        strcpy(cp, fs->fs_type);
                     97:        new->fs_type = cp;
                     98:        cp = malloc(strlen(fs->fs_spec) + 1);
                     99:        strcpy(cp, fs->fs_spec);
                    100:        new->fs_spec = cp;
                    101:        new->fs_passno = fs->fs_passno;
                    102:        new->fs_freq = fs->fs_freq;
                    103:        return (new);
                    104: }
                    105: 
                    106: freefsent(fs)
                    107:        register struct fstab *fs;
                    108: {
                    109: 
                    110:        if (fs->fs_file)
                    111:                free(fs->fs_file);
                    112:        if (fs->fs_spec)
                    113:                free(fs->fs_spec);
                    114:        if (fs->fs_type)
                    115:                free(fs->fs_type);
                    116:        free((char *)fs);
                    117: }
                    118: 
                    119: struct mtab zeromtab;
                    120: 
                    121: umountfs(name)
                    122:        char *name;
                    123: {
                    124:        register char *p1, *p2;
                    125:        register struct mtab *mp;
                    126:        int mf;
                    127:        struct fstab *fs;
                    128: 
                    129:        fs = getfsfile(name);
                    130:        if (fs != NULL)
                    131:                name = fs->fs_spec;
                    132:        if (umount(name) < 0) {
                    133:                perror(name);
                    134:                return (0);
                    135:        }
                    136:        if (vflag)
                    137:                fprintf(stderr, "%s: Unmounted\n", name);
                    138:        while ((p1 = rindex(name, '/')) && p1[1] == 0)
                    139:                *p1 = 0;
                    140:        if (p1)
                    141:                name = p1 + 1;
                    142:        for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
                    143:                if (strncmp(mp->m_dname, name, sizeof (mp->m_dname)))
                    144:                        continue;
                    145:                *mp = zeromtab;
                    146:                for (mp = &mtab[NMOUNT]; mp >= mtab; mp--)
                    147:                        if (mp->m_path[0])
                    148:                                break;
                    149:                mp++;
                    150:                mf = creat("/etc/mtab", 0644);
                    151:                write(mf, (char *)mtab, (mp-mtab) * sizeof (struct mtab));
                    152:                return (1);
                    153:        }
                    154:        fprintf(stderr, "%s: Not mounted\n", name);
                    155:        return (0);
                    156: }

unix.superglobalmegacorp.com

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