BSD 4_2 release
[unix-history] / usr / src / etc / newfs.c
index 67d8eb0..dafe394 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)newfs.c    4.6 2/20/83";
+static char sccsid[] = "@(#)newfs.c    4.12 8/28/83";
 #endif
 
 /*
 #endif
 
 /*
@@ -8,14 +8,15 @@ static char sccsid[] = "@(#)newfs.c   4.6 2/20/83";
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/fs.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/fs.h>
+#include <sys/dir.h>
 
 #include <stdio.h>
 
 #include <stdio.h>
-#include <dir.h>
 #include <disktab.h>
 
 #define        BOOTDIR "/usr/mdec"     /* directory for boot blocks */
 
 int    verbose;                /* show mkfs line before exec */
 #include <disktab.h>
 
 #define        BOOTDIR "/usr/mdec"     /* directory for boot blocks */
 
 int    verbose;                /* show mkfs line before exec */
+int    noboot;                 /* do not fill boot blocks */
 int    fssize;                 /* file system size */
 int    fsize;                  /* fragment size */
 int    bsize;                  /* block size */
 int    fssize;                 /* file system size */
 int    fsize;                  /* fragment size */
 int    bsize;                  /* block size */
@@ -23,8 +24,9 @@ int   ntracks;                /* # tracks/cylinder */
 int    nsectors;               /* # sectors/track */
 int    sectorsize;             /* bytes/sector */
 int    cpg;                    /* cylinders/cylinder group */
 int    nsectors;               /* # sectors/track */
 int    sectorsize;             /* bytes/sector */
 int    cpg;                    /* cylinders/cylinder group */
-int    minfree;                /* free space threshold */
+int    minfree = -1;           /* free space threshold */
 int    rpm;                    /* revolutions/minute of drive */
 int    rpm;                    /* revolutions/minute of drive */
+int    density;                /* number of bytes per inode */
 
 char   *av[20];                /* argv array and buffers for exec */
 char   a2[20];
 
 char   *av[20];                /* argv array and buffers for exec */
 char   a2[20];
@@ -35,6 +37,7 @@ char  a6[20];
 char   a7[20];
 char   a8[20];
 char   a9[20];
 char   a7[20];
 char   a8[20];
 char   a9[20];
+char   a10[20];
 char   device[MAXPATHLEN];
 char   cmd[BUFSIZ];
 
 char   device[MAXPATHLEN];
 char   cmd[BUFSIZ];
 
@@ -43,6 +46,7 @@ char  *rindex();
 char   *sprintf();
 
 main(argc, argv)
 char   *sprintf();
 
 main(argc, argv)
+       int argc;
        char *argv[];
 {
        char *cp, *special;
        char *argv[];
 {
        char *cp, *special;
@@ -61,6 +65,10 @@ main(argc, argv)
                                verbose++;
                                break;
 
                                verbose++;
                                break;
 
+                       case 'n':
+                               noboot++;
+                               break;
+
                        case 's':
                                if (argc < 1)
                                        fatal("-s: missing file system size");
                        case 's':
                                if (argc < 1)
                                        fatal("-s: missing file system size");
@@ -135,6 +143,16 @@ main(argc, argv)
                                        fatal("%s: bad revs/minute\n", *argv);
                                goto next;
 
                                        fatal("%s: bad revs/minute\n", *argv);
                                goto next;
 
+                       case 'i':
+                               if (argc < 1)
+                                       fatal("-i: missing bytes per inode\n");
+                               argc--, argv++;
+                               density = atoi(*argv);
+                               if (density < 0)
+                                       fatal("%s: bad bytes per inode\n",
+                                               *argv);
+                               goto next;
+
                        default:
                                fatal("-%c: unknown flag", cp);
                        }
                        default:
                                fatal("-%c: unknown flag", cp);
                        }
@@ -153,23 +171,22 @@ next:
                fprintf(stderr, "\t-m minimum free space %%\n");
                fprintf(stderr, "\t-r revolutions/minute\n");
                fprintf(stderr, "\t-S sector size\n");
                fprintf(stderr, "\t-m minimum free space %%\n");
                fprintf(stderr, "\t-r revolutions/minute\n");
                fprintf(stderr, "\t-S sector size\n");
+               fprintf(stderr, "\t-i number of bytes per inode\n");
                exit(1);
        }
        special = argv[0];
                exit(1);
        }
        special = argv[0];
-again:
+       cp = rindex(special, '/');
+       if (cp != 0)
+               special = cp + 1;
+       if (*special == 'r' && special[1] != 'a' && special[1] != 'b')
+               special++;
+       special = sprintf(device, "/dev/r%s", special);
        if (stat(special, &st) < 0) {
        if (stat(special, &st) < 0) {
-               if (*special != '/') {
-                       if (*special == 'r')
-                               special++;
-                       special = sprintf(device, "/dev/r%s", special);
-                       goto again;
-               }
                fprintf(stderr, "newfs: "); perror(special);
                exit(2);
        }
                fprintf(stderr, "newfs: "); perror(special);
                exit(2);
        }
-       if ((st.st_mode & S_IFMT) != S_IFBLK &&
-           (st.st_mode & S_IFMT) != S_IFCHR)
-               fatal("%s: not a block or character device", special);
+       if ((st.st_mode & S_IFMT) != S_IFCHR)
+               fatal("%s: not a character device", special);
        dp = getdiskbyname(argv[1]);
        if (dp == 0)
                fatal("%s: unknown disk type", argv[1]);
        dp = getdiskbyname(argv[1]);
        if (dp == 0)
                fatal("%s: unknown disk type", argv[1]);
@@ -216,7 +233,9 @@ again:
                        fatal("%s: no default revolutions/minute value",
                                argv[1]);
        }
                        fatal("%s: no default revolutions/minute value",
                                argv[1]);
        }
-       if (minfree == 0)
+       if (density <= 0)
+               density = 2048;
+       if (minfree < 0)
                minfree = 10;
        if (cpg == 0)
                cpg = 16;
                minfree = 10;
        if (cpg == 0)
                cpg = 16;
@@ -229,6 +248,7 @@ again:
        av[i++] = sprintf(a7, "%d", cpg);
        av[i++] = sprintf(a8, "%d", minfree);
        av[i++] = sprintf(a9, "%d", rpm / 60);
        av[i++] = sprintf(a7, "%d", cpg);
        av[i++] = sprintf(a8, "%d", minfree);
        av[i++] = sprintf(a9, "%d", rpm / 60);
+       av[i++] = sprintf(a10, "%d", density);
        av[i++] = 0;
        sprintf(cmd, "/etc/mkfs %s", special);
        for (i = 0; av[i] != 0; i++) {
        av[i++] = 0;
        sprintf(cmd, "/etc/mkfs %s", special);
        for (i = 0; av[i] != 0; i++) {
@@ -239,14 +259,15 @@ again:
                printf("%s\n", cmd);
        if (status = system(cmd))
                exit(status);
                printf("%s\n", cmd);
        if (status = system(cmd))
                exit(status);
-       if (*cp == 'a') {
+       if (*cp == 'a' && !noboot) {
                char type[3];
                char type[3];
+               struct stat sb;
 
                cp = rindex(special, '/');
                if (cp == NULL)
                        fatal("%s: can't figure out disk type from name",
                                special);
 
                cp = rindex(special, '/');
                if (cp == NULL)
                        fatal("%s: can't figure out disk type from name",
                                special);
-               if (cp[1] == 'r')
+               if (stat(special, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFCHR)
                        cp++;
                type[0] = *++cp;
                type[1] = *++cp;
                        cp++;
                type[0] = *++cp;
                type[1] = *++cp;