110762Ssam #ifndef lint 2*14321Ssam static char sccsid[] = "@(#)newfs.c 4.11 08/01/83"; 310762Ssam #endif 410762Ssam 510762Ssam /* 611069Ssam * newfs: friendly front end to mkfs 710762Ssam */ 810762Ssam #include <sys/param.h> 910762Ssam #include <sys/stat.h> 1010762Ssam #include <sys/fs.h> 1113603Ssam #include <sys/dir.h> 1210762Ssam 1310762Ssam #include <stdio.h> 1410762Ssam #include <disktab.h> 1510762Ssam 1611183Ssam #define BOOTDIR "/usr/mdec" /* directory for boot blocks */ 1711183Ssam 1810762Ssam int verbose; /* show mkfs line before exec */ 1912334Shelge int noboot; /* do not fill boot blocks */ 2010762Ssam int fssize; /* file system size */ 2110762Ssam int fsize; /* fragment size */ 2210762Ssam int bsize; /* block size */ 2310762Ssam int ntracks; /* # tracks/cylinder */ 2410762Ssam int nsectors; /* # sectors/track */ 2510762Ssam int sectorsize; /* bytes/sector */ 2610762Ssam int cpg; /* cylinders/cylinder group */ 2712334Shelge int minfree = -1; /* free space threshold */ 2811069Ssam int rpm; /* revolutions/minute of drive */ 2910762Ssam 3010762Ssam char *av[20]; /* argv array and buffers for exec */ 3110762Ssam char a2[20]; 3210762Ssam char a3[20]; 3310762Ssam char a4[20]; 3410762Ssam char a5[20]; 3510762Ssam char a6[20]; 3610762Ssam char a7[20]; 3711069Ssam char a8[20]; 3811069Ssam char a9[20]; 3910762Ssam char device[MAXPATHLEN]; 4010762Ssam char cmd[BUFSIZ]; 4110762Ssam 4210762Ssam char *index(); 4310762Ssam char *rindex(); 4410762Ssam char *sprintf(); 4510762Ssam 4610762Ssam main(argc, argv) 4714064Smckusick int argc; 4810762Ssam char *argv[]; 4910762Ssam { 5010762Ssam char *cp, *special; 5110762Ssam register struct disktab *dp; 5210762Ssam register struct partition *pp; 5310762Ssam struct stat st; 5410762Ssam register int i; 5510762Ssam int status; 5610762Ssam 5710762Ssam argc--, argv++; 5810762Ssam while (argc > 0 && argv[0][0] == '-') { 5910762Ssam for (cp = &argv[0][1]; *cp; cp++) 6010762Ssam switch (*cp) { 6110762Ssam 6210762Ssam case 'v': 6310762Ssam verbose++; 6410762Ssam break; 6510762Ssam 6612334Shelge case 'n': 6712334Shelge noboot++; 6812334Shelge break; 6912334Shelge 7010762Ssam case 's': 7110762Ssam if (argc < 1) 7210762Ssam fatal("-s: missing file system size"); 7310762Ssam argc--, argv++; 7410762Ssam fssize = atoi(*argv); 7510762Ssam if (fssize < 0) 7610762Ssam fatal("%s: bad file system size", 7710762Ssam *argv); 7810762Ssam goto next; 7910762Ssam 8010762Ssam case 't': 8110762Ssam if (argc < 1) 8210762Ssam fatal("-t: missing track total"); 8310762Ssam argc--, argv++; 8410762Ssam ntracks = atoi(*argv); 8510762Ssam if (ntracks < 0) 8610762Ssam fatal("%s: bad total tracks", *argv); 8710762Ssam goto next; 8810762Ssam 8910762Ssam case 'b': 9010762Ssam if (argc < 1) 9110762Ssam fatal("-b: missing block size"); 9210762Ssam argc--, argv++; 9310762Ssam bsize = atoi(*argv); 9410762Ssam if (bsize < 0 || bsize < MINBSIZE) 9510762Ssam fatal("%s: bad block size", *argv); 9610762Ssam goto next; 9710762Ssam 9810762Ssam case 'f': 9910762Ssam if (argc < 1) 10010762Ssam fatal("-f: missing frag size"); 10110762Ssam argc--, argv++; 10210762Ssam fsize = atoi(*argv); 10310762Ssam if (fsize < 0) 10410762Ssam fatal("%s: bad frag size", *argv); 10510762Ssam goto next; 10610762Ssam 10710762Ssam case 'S': 10810762Ssam if (argc < 1) 10910762Ssam fatal("-S: missing sector size"); 11010762Ssam argc--, argv++; 11110762Ssam sectorsize = atoi(*argv); 11210762Ssam if (sectorsize < 0) 11310762Ssam fatal("%s: bad sector size", *argv); 11410762Ssam goto next; 11510762Ssam 11610762Ssam case 'c': 11710762Ssam if (argc < 1) 11810762Ssam fatal("-c: missing cylinders/group"); 11910762Ssam argc--, argv++; 12010762Ssam cpg = atoi(*argv); 12110762Ssam if (cpg < 0) 12210762Ssam fatal("%s: bad cylinders/group", *argv); 12310762Ssam goto next; 12410762Ssam 12511069Ssam case 'm': 12611069Ssam if (argc < 1) 12711069Ssam fatal("-m: missing free space %%\n"); 12811069Ssam argc--, argv++; 12911069Ssam minfree = atoi(*argv); 13011069Ssam if (minfree < 0 || minfree > 99) 13111069Ssam fatal("%s: bad free space %%\n", 13211069Ssam *argv); 13311069Ssam goto next; 13411069Ssam 13511069Ssam case 'r': 13611069Ssam if (argc < 1) 13711069Ssam fatal("-r: missing revs/minute\n"); 13811069Ssam argc--, argv++; 13911069Ssam rpm = atoi(*argv); 14011069Ssam if (rpm < 0) 14111069Ssam fatal("%s: bad revs/minute\n", *argv); 14211069Ssam goto next; 14311069Ssam 14410762Ssam default: 14510762Ssam fatal("-%c: unknown flag", cp); 14610762Ssam } 14710762Ssam next: 14810762Ssam argc--, argv++; 14910762Ssam } 15010762Ssam if (argc < 2) { 15111069Ssam fprintf(stderr, "usage: newfs [ -v ] [ mkfs-options ] %s\n", 15210762Ssam "special-device device-type"); 15310762Ssam fprintf(stderr, "where mkfs-options are:\n"); 15411057Ssam fprintf(stderr, "\t-s file system size (sectors)\n"); 15511057Ssam fprintf(stderr, "\t-b block size\n"); 15611057Ssam fprintf(stderr, "\t-f frag size\n"); 15710873Ssam fprintf(stderr, "\t-t tracks/cylinder\n"); 15810873Ssam fprintf(stderr, "\t-c cylinders/group\n"); 15911069Ssam fprintf(stderr, "\t-m minimum free space %%\n"); 16011069Ssam fprintf(stderr, "\t-r revolutions/minute\n"); 16111057Ssam fprintf(stderr, "\t-S sector size\n"); 16210762Ssam exit(1); 16310762Ssam } 16410762Ssam special = argv[0]; 16514064Smckusick cp = rindex(special, '/'); 16614064Smckusick if (cp != 0) 16714064Smckusick special = cp + 1; 168*14321Ssam if (*special == 'r' && special[1] != 'a' && special[1] != 'b') 16914064Smckusick special++; 17014064Smckusick special = sprintf(device, "/dev/r%s", special); 17110762Ssam if (stat(special, &st) < 0) { 17211069Ssam fprintf(stderr, "newfs: "); perror(special); 17310762Ssam exit(2); 17410762Ssam } 17514064Smckusick if ((st.st_mode & S_IFMT) != S_IFCHR) 17614064Smckusick fatal("%s: not a character device", special); 17710762Ssam dp = getdiskbyname(argv[1]); 17810762Ssam if (dp == 0) 17910762Ssam fatal("%s: unknown disk type", argv[1]); 18010762Ssam cp = index(argv[0], '\0') - 1; 18110762Ssam if (cp == 0 || *cp < 'a' || *cp > 'h') 18210762Ssam fatal("%s: can't figure out file system partition", argv[0]); 18310762Ssam pp = &dp->d_partitions[*cp - 'a']; 18410762Ssam if (fssize == 0) { 18510762Ssam fssize = pp->p_size; 18610762Ssam if (fssize < 0) 18710762Ssam fatal("%s: no default size for `%c' partition", 18810762Ssam argv[1], *cp); 18910762Ssam } 19010762Ssam if (nsectors == 0) { 19110762Ssam nsectors = dp->d_nsectors; 19210762Ssam if (nsectors < 0) 19310762Ssam fatal("%s: no default #sectors/track", argv[1]); 19410762Ssam } 19510762Ssam if (ntracks == 0) { 19610762Ssam ntracks = dp->d_ntracks; 19710762Ssam if (ntracks < 0) 19810762Ssam fatal("%s: no default #tracks", argv[1]); 19910762Ssam } 20010762Ssam if (sectorsize == 0) { 20110762Ssam sectorsize = dp->d_secsize; 20210762Ssam if (sectorsize < 0) 20310762Ssam fatal("%s: no default sector size", argv[1]); 20410762Ssam } 20510762Ssam if (bsize == 0) { 20610762Ssam bsize = pp->p_bsize; 20710762Ssam if (bsize < 0) 20810762Ssam fatal("%s: no default block size for `%c' partition", 20910762Ssam argv[1], *cp); 21010762Ssam } 21110762Ssam if (fsize == 0) { 21210762Ssam fsize = pp->p_fsize; 21310762Ssam if (fsize < 0) 21410762Ssam fatal("%s: no default frag size for `%c' partition", 21510762Ssam argv[1], *cp); 21610762Ssam } 21711069Ssam if (rpm == 0) { 21811069Ssam rpm = dp->d_rpm; 21911069Ssam if (rpm < 0) 22011069Ssam fatal("%s: no default revolutions/minute value", 22111069Ssam argv[1]); 22211069Ssam } 22312334Shelge if (minfree < 0) 22411069Ssam minfree = 10; 22511069Ssam if (cpg == 0) 22611069Ssam cpg = 16; 22710762Ssam i = 0; 22810762Ssam av[i++] = sprintf(a2, "%d", fssize); 22910762Ssam av[i++] = sprintf(a3, "%d", nsectors); 23010762Ssam av[i++] = sprintf(a4, "%d", ntracks); 23110762Ssam av[i++] = sprintf(a5, "%d", bsize); 23210762Ssam av[i++] = sprintf(a6, "%d", fsize); 23311069Ssam av[i++] = sprintf(a7, "%d", cpg); 23411069Ssam av[i++] = sprintf(a8, "%d", minfree); 23511069Ssam av[i++] = sprintf(a9, "%d", rpm / 60); 23610762Ssam av[i++] = 0; 23710762Ssam sprintf(cmd, "/etc/mkfs %s", special); 23810762Ssam for (i = 0; av[i] != 0; i++) { 23910762Ssam strcat(cmd, " "); 24010762Ssam strcat(cmd, av[i]); 24110762Ssam } 24210762Ssam if (verbose) 24310762Ssam printf("%s\n", cmd); 24410762Ssam if (status = system(cmd)) 24510762Ssam exit(status); 24612334Shelge if (*cp == 'a' && !noboot) { 24710762Ssam char type[3]; 24813819Ssam struct stat sb; 24910762Ssam 25010762Ssam cp = rindex(special, '/'); 25110762Ssam if (cp == NULL) 25210762Ssam fatal("%s: can't figure out disk type from name", 25310762Ssam special); 25413819Ssam if (stat(special, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFCHR) 25510873Ssam cp++; 25610762Ssam type[0] = *++cp; 25710762Ssam type[1] = *++cp; 25810762Ssam type[2] = '\0'; 25910762Ssam installboot(special, type); 26010762Ssam } 26110762Ssam exit(0); 26210762Ssam } 26310762Ssam 26410762Ssam installboot(dev, type) 26510762Ssam char *dev, *type; 26610762Ssam { 26710762Ssam int fd; 26810762Ssam char bootblock[MAXPATHLEN], standalonecode[MAXPATHLEN]; 26910762Ssam char bootimage[BBSIZE]; 27010762Ssam 27111183Ssam sprintf(bootblock, "%s/%sboot", BOOTDIR, type); 27211183Ssam sprintf(standalonecode, "%s/boot%s", BOOTDIR, type); 27310762Ssam if (verbose) { 27410762Ssam printf("installing boot code\n"); 27510762Ssam printf("sector 0 boot = %s\n", bootblock); 27610762Ssam printf("1st level boot = %s\n", standalonecode); 27710762Ssam } 27810762Ssam fd = open(bootblock, 0); 27910762Ssam if (fd < 0) { 28011069Ssam fprintf(stderr, "newfs: "); perror(bootblock); 28110762Ssam exit(1); 28210762Ssam } 28310762Ssam if (read(fd, bootimage, DEV_BSIZE) < 0) { 28411069Ssam fprintf(stderr, "newfs: "); perror(bootblock); 28510762Ssam exit(2); 28610762Ssam } 28710762Ssam close(fd); 28810762Ssam fd = open(standalonecode, 0); 28910762Ssam if (fd < 0) { 29011069Ssam fprintf(stderr, "newfs: "); perror(standalonecode); 29110762Ssam exit(1); 29210762Ssam } 29310762Ssam if (read(fd, &bootimage[DEV_BSIZE], BBSIZE - DEV_BSIZE) < 0) { 29411069Ssam fprintf(stderr, "newfs: "); perror(standalonecode); 29510762Ssam exit(2); 29610762Ssam } 29710762Ssam close(fd); 29810763Ssam fd = open(dev, 1); 29910762Ssam if (fd < 0) { 30011069Ssam fprintf(stderr, "newfs: "); perror(dev); 30110762Ssam exit(1); 30210762Ssam } 30310762Ssam if (write(fd, bootimage, BBSIZE) != BBSIZE) { 30411069Ssam fprintf(stderr, "newfs: "); perror(dev); 30510762Ssam exit(2); 30610762Ssam } 30710762Ssam close(fd); 30810762Ssam } 30910762Ssam 31010762Ssam /*VARARGS*/ 31110762Ssam fatal(fmt, arg1, arg2) 31210762Ssam char *fmt; 31310762Ssam { 31410762Ssam 31511069Ssam fprintf(stderr, "newfs: "); 31610762Ssam fprintf(stderr, fmt, arg1, arg2); 31710762Ssam putc('\n', stderr); 31810762Ssam exit(10); 31910762Ssam } 320