110762Ssam #ifndef lint 2*11069Ssam static char sccsid[] = "@(#)newfs.c 4.5 02/15/83"; 310762Ssam #endif 410762Ssam 510762Ssam /* 6*11069Ssam * newfs: friendly front end to mkfs 710762Ssam */ 810762Ssam #include <sys/param.h> 910762Ssam #include <sys/stat.h> 1010762Ssam #include <sys/fs.h> 1110762Ssam 1210762Ssam #include <stdio.h> 1310762Ssam #include <dir.h> 1410762Ssam #include <disktab.h> 1510762Ssam 1610762Ssam int verbose; /* show mkfs line before exec */ 1710762Ssam int fssize; /* file system size */ 1810762Ssam int fsize; /* fragment size */ 1910762Ssam int bsize; /* block size */ 2010762Ssam int ntracks; /* # tracks/cylinder */ 2110762Ssam int nsectors; /* # sectors/track */ 2210762Ssam int sectorsize; /* bytes/sector */ 2310762Ssam int cpg; /* cylinders/cylinder group */ 24*11069Ssam int minfree; /* free space threshold */ 25*11069Ssam int rpm; /* revolutions/minute of drive */ 2610762Ssam 2710762Ssam char *av[20]; /* argv array and buffers for exec */ 2810762Ssam char a2[20]; 2910762Ssam char a3[20]; 3010762Ssam char a4[20]; 3110762Ssam char a5[20]; 3210762Ssam char a6[20]; 3310762Ssam char a7[20]; 34*11069Ssam char a8[20]; 35*11069Ssam char a9[20]; 3610762Ssam char device[MAXPATHLEN]; 3710762Ssam char cmd[BUFSIZ]; 3810762Ssam 3910762Ssam char *index(); 4010762Ssam char *rindex(); 4110762Ssam char *sprintf(); 4210762Ssam 4310762Ssam main(argc, argv) 4410762Ssam char *argv[]; 4510762Ssam { 4610762Ssam char *cp, *special; 4710762Ssam register struct disktab *dp; 4810762Ssam register struct partition *pp; 4910762Ssam struct stat st; 5010762Ssam register int i; 5110762Ssam int status; 5210762Ssam 5310762Ssam argc--, argv++; 5410762Ssam while (argc > 0 && argv[0][0] == '-') { 5510762Ssam for (cp = &argv[0][1]; *cp; cp++) 5610762Ssam switch (*cp) { 5710762Ssam 5810762Ssam case 'v': 5910762Ssam verbose++; 6010762Ssam break; 6110762Ssam 6210762Ssam case 's': 6310762Ssam if (argc < 1) 6410762Ssam fatal("-s: missing file system size"); 6510762Ssam argc--, argv++; 6610762Ssam fssize = atoi(*argv); 6710762Ssam if (fssize < 0) 6810762Ssam fatal("%s: bad file system size", 6910762Ssam *argv); 7010762Ssam goto next; 7110762Ssam 7210762Ssam case 't': 7310762Ssam if (argc < 1) 7410762Ssam fatal("-t: missing track total"); 7510762Ssam argc--, argv++; 7610762Ssam ntracks = atoi(*argv); 7710762Ssam if (ntracks < 0) 7810762Ssam fatal("%s: bad total tracks", *argv); 7910762Ssam goto next; 8010762Ssam 8110762Ssam case 'b': 8210762Ssam if (argc < 1) 8310762Ssam fatal("-b: missing block size"); 8410762Ssam argc--, argv++; 8510762Ssam bsize = atoi(*argv); 8610762Ssam if (bsize < 0 || bsize < MINBSIZE) 8710762Ssam fatal("%s: bad block size", *argv); 8810762Ssam goto next; 8910762Ssam 9010762Ssam case 'f': 9110762Ssam if (argc < 1) 9210762Ssam fatal("-f: missing frag size"); 9310762Ssam argc--, argv++; 9410762Ssam fsize = atoi(*argv); 9510762Ssam if (fsize < 0) 9610762Ssam fatal("%s: bad frag size", *argv); 9710762Ssam goto next; 9810762Ssam 9910762Ssam case 'S': 10010762Ssam if (argc < 1) 10110762Ssam fatal("-S: missing sector size"); 10210762Ssam argc--, argv++; 10310762Ssam sectorsize = atoi(*argv); 10410762Ssam if (sectorsize < 0) 10510762Ssam fatal("%s: bad sector size", *argv); 10610762Ssam goto next; 10710762Ssam 10810762Ssam case 'c': 10910762Ssam if (argc < 1) 11010762Ssam fatal("-c: missing cylinders/group"); 11110762Ssam argc--, argv++; 11210762Ssam cpg = atoi(*argv); 11310762Ssam if (cpg < 0) 11410762Ssam fatal("%s: bad cylinders/group", *argv); 11510762Ssam goto next; 11610762Ssam 117*11069Ssam case 'm': 118*11069Ssam if (argc < 1) 119*11069Ssam fatal("-m: missing free space %%\n"); 120*11069Ssam argc--, argv++; 121*11069Ssam minfree = atoi(*argv); 122*11069Ssam if (minfree < 0 || minfree > 99) 123*11069Ssam fatal("%s: bad free space %%\n", 124*11069Ssam *argv); 125*11069Ssam goto next; 126*11069Ssam 127*11069Ssam case 'r': 128*11069Ssam if (argc < 1) 129*11069Ssam fatal("-r: missing revs/minute\n"); 130*11069Ssam argc--, argv++; 131*11069Ssam rpm = atoi(*argv); 132*11069Ssam if (rpm < 0) 133*11069Ssam fatal("%s: bad revs/minute\n", *argv); 134*11069Ssam goto next; 135*11069Ssam 13610762Ssam default: 13710762Ssam fatal("-%c: unknown flag", cp); 13810762Ssam } 13910762Ssam next: 14010762Ssam argc--, argv++; 14110762Ssam } 14210762Ssam if (argc < 2) { 143*11069Ssam fprintf(stderr, "usage: newfs [ -v ] [ mkfs-options ] %s\n", 14410762Ssam "special-device device-type"); 14510762Ssam fprintf(stderr, "where mkfs-options are:\n"); 14611057Ssam fprintf(stderr, "\t-s file system size (sectors)\n"); 14711057Ssam fprintf(stderr, "\t-b block size\n"); 14811057Ssam fprintf(stderr, "\t-f frag size\n"); 14910873Ssam fprintf(stderr, "\t-t tracks/cylinder\n"); 15010873Ssam fprintf(stderr, "\t-c cylinders/group\n"); 151*11069Ssam fprintf(stderr, "\t-m minimum free space %%\n"); 152*11069Ssam fprintf(stderr, "\t-r revolutions/minute\n"); 15311057Ssam fprintf(stderr, "\t-S sector size\n"); 15410762Ssam exit(1); 15510762Ssam } 15610762Ssam special = argv[0]; 15710762Ssam again: 15810762Ssam if (stat(special, &st) < 0) { 15910762Ssam if (*special != '/') { 16010873Ssam if (*special == 'r') 16110873Ssam special++; 16210873Ssam special = sprintf(device, "/dev/r%s", special); 16310762Ssam goto again; 16410762Ssam } 165*11069Ssam fprintf(stderr, "newfs: "); perror(special); 16610762Ssam exit(2); 16710762Ssam } 16810762Ssam if ((st.st_mode & S_IFMT) != S_IFBLK && 16910762Ssam (st.st_mode & S_IFMT) != S_IFCHR) 17010762Ssam fatal("%s: not a block or character device", special); 17110762Ssam dp = getdiskbyname(argv[1]); 17210762Ssam if (dp == 0) 17310762Ssam fatal("%s: unknown disk type", argv[1]); 17410762Ssam cp = index(argv[0], '\0') - 1; 17510762Ssam if (cp == 0 || *cp < 'a' || *cp > 'h') 17610762Ssam fatal("%s: can't figure out file system partition", argv[0]); 17710762Ssam pp = &dp->d_partitions[*cp - 'a']; 17810762Ssam if (fssize == 0) { 17910762Ssam fssize = pp->p_size; 18010762Ssam if (fssize < 0) 18110762Ssam fatal("%s: no default size for `%c' partition", 18210762Ssam argv[1], *cp); 18310762Ssam } 18410762Ssam if (nsectors == 0) { 18510762Ssam nsectors = dp->d_nsectors; 18610762Ssam if (nsectors < 0) 18710762Ssam fatal("%s: no default #sectors/track", argv[1]); 18810762Ssam } 18910762Ssam if (ntracks == 0) { 19010762Ssam ntracks = dp->d_ntracks; 19110762Ssam if (ntracks < 0) 19210762Ssam fatal("%s: no default #tracks", argv[1]); 19310762Ssam } 19410762Ssam if (sectorsize == 0) { 19510762Ssam sectorsize = dp->d_secsize; 19610762Ssam if (sectorsize < 0) 19710762Ssam fatal("%s: no default sector size", argv[1]); 19810762Ssam } 19910762Ssam if (bsize == 0) { 20010762Ssam bsize = pp->p_bsize; 20110762Ssam if (bsize < 0) 20210762Ssam fatal("%s: no default block size for `%c' partition", 20310762Ssam argv[1], *cp); 20410762Ssam } 20510762Ssam if (fsize == 0) { 20610762Ssam fsize = pp->p_fsize; 20710762Ssam if (fsize < 0) 20810762Ssam fatal("%s: no default frag size for `%c' partition", 20910762Ssam argv[1], *cp); 21010762Ssam } 211*11069Ssam if (rpm == 0) { 212*11069Ssam rpm = dp->d_rpm; 213*11069Ssam if (rpm < 0) 214*11069Ssam fatal("%s: no default revolutions/minute value", 215*11069Ssam argv[1]); 216*11069Ssam } 217*11069Ssam if (minfree == 0) 218*11069Ssam minfree = 10; 219*11069Ssam if (cpg == 0) 220*11069Ssam cpg = 16; 22110762Ssam i = 0; 22210762Ssam av[i++] = sprintf(a2, "%d", fssize); 22310762Ssam av[i++] = sprintf(a3, "%d", nsectors); 22410762Ssam av[i++] = sprintf(a4, "%d", ntracks); 22510762Ssam av[i++] = sprintf(a5, "%d", bsize); 22610762Ssam av[i++] = sprintf(a6, "%d", fsize); 227*11069Ssam av[i++] = sprintf(a7, "%d", cpg); 228*11069Ssam av[i++] = sprintf(a8, "%d", minfree); 229*11069Ssam av[i++] = sprintf(a9, "%d", rpm / 60); 23010762Ssam av[i++] = 0; 23110762Ssam sprintf(cmd, "/etc/mkfs %s", special); 23210762Ssam for (i = 0; av[i] != 0; i++) { 23310762Ssam strcat(cmd, " "); 23410762Ssam strcat(cmd, av[i]); 23510762Ssam } 23610762Ssam if (verbose) 23710762Ssam printf("%s\n", cmd); 23810762Ssam if (status = system(cmd)) 23910762Ssam exit(status); 24010762Ssam if (*cp == 'a') { 24110762Ssam char type[3]; 24210762Ssam 24310762Ssam cp = rindex(special, '/'); 24410762Ssam if (cp == NULL) 24510762Ssam fatal("%s: can't figure out disk type from name", 24610762Ssam special); 24710873Ssam if (cp[1] == 'r') 24810873Ssam cp++; 24910762Ssam type[0] = *++cp; 25010762Ssam type[1] = *++cp; 25110762Ssam type[2] = '\0'; 25210762Ssam installboot(special, type); 25310762Ssam } 25410762Ssam exit(0); 25510762Ssam } 25610762Ssam 25710762Ssam installboot(dev, type) 25810762Ssam char *dev, *type; 25910762Ssam { 26010762Ssam int fd; 26110762Ssam char bootblock[MAXPATHLEN], standalonecode[MAXPATHLEN]; 26210762Ssam char bootimage[BBSIZE]; 26310762Ssam 26410762Ssam sprintf(bootblock, "/sys/mdec/%sboot", type); 26510762Ssam sprintf(standalonecode, "/sys/stand/boot%s", type); 26610762Ssam if (verbose) { 26710762Ssam printf("installing boot code\n"); 26810762Ssam printf("sector 0 boot = %s\n", bootblock); 26910762Ssam printf("1st level boot = %s\n", standalonecode); 27010762Ssam } 27110762Ssam fd = open(bootblock, 0); 27210762Ssam if (fd < 0) { 273*11069Ssam fprintf(stderr, "newfs: "); perror(bootblock); 27410762Ssam exit(1); 27510762Ssam } 27610762Ssam if (read(fd, bootimage, DEV_BSIZE) < 0) { 277*11069Ssam fprintf(stderr, "newfs: "); perror(bootblock); 27810762Ssam exit(2); 27910762Ssam } 28010762Ssam close(fd); 28110762Ssam fd = open(standalonecode, 0); 28210762Ssam if (fd < 0) { 283*11069Ssam fprintf(stderr, "newfs: "); perror(standalonecode); 28410762Ssam exit(1); 28510762Ssam } 28610762Ssam if (read(fd, &bootimage[DEV_BSIZE], BBSIZE - DEV_BSIZE) < 0) { 287*11069Ssam fprintf(stderr, "newfs: "); perror(standalonecode); 28810762Ssam exit(2); 28910762Ssam } 29010762Ssam close(fd); 29110763Ssam fd = open(dev, 1); 29210762Ssam if (fd < 0) { 293*11069Ssam fprintf(stderr, "newfs: "); perror(dev); 29410762Ssam exit(1); 29510762Ssam } 29610762Ssam if (write(fd, bootimage, BBSIZE) != BBSIZE) { 297*11069Ssam fprintf(stderr, "newfs: "); perror(dev); 29810762Ssam exit(2); 29910762Ssam } 30010762Ssam close(fd); 30110762Ssam } 30210762Ssam 30310762Ssam /*VARARGS*/ 30410762Ssam fatal(fmt, arg1, arg2) 30510762Ssam char *fmt; 30610762Ssam { 30710762Ssam 308*11069Ssam fprintf(stderr, "newfs: "); 30910762Ssam fprintf(stderr, fmt, arg1, arg2); 31010762Ssam putc('\n', stderr); 31110762Ssam exit(10); 31210762Ssam } 313