Annotation of 43BSD/etc/newfs.c, revision 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.