Annotation of researchv10no/cmd/umount.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <fstab.h>
                      3: 
                      4: struct mtab *mtab;
                      5: 
                      6: int nmtab;
                      7: int mdirty;
                      8: int errs;
                      9: 
                     10: char mfile[] = MTAB;
                     11: 
                     12: main(argc, argv)
                     13: int argc;
                     14: char **argv;
                     15: {
                     16: 
                     17:        if (argc < 2) {
                     18:                fprintf(stderr, "usage: umount [-a] [file ...]\n");
                     19:                exit(1);
                     20:        }
                     21:        readmtab();
                     22:        sync();
                     23:        if (argc == 2 && strcmp(argv[1], "-a") == 0)
                     24:                umountall();
                     25:        else {
                     26:                while (--argc > 0)
                     27:                        umountone(*++argv);
                     28:        }
                     29:        writmtab();
                     30:        sync();
                     31:        exit(errs);
                     32: }
                     33: 
                     34: /*
                     35:  * unmount everything
                     36:  * in reverse order in case of nesting
                     37:  */
                     38: umountall()
                     39: {
                     40:        register int i;
                     41: 
                     42:        for (i = nmtab - 1; i >= 0; i--) {
                     43:                if (mtab[i].file[0] == 0)
                     44:                        continue;
                     45:                if (funmount(mtab[i].file) < 0) {
                     46:                        perror(mtab[i].file);
                     47:                        errs++;
                     48:                        continue;
                     49:                }
                     50:                mtab[i].file[0] = 0;
                     51:                mdirty++;
                     52:        }
                     53: }
                     54: 
                     55: umountone(f)
                     56: char *f;
                     57: {
                     58:        register int i;
                     59: 
                     60:        if (funmount(f) < 0) {
                     61:                perror(f);
                     62:                errs++;
                     63:                return;
                     64:        }
                     65:        for (i = nmtab - 1; i >= 0; i--)
                     66:                if (strcmp(mtab[i].file, f) == 0) {
                     67:                        mtab[i].file[0] = 0;
                     68:                        mdirty++;
                     69:                        break;
                     70:                }
                     71: }
                     72: 
                     73: #define        CHUNK   (20*sizeof(struct mtab))
                     74: 
                     75: readmtab()
                     76: {
                     77:        char *base, *buf;
                     78:        int n, nr, tot;
                     79:        int fd;
                     80:        char *malloc(), *realloc();
                     81: 
                     82:        if ((base = malloc(CHUNK)) == NULL) {
                     83:                fprintf(stderr, "umount: no mem\n");
                     84:                exit(1);
                     85:        }
                     86:        if ((fd = open(mfile, 0)) < 0) {
                     87:                perror("read /etc/mtab");
                     88:                exit(1);
                     89:        }
                     90:        buf = base;
                     91:        nr = CHUNK;
                     92:        tot = 0;
                     93:        while ((n = read(fd, buf, nr)) > 0) {
                     94:                tot += n;
                     95:                buf += n;
                     96:                if ((nr -= n) <= 0) {
                     97:                        if ((base = realloc(base, CHUNK)) == NULL) {
                     98:                                fprintf(stderr, "umount: no mem\n");
                     99:                                exit(1);
                    100:                        }
                    101:                        buf = base + tot;
                    102:                        nr = CHUNK;
                    103:                }
                    104:        }
                    105:        mtab = (struct mtab *)base;
                    106:        nmtab = tot / sizeof(struct mtab);
                    107:        close(fd);
                    108: }
                    109: 
                    110: writmtab()
                    111: {
                    112:        int fd;
                    113:        register int i;
                    114: 
                    115:        if (mdirty == 0)
                    116:                return;
                    117:        for (i = nmtab - 1; i >= 0; i--)
                    118:                if (mtab[i].file[0])
                    119:                        break;
                    120:        if ((fd = creat(mfile, 0666)) < 0) {
                    121:                perror("write /etc/mtab");
                    122:                errs++;
                    123:                return;
                    124:        }
                    125:        i = (char *)&mtab[i+1] - (char *)mtab;
                    126:        if (write(fd, (char *)mtab, i) != i) {
                    127:                perror("write /etc/mtab");
                    128:                errs++;
                    129:                return;
                    130:        }
                    131:        close(fd);
                    132: }

unix.superglobalmegacorp.com

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