Annotation of 43BSD/etc/newfs.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)newfs.c    5.2 (Berkeley) 9/11/85";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * newfs: friendly front end to mkfs
                     19:  */
                     20: #include <sys/param.h>
                     21: #include <sys/stat.h>
                     22: #include <sys/fs.h>
                     23: #include <sys/dir.h>
                     24: 
                     25: #include <stdio.h>
                     26: #include <disktab.h>
                     27: 
                     28: #define        BOOTDIR "/usr/mdec"     /* directory for boot blocks */
                     29: 
                     30: int    Nflag;                  /* run mkfs without writing file system */
                     31: int    verbose;                /* show mkfs line before exec */
                     32: int    noboot;                 /* do not fill boot blocks */
                     33: int    fssize;                 /* file system size */
                     34: int    fsize;                  /* fragment size */
                     35: int    bsize;                  /* block size */
                     36: int    ntracks;                /* # tracks/cylinder */
                     37: int    nsectors;               /* # sectors/track */
                     38: int    sectorsize;             /* bytes/sector */
                     39: int    cpg;                    /* cylinders/cylinder group */
                     40: int    minfree = -1;           /* free space threshold */
                     41: int    opt;                    /* optimization preference (space or time) */
                     42: int    rpm;                    /* revolutions/minute of drive */
                     43: int    density;                /* number of bytes per inode */
                     44: 
                     45: char   *av[20];                /* argv array and buffers for exec */
                     46: char   a2[20];
                     47: char   a3[20];
                     48: char   a4[20];
                     49: char   a5[20];
                     50: char   a6[20];
                     51: char   a7[20];
                     52: char   a8[20];
                     53: char   a9[20];
                     54: char   a10[20];
                     55: char   device[MAXPATHLEN];
                     56: char   cmd[BUFSIZ];
                     57: 
                     58: char   *index();
                     59: char   *rindex();
                     60: char   *sprintf();
                     61: 
                     62: main(argc, argv)
                     63:        int argc;
                     64:        char *argv[];
                     65: {
                     66:        char *cp, *special;
                     67:        register struct disktab *dp;
                     68:        register struct partition *pp;
                     69:        struct stat st;
                     70:        register int i;
                     71:        int status;
                     72: 
                     73:        argc--, argv++;
                     74:        while (argc > 0 && argv[0][0] == '-') {
                     75:                for (cp = &argv[0][1]; *cp; cp++)
                     76:                        switch (*cp) {
                     77: 
                     78:                        case 'v':
                     79:                                verbose++;
                     80:                                break;
                     81: 
                     82:                        case 'N':
                     83:                                Nflag++;
                     84:                                /* fall through to */
                     85: 
                     86:                        case 'n':
                     87:                                noboot++;
                     88:                                break;
                     89: 
                     90:                        case 's':
                     91:                                if (argc < 1)
                     92:                                        fatal("-s: missing file system size");
                     93:                                argc--, argv++;
                     94:                                fssize = atoi(*argv);
                     95:                                if (fssize < 0)
                     96:                                        fatal("%s: bad file system size",
                     97:                                                *argv);
                     98:                                goto next;
                     99: 
                    100:                        case 't':
                    101:                                if (argc < 1)
                    102:                                        fatal("-t: missing track total");
                    103:                                argc--, argv++;
                    104:                                ntracks = atoi(*argv);
                    105:                                if (ntracks < 0)
                    106:                                        fatal("%s: bad total tracks", *argv);
                    107:                                goto next;
                    108: 
                    109:                        case 'o':
                    110:                                if (argc < 1)
                    111:                                        fatal("-o: missing optimization preference");
                    112:                                argc--, argv++;
                    113:                                if (strcmp(*argv, "space") == 0)
                    114:                                        opt = FS_OPTSPACE;
                    115:                                else if (strcmp(*argv, "time") == 0)
                    116:                                        opt = FS_OPTTIME;
                    117:                                else
                    118:                                        fatal("%s: bad optimization preference %s",
                    119:                                            *argv,
                    120:                                            "(options are `space' or `time')");
                    121:                                goto next;
                    122: 
                    123:                        case 'b':
                    124:                                if (argc < 1)
                    125:                                        fatal("-b: missing block size");
                    126:                                argc--, argv++;
                    127:                                bsize = atoi(*argv);
                    128:                                if (bsize < 0 || bsize < MINBSIZE)
                    129:                                        fatal("%s: bad block size", *argv);
                    130:                                goto next;
                    131: 
                    132:                        case 'f':
                    133:                                if (argc < 1)
                    134:                                        fatal("-f: missing frag size");
                    135:                                argc--, argv++;
                    136:                                fsize = atoi(*argv);
                    137:                                if (fsize < 0)
                    138:                                        fatal("%s: bad frag size", *argv);
                    139:                                goto next;
                    140: 
                    141:                        case 'S':
                    142:                                if (argc < 1)
                    143:                                        fatal("-S: missing sector size");
                    144:                                argc--, argv++;
                    145:                                sectorsize = atoi(*argv);
                    146:                                if (sectorsize < 0)
                    147:                                        fatal("%s: bad sector size", *argv);
                    148:                                goto next;
                    149: 
                    150:                        case 'c':
                    151:                                if (argc < 1)
                    152:                                        fatal("-c: missing cylinders/group");
                    153:                                argc--, argv++;
                    154:                                cpg = atoi(*argv);
                    155:                                if (cpg < 0)
                    156:                                        fatal("%s: bad cylinders/group", *argv);
                    157:                                goto next;
                    158: 
                    159:                        case 'm':
                    160:                                if (argc < 1)
                    161:                                        fatal("-m: missing free space %%\n");
                    162:                                argc--, argv++;
                    163:                                minfree = atoi(*argv);
                    164:                                if (minfree < 0 || minfree > 99)
                    165:                                        fatal("%s: bad free space %%\n",
                    166:                                                *argv);
                    167:                                goto next;
                    168: 
                    169:                        case 'r':
                    170:                                if (argc < 1)
                    171:                                        fatal("-r: missing revs/minute\n");
                    172:                                argc--, argv++;
                    173:                                rpm = atoi(*argv);
                    174:                                if (rpm < 0)
                    175:                                        fatal("%s: bad revs/minute\n", *argv);
                    176:                                goto next;
                    177: 
                    178:                        case 'i':
                    179:                                if (argc < 1)
                    180:                                        fatal("-i: missing bytes per inode\n");
                    181:                                argc--, argv++;
                    182:                                density = atoi(*argv);
                    183:                                if (density < 0)
                    184:                                        fatal("%s: bad bytes per inode\n",
                    185:                                                *argv);
                    186:                                goto next;
                    187: 
                    188:                        default:
                    189:                                fatal("-%c: unknown flag", cp);
                    190:                        }
                    191: next:
                    192:                argc--, argv++;
                    193:        }
                    194:        if (argc < 2) {
                    195:                fprintf(stderr, "usage: newfs [ -v ] [ mkfs-options ] %s\n",
                    196:                        "special-device device-type");
                    197:                fprintf(stderr, "where mkfs-options are:\n");
                    198:                fprintf(stderr, "\t-N do not create file system, %s\n",
                    199:                        "just print out parameters");
                    200:                fprintf(stderr, "\t-s file system size (sectors)\n");
                    201:                fprintf(stderr, "\t-b block size\n");
                    202:                fprintf(stderr, "\t-f frag size\n");
                    203:                fprintf(stderr, "\t-t tracks/cylinder\n");
                    204:                fprintf(stderr, "\t-c cylinders/group\n");
                    205:                fprintf(stderr, "\t-m minimum free space %%\n");
                    206:                fprintf(stderr, "\t-o optimization preference %s\n",
                    207:                        "(`space' or `time')");
                    208:                fprintf(stderr, "\t-r revolutions/minute\n");
                    209:                fprintf(stderr, "\t-S sector size\n");
                    210:                fprintf(stderr, "\t-i number of bytes per inode\n");
                    211:                exit(1);
                    212:        }
                    213:        special = argv[0];
                    214:        cp = rindex(special, '/');
                    215:        if (cp != 0)
                    216:                special = cp + 1;
                    217:        if (*special == 'r' && special[1] != 'a' && special[1] != 'b')
                    218:                special++;
                    219:        special = sprintf(device, "/dev/r%s", special);
                    220:        if (stat(special, &st) < 0) {
                    221:                fprintf(stderr, "newfs: "); perror(special);
                    222:                exit(2);
                    223:        }
                    224:        if ((st.st_mode & S_IFMT) != S_IFCHR)
                    225:                fatal("%s: not a character device", special);
                    226:        dp = getdiskbyname(argv[1]);
                    227:        if (dp == 0)
                    228:                fatal("%s: unknown disk type", argv[1]);
                    229:        cp = index(argv[0], '\0') - 1;
                    230:        if (cp == 0 || *cp < 'a' || *cp > 'h')
                    231:                fatal("%s: can't figure out file system partition", argv[0]);
                    232:        pp = &dp->d_partitions[*cp - 'a'];
                    233:        if (fssize == 0) {
                    234:                fssize = pp->p_size;
                    235:                if (fssize < 0)
                    236:                        fatal("%s: no default size for `%c' partition",
                    237:                                argv[1], *cp);
                    238:        }
                    239:        if (nsectors == 0) {
                    240:                nsectors = dp->d_nsectors;
                    241:                if (nsectors < 0)
                    242:                        fatal("%s: no default #sectors/track", argv[1]);
                    243:        }
                    244:        if (ntracks == 0) {
                    245:                ntracks = dp->d_ntracks;
                    246:                if (ntracks < 0)
                    247:                        fatal("%s: no default #tracks", argv[1]);
                    248:        }
                    249:        if (sectorsize == 0) {
                    250:                sectorsize = dp->d_secsize;
                    251:                if (sectorsize < 0)
                    252:                        fatal("%s: no default sector size", argv[1]);
                    253:        }
                    254:        if (bsize == 0) {
                    255:                bsize = pp->p_bsize;
                    256:                if (bsize < 0)
                    257:                        fatal("%s: no default block size for `%c' partition",
                    258:                                argv[1], *cp);
                    259:        }
                    260:        if (fsize == 0) {
                    261:                fsize = pp->p_fsize;
                    262:                if (fsize < 0)
                    263:                        fatal("%s: no default frag size for `%c' partition",
                    264:                                argv[1], *cp);
                    265:        }
                    266:        if (rpm == 0) {
                    267:                rpm = dp->d_rpm;
                    268:                if (rpm < 0)
                    269:                        fatal("%s: no default revolutions/minute value",
                    270:                                argv[1]);
                    271:        }
                    272:        if (density <= 0)
                    273:                density = 2048;
                    274:        if (minfree < 0)
                    275:                minfree = 10;
                    276:        if (minfree < 10 && opt != FS_OPTSPACE) {
                    277:                fprintf(stderr, "setting optimization for space ");
                    278:                fprintf(stderr, "with minfree less than 10%\n");
                    279:                opt = FS_OPTSPACE;
                    280:        }
                    281:        if (cpg == 0)
                    282:                cpg = 16;
                    283:        i = 0;
                    284:        if (Nflag)
                    285:                av[i++] = "-N";
                    286:        av[i++] = special;
                    287:        av[i++] = sprintf(a2, "%d", fssize);
                    288:        av[i++] = sprintf(a3, "%d", nsectors);
                    289:        av[i++] = sprintf(a4, "%d", ntracks);
                    290:        av[i++] = sprintf(a5, "%d", bsize);
                    291:        av[i++] = sprintf(a6, "%d", fsize);
                    292:        av[i++] = sprintf(a7, "%d", cpg);
                    293:        av[i++] = sprintf(a8, "%d", minfree);
                    294:        av[i++] = sprintf(a9, "%d", rpm / 60);
                    295:        av[i++] = sprintf(a10, "%d", density);
                    296:        av[i++] = opt == FS_OPTSPACE ? "s" : "t";
                    297:        av[i++] = 0;
                    298:        strcpy(cmd, "/etc/mkfs");
                    299:        for (i = 0; av[i] != 0; i++) {
                    300:                strcat(cmd, " ");
                    301:                strcat(cmd, av[i]);
                    302:        }
                    303:        if (verbose)
                    304:                printf("%s\n", cmd);
                    305:        if (status = system(cmd))
                    306:                exit(status >> 8);
                    307:        if (*cp == 'a' && !noboot) {
                    308:                char type[3];
                    309:                struct stat sb;
                    310: 
                    311:                cp = rindex(special, '/');
                    312:                if (cp == NULL)
                    313:                        fatal("%s: can't figure out disk type from name",
                    314:                                special);
                    315:                if (stat(special, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFCHR)
                    316:                        cp++;
                    317:                type[0] = *++cp;
                    318:                type[1] = *++cp;
                    319:                type[2] = '\0';
                    320:                installboot(special, type);
                    321:        }
                    322:        exit(0);
                    323: }
                    324: 
                    325: installboot(dev, type)
                    326:        char *dev, *type;
                    327: {
                    328:        int fd;
                    329:        char bootblock[MAXPATHLEN], standalonecode[MAXPATHLEN];
                    330:        char bootimage[BBSIZE];
                    331: 
                    332:        sprintf(bootblock, "%s/%sboot", BOOTDIR, type);
                    333:        sprintf(standalonecode, "%s/boot%s", BOOTDIR, type);
                    334:        if (verbose) {
                    335:                printf("installing boot code\n");
                    336:                printf("sector 0 boot = %s\n", bootblock);
                    337:                printf("1st level boot = %s\n", standalonecode);
                    338:        }
                    339:        fd = open(bootblock, 0);
                    340:        if (fd < 0) {
                    341:                fprintf(stderr, "newfs: "); perror(bootblock);
                    342:                exit(1);
                    343:        }
                    344:        if (read(fd, bootimage, DEV_BSIZE) < 0) {
                    345:                fprintf(stderr, "newfs: "); perror(bootblock);
                    346:                exit(2);
                    347:        }
                    348:        close(fd);
                    349:        fd = open(standalonecode, 0);
                    350:        if (fd < 0) {
                    351:                fprintf(stderr, "newfs: "); perror(standalonecode);
                    352:                exit(1);
                    353:        }
                    354:        if (read(fd, &bootimage[DEV_BSIZE], BBSIZE - DEV_BSIZE) < 0) {
                    355:                fprintf(stderr, "newfs: "); perror(standalonecode);
                    356:                exit(2);
                    357:        }
                    358:        close(fd);
                    359:        fd = open(dev, 1);
                    360:        if (fd < 0) {
                    361:                fprintf(stderr, "newfs: "); perror(dev);
                    362:                exit(1);
                    363:        }
                    364:        if (write(fd, bootimage, BBSIZE) != BBSIZE) {
                    365:                fprintf(stderr, "newfs: "); perror(dev);
                    366:                exit(2);
                    367:        }
                    368:        close(fd);
                    369: }
                    370: 
                    371: /*VARARGS*/
                    372: fatal(fmt, arg1, arg2)
                    373:        char *fmt;
                    374: {
                    375: 
                    376:        fprintf(stderr, "newfs: ");
                    377:        fprintf(stderr, fmt, arg1, arg2);
                    378:        putc('\n', stderr);
                    379:        exit(10);
                    380: }

unix.superglobalmegacorp.com

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