Annotation of coherent/d/etc/mount.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Mount a filesystem
                      3:  */
                      4: 
                      5: char helpmessage[] = "\
                      6: \
                      7: mount -- mount file system\n\
                      8: Usage: /etc/mount [ special directory [-fru] ]\n\
                      9: Options:\n\
                     10:        -r      Mount is read only\n\
                     11:        -u      No mount, just update '/etc/mnttab' and/or '/etc/mtab'\n\
                     12: The file system residing on the block special file 'special' becomes\n\
                     13: accessible through the pathname 'directory'.\n\
                     14: With no arguments, lists the currently mount file systems.\n\
                     15: If /etc/mtab appears out of date, due to reboot, the fact is noted.\n\
                     16: If /etc/mnttab is present, then the dates of mounting will be reported.\n\
                     17: \
                     18: ";
                     19: 
                     20: #include <stdio.h>
                     21: #include <mtab.h>
                     22: #include <mnttab.h>
                     23: #include <sys/mount.h>
                     24: #include <errno.h>
                     25: #include <sys/filsys.h>
                     26: #include <canon.h>
                     27: #include <sys/stat.h>
                     28: #include <sys/timeb.h>
                     29: 
                     30: int    uflag;                  /* Update mount table only */
                     31: int    rflag;                  /* Read-only mount */
                     32: int    qmtab;                  /* Mtab is out of date */
                     33: char   mtabf[] = "/etc/mtab";
                     34: char   mnttabf[] = "/etc/mnttab";      /* System 5 style */
                     35: struct mtab    mtab;
                     36: struct mnttab  mnttab;
                     37: struct stat    sbuf;
                     38: char   mspec[MNAMSIZ];
                     39: extern FILE *getmtab();
                     40: extern FILE *getmnttab();
                     41: char   *ctime();
                     42: 
                     43: main(argc, argv)
                     44: char *argv[];
                     45: {
                     46:        if (argc == 1)
                     47:                mlist();
                     48:        else {
                     49:                if (argc==4 && *argv[3]=='-') {
                     50:                        getflags(argv[3]+1);
                     51:                        argc -= 1;
                     52:                }
                     53:                if (argc==3) {
                     54:                        domount(argv[1], argv[2], rflag);
                     55:                } else
                     56:                        usage();
                     57:        }
                     58:        return (0);
                     59: }
                     60: 
                     61: getflags(ap)
                     62: register char *ap;
                     63: {
                     64:        register int c;
                     65: 
                     66:        while ((c = *ap++) != '\0')
                     67:                switch (c) {
                     68:                case 'r':
                     69:                        rflag = MFRON;
                     70:                        continue;
                     71: 
                     72:                case 'u':
                     73:                        uflag++;
                     74:                        continue;
                     75: 
                     76:                default:
                     77:                        usage();
                     78:                }
                     79: }
                     80: 
                     81: usage()
                     82: {
                     83:        fprintf(stderr, helpmessage);
                     84:        exit(1);
                     85: }
                     86: 
                     87: merror(f)
                     88: char *f;
                     89: {
                     90:        register int err;
                     91: 
                     92:        err = errno;
                     93:        fprintf(stderr, "mount: %r", &f);
                     94:        if (err == EBUSY)
                     95:                fprintf(stderr, ": mount device or directory busy\n");
                     96:        else if (err > 0 && err < sys_nerr)
                     97:                fprintf(stderr, ": %s\n", sys_errlist[err]);
                     98:        else
                     99:                fprintf(stderr, ": unrecognized error\n");
                    100:        exit(1);
                    101: }
                    102: 
                    103: domount(special, name, flag)
                    104: char *special;
                    105: char *name;
                    106: int flag;
                    107: {
                    108:        register FILE *fp;
                    109:        register int openerr;
                    110:        extern time_t time();
                    111: 
                    112:        chkname(name);
                    113:        if (!uflag) {
                    114:                chkspec(special);
                    115:                if (mount(special, name, flag) != 0)
                    116:                        merror("%s on %s", special, name);
                    117:        }
                    118:        if ((fp = getmnttab()) == NULL) {
                    119:                openerr |= 1;
                    120:        } else {
                    121:                mcopy(special, mspec);
                    122:                while (fread(&mnttab, sizeof(mnttab), 1, fp) == 1) {
                    123:                        if (mnttab.mt_dev[0] == '\0'
                    124:                        ||  strncmp(mnttab.mt_filsys, mspec, MNTNSIZ) == 0) {
                    125:                                fseek(fp, (long)(-sizeof(mnttab)), 1);
                    126:                                break;
                    127:                        }
                    128:                }
                    129:                strncpy(mnttab.mt_dev, name, MNTNSIZ);
                    130:                strncpy(mnttab.mt_filsys, mspec, MNTNSIZ);
                    131:                mnttab.mt_ro_flg = flag;
                    132:                mnttab.mt_time = time(NULL);
                    133:                if (fwrite(&mnttab, sizeof(mnttab), 1, fp) != 1)
                    134:                        merror("writing %s", mnttabf);
                    135:                fclose(fp);
                    136:        }
                    137:        if ((fp = getmtab()) == NULL) {
                    138:                openerr |= 2;
                    139:        } else {
                    140:                mcopy(special, mspec);
                    141:                while (fread(&mtab, sizeof(mtab), 1, fp) == 1) {
                    142:                        if (mtab.mt_name[0] == '\0'
                    143:                        ||  strncmp(mtab.mt_special, mspec, MNAMSIZ) == 0) {
                    144:                                fseek(fp, (long)(-sizeof(mtab)), 1);
                    145:                                break;
                    146:                        }
                    147:                }
                    148:                strncpy(mtab.mt_name, name, MNAMSIZ);
                    149:                strncpy(mtab.mt_special, mspec, MNAMSIZ);
                    150:                mtab.mt_flags = flag;
                    151:                if (fwrite(&mtab, sizeof(mtab), 1, fp) != 1)
                    152:                        merror("writing %s", mtabf);
                    153:                fclose(fp);
                    154:        }
                    155:        if (openerr == 3 && uflag)
                    156:                merror("could not open %s or %s", mnttabf, mtabf);
                    157: }
                    158: 
                    159: mlist()
                    160: {
                    161:        register FILE *fp;
                    162: 
                    163:        if ((fp = getmnttab()) != NULL) {
                    164:                while (fread(&mnttab, sizeof(mnttab), 1, fp) == 1)
                    165:                        if (*mnttab.mt_dev != '\0') {
                    166:                                printf("/dev/%.*s on %.*s", MNTNSIZ,
                    167:                                    mnttab.mt_filsys, MNTNSIZ, mnttab.mt_dev);
                    168:                                if (mnttab.mt_ro_flg & MFRON)
                    169:                                        printf(" (read only)");
                    170:                                else
                    171:                                        printf(" (writeable)");
                    172:                                printf(" since %s", ctime(&mnttab.mt_time));
                    173:                        }
                    174:                return;
                    175:        }
                    176:        if ((fp = getmtab()) != NULL) {
                    177:                if (qmtab)
                    178:                        fprintf(stderr,
                    179:                                "mount: /etc/mtab older than /etc/boottime\n");
                    180:                while (fread(&mtab, sizeof(mtab), 1, fp) == 1)
                    181:                        if (*mtab.mt_name != '\0') {
                    182:                                printf("/dev/%.*s on %.*s", MNAMSIZ,
                    183:                                    mtab.mt_special, MNAMSIZ, mtab.mt_name);
                    184:                                if (mtab.mt_flags & MFRON)
                    185:                                        printf(" (read only)");
                    186:                                printf("\n");
                    187:                        }
                    188:        }
                    189: }
                    190: 
                    191: FILE *
                    192: getmnttab()
                    193: {
                    194:        return (fopen(mnttabf, "r+w"));
                    195: }
                    196: 
                    197: FILE *
                    198: getmtab()
                    199: {
                    200:        time_t boottime;
                    201: 
                    202:        if (stat("/etc/boottime", &sbuf) != 0)
                    203:                boottime = (time_t)0;
                    204:        else
                    205:                boottime = sbuf.st_mtime;
                    206:        if (stat(mtabf, &sbuf) != 0)
                    207:                return (NULL);
                    208:        if (sbuf.st_mtime < boottime)
                    209:                qmtab = 1;
                    210:        return (fopen(mtabf, "r+w"));
                    211: }
                    212: 
                    213: chkname(name)
                    214: char *name;
                    215: {
                    216:        if (stat(name, &sbuf) < 0)
                    217:                merror("%s", name);
                    218:        if ((sbuf.st_mode&S_IFMT) != S_IFDIR) {
                    219:                errno = ENOTDIR;
                    220:                merror("%s", name);
                    221:        }
                    222: }
                    223: 
                    224: chkspec(special)
                    225: char *special;
                    226: {
                    227:        register FILE *fp;
                    228:        struct filsys f;
                    229: 
                    230:        if (stat(special, &sbuf) < 0)
                    231:                merror("%s", special);
                    232:        if ((sbuf.st_mode&S_IFMT) != S_IFBLK) {
                    233:                errno = ENOTBLK;
                    234:                merror("%s", special);
                    235:        }
                    236:        if ((fp = fopen(special, "r")) == NULL)
                    237:                merror("opening %s", special);
                    238:        fseek(fp, (long)SUPERI*BSIZE, 0);
                    239:        if (fread(&f, sizeof(f), 1, fp) != 1)
                    240:                merror("%s", special);
                    241:        canf(&f);
                    242:        if ( ! tstf(&f)) {
                    243:                fprintf(stderr,
                    244:                        "mount: %s: badly formed file system\n", special);
                    245:                exit(1);
                    246:        }
                    247: }
                    248: 
                    249: canf(fp)
                    250: register struct filsys *fp;
                    251: {
                    252:        register daddr_t *dp;
                    253:        register ino_t *ip;
                    254: 
                    255:        canshort(fp->s_isize);
                    256:        candaddr(fp->s_fsize);
                    257:        canshort(fp->s_nfree);
                    258:        for (dp = &fp->s_free[0]; dp < &fp->s_free[NICFREE]; dp += 1)
                    259:                candaddr(*dp);
                    260:        canshort(fp->s_ninode);
                    261:        for (ip = &fp->s_inode[0]; ip < &fp->s_inode[NICINOD]; ip += 1)
                    262:                canino(*ip);
                    263:        candaddr(fp->s_tfree);
                    264:        canino(fp->s_tinode);
                    265: }
                    266: 
                    267: tstf(fp)
                    268: register struct filsys *fp;
                    269: {
                    270:        register daddr_t *dp;
                    271:        register ino_t *ip;
                    272:        register ino_t maxinode;
                    273: 
                    274:        maxinode = (fp->s_isize - INODEI) * INOPB + 1;
                    275:        if (fp->s_isize >= fp->s_fsize)
                    276:                return (0);
                    277:        if (fp->s_tfree < fp->s_nfree
                    278:         || fp->s_tfree >= fp->s_fsize - fp->s_isize + 1)
                    279:                return (0);
                    280:        if (fp->s_tinode < fp->s_ninode
                    281:         || fp->s_tinode >= maxinode-1)
                    282:                return (0);
                    283:        for (dp = &fp->s_free[0]; dp < &fp->s_free[fp->s_nfree]; dp += 1)
                    284:                if (*dp < fp->s_isize || *dp >= fp->s_fsize)
                    285:                        return (0);
                    286:        for (ip = &fp->s_inode[0]; ip < &fp->s_inode[fp->s_ninode]; ip += 1)
                    287:                if (*ip < 1 || *ip > maxinode)
                    288:                        return (0);
                    289:        return (1);
                    290: }
                    291: 
                    292: /*
                    293:  * Copy special pathname (stripped of
                    294:  * leading directories) into a fixed
                    295:  * size buffer.
                    296:  */
                    297: mcopy(ms, buf)
                    298: char *ms, *buf;
                    299: {
                    300:        register char *p1, *p2;
                    301: 
                    302:        for (p1=p2=ms; *p1 != '\0'; )
                    303:                if (*p1++ == '/')
                    304:                        p2 = p1;
                    305:        p1 = buf;
                    306:        while (*p1++ = *p2++)
                    307:                ;
                    308: }

unix.superglobalmegacorp.com

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