110762Ssam #ifndef lint 2*10763Ssam static char sccsid[] = "@(#)newfs.c 4.2 02/08/83"; 310762Ssam #endif 410762Ssam 510762Ssam /* 610762Ssam * makefs: 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 */ 2410762Ssam 2510762Ssam char *av[20]; /* argv array and buffers for exec */ 2610762Ssam char a2[20]; 2710762Ssam char a3[20]; 2810762Ssam char a4[20]; 2910762Ssam char a5[20]; 3010762Ssam char a6[20]; 3110762Ssam char a7[20]; 3210762Ssam char device[MAXPATHLEN]; 3310762Ssam char cmd[BUFSIZ]; 3410762Ssam 3510762Ssam char *index(); 3610762Ssam char *rindex(); 3710762Ssam char *sprintf(); 3810762Ssam 3910762Ssam main(argc, argv) 4010762Ssam char *argv[]; 4110762Ssam { 4210762Ssam char *cp, *special; 4310762Ssam register struct disktab *dp; 4410762Ssam register struct partition *pp; 4510762Ssam struct stat st; 4610762Ssam register int i; 4710762Ssam int status; 4810762Ssam 4910762Ssam argc--, argv++; 5010762Ssam while (argc > 0 && argv[0][0] == '-') { 5110762Ssam for (cp = &argv[0][1]; *cp; cp++) 5210762Ssam switch (*cp) { 5310762Ssam 5410762Ssam case 'v': 5510762Ssam verbose++; 5610762Ssam break; 5710762Ssam 5810762Ssam case 's': 5910762Ssam if (argc < 1) 6010762Ssam fatal("-s: missing file system size"); 6110762Ssam argc--, argv++; 6210762Ssam fssize = atoi(*argv); 6310762Ssam if (fssize < 0) 6410762Ssam fatal("%s: bad file system size", 6510762Ssam *argv); 6610762Ssam goto next; 6710762Ssam 6810762Ssam case 't': 6910762Ssam if (argc < 1) 7010762Ssam fatal("-t: missing track total"); 7110762Ssam argc--, argv++; 7210762Ssam ntracks = atoi(*argv); 7310762Ssam if (ntracks < 0) 7410762Ssam fatal("%s: bad total tracks", *argv); 7510762Ssam goto next; 7610762Ssam 7710762Ssam case 'b': 7810762Ssam if (argc < 1) 7910762Ssam fatal("-b: missing block size"); 8010762Ssam argc--, argv++; 8110762Ssam bsize = atoi(*argv); 8210762Ssam if (bsize < 0 || bsize < MINBSIZE) 8310762Ssam fatal("%s: bad block size", *argv); 8410762Ssam goto next; 8510762Ssam 8610762Ssam case 'f': 8710762Ssam if (argc < 1) 8810762Ssam fatal("-f: missing frag size"); 8910762Ssam argc--, argv++; 9010762Ssam fsize = atoi(*argv); 9110762Ssam if (fsize < 0) 9210762Ssam fatal("%s: bad frag size", *argv); 9310762Ssam goto next; 9410762Ssam 9510762Ssam case 'S': 9610762Ssam if (argc < 1) 9710762Ssam fatal("-S: missing sector size"); 9810762Ssam argc--, argv++; 9910762Ssam sectorsize = atoi(*argv); 10010762Ssam if (sectorsize < 0) 10110762Ssam fatal("%s: bad sector size", *argv); 10210762Ssam goto next; 10310762Ssam 10410762Ssam case 'c': 10510762Ssam if (argc < 1) 10610762Ssam fatal("-c: missing cylinders/group"); 10710762Ssam argc--, argv++; 10810762Ssam cpg = atoi(*argv); 10910762Ssam if (cpg < 0) 11010762Ssam fatal("%s: bad cylinders/group", *argv); 11110762Ssam goto next; 11210762Ssam 11310762Ssam default: 11410762Ssam fatal("-%c: unknown flag", cp); 11510762Ssam } 11610762Ssam next: 11710762Ssam argc--, argv++; 11810762Ssam } 11910762Ssam if (argc < 2) { 12010762Ssam fprintf(stderr, "usage: makefs [ -v ] [ mkfs-options ] %s\n", 12110762Ssam "special-device device-type"); 12210762Ssam fprintf(stderr, "where mkfs-options are:\n"); 12310762Ssam fprintf(stderr, "-s sectors/track\n"); 12410762Ssam fprintf(stderr, "-b block-size\n"); 12510762Ssam fprintf(stderr, "-f frag-size\n"); 12610762Ssam fprintf(stderr, "-t tracks/cylinder\n"); 12710762Ssam fprintf(stderr, "-c cylinders/group\n"); 12810762Ssam fprintf(stderr, "-S sector-size\n"); 12910762Ssam exit(1); 13010762Ssam } 13110762Ssam special = argv[0]; 13210762Ssam again: 13310762Ssam if (stat(special, &st) < 0) { 13410762Ssam if (*special != '/') { 13510762Ssam special = sprintf(device, "/dev/%s", argv[0]); 13610762Ssam goto again; 13710762Ssam } 13810762Ssam fprintf(stderr, "makefs: "); perror(special); 13910762Ssam exit(2); 14010762Ssam } 14110762Ssam if ((st.st_mode & S_IFMT) != S_IFBLK && 14210762Ssam (st.st_mode & S_IFMT) != S_IFCHR) 14310762Ssam fatal("%s: not a block or character device", special); 14410762Ssam dp = getdiskbyname(argv[1]); 14510762Ssam if (dp == 0) 14610762Ssam fatal("%s: unknown disk type", argv[1]); 14710762Ssam cp = index(argv[0], '\0') - 1; 14810762Ssam if (cp == 0 || *cp < 'a' || *cp > 'h') 14910762Ssam fatal("%s: can't figure out file system partition", argv[0]); 15010762Ssam pp = &dp->d_partitions[*cp - 'a']; 15110762Ssam if (fssize == 0) { 15210762Ssam fssize = pp->p_size; 15310762Ssam if (fssize < 0) 15410762Ssam fatal("%s: no default size for `%c' partition", 15510762Ssam argv[1], *cp); 15610762Ssam } 15710762Ssam if (nsectors == 0) { 15810762Ssam nsectors = dp->d_nsectors; 15910762Ssam if (nsectors < 0) 16010762Ssam fatal("%s: no default #sectors/track", argv[1]); 16110762Ssam } 16210762Ssam if (ntracks == 0) { 16310762Ssam ntracks = dp->d_ntracks; 16410762Ssam if (ntracks < 0) 16510762Ssam fatal("%s: no default #tracks", argv[1]); 16610762Ssam } 16710762Ssam if (sectorsize == 0) { 16810762Ssam sectorsize = dp->d_secsize; 16910762Ssam if (sectorsize < 0) 17010762Ssam fatal("%s: no default sector size", argv[1]); 17110762Ssam } 17210762Ssam if (bsize == 0) { 17310762Ssam bsize = pp->p_bsize; 17410762Ssam if (bsize < 0) 17510762Ssam fatal("%s: no default block size for `%c' partition", 17610762Ssam argv[1], *cp); 17710762Ssam } 17810762Ssam if (fsize == 0) { 17910762Ssam fsize = pp->p_fsize; 18010762Ssam if (fsize < 0) 18110762Ssam fatal("%s: no default frag size for `%c' partition", 18210762Ssam argv[1], *cp); 18310762Ssam } 18410762Ssam i = 0; 18510762Ssam av[i++] = sprintf(a2, "%d", fssize); 18610762Ssam av[i++] = sprintf(a3, "%d", nsectors); 18710762Ssam av[i++] = sprintf(a4, "%d", ntracks); 18810762Ssam av[i++] = sprintf(a5, "%d", bsize); 18910762Ssam av[i++] = sprintf(a6, "%d", fsize); 19010762Ssam if (cpg != 0) 19110762Ssam av[i++] = sprintf(a7, "%d", cpg); 19210762Ssam av[i++] = 0; 19310762Ssam sprintf(cmd, "/etc/mkfs %s", special); 19410762Ssam for (i = 0; av[i] != 0; i++) { 19510762Ssam strcat(cmd, " "); 19610762Ssam strcat(cmd, av[i]); 19710762Ssam } 19810762Ssam if (verbose) 19910762Ssam printf("%s\n", cmd); 20010762Ssam if (status = system(cmd)) 20110762Ssam exit(status); 20210762Ssam if (*cp == 'a') { 20310762Ssam char type[3]; 20410762Ssam 20510762Ssam cp = rindex(special, '/'); 20610762Ssam if (cp == NULL) 20710762Ssam fatal("%s: can't figure out disk type from name", 20810762Ssam special); 20910762Ssam type[0] = *++cp; 21010762Ssam type[1] = *++cp; 21110762Ssam type[2] = '\0'; 21210762Ssam installboot(special, type); 21310762Ssam } 21410762Ssam exit(0); 21510762Ssam } 21610762Ssam 21710762Ssam installboot(dev, type) 21810762Ssam char *dev, *type; 21910762Ssam { 22010762Ssam int fd; 22110762Ssam char bootblock[MAXPATHLEN], standalonecode[MAXPATHLEN]; 22210762Ssam char bootimage[BBSIZE]; 22310762Ssam 22410762Ssam sprintf(bootblock, "/sys/mdec/%sboot", type); 22510762Ssam sprintf(standalonecode, "/sys/stand/boot%s", type); 22610762Ssam if (verbose) { 22710762Ssam printf("installing boot code\n"); 22810762Ssam printf("sector 0 boot = %s\n", bootblock); 22910762Ssam printf("1st level boot = %s\n", standalonecode); 23010762Ssam } 23110762Ssam fd = open(bootblock, 0); 23210762Ssam if (fd < 0) { 23310762Ssam fprintf(stderr, "makefs: "); perror(bootblock); 23410762Ssam exit(1); 23510762Ssam } 23610762Ssam if (read(fd, bootimage, DEV_BSIZE) < 0) { 23710762Ssam fprintf(stderr, "makefs: "); perror(bootblock); 23810762Ssam exit(2); 23910762Ssam } 24010762Ssam close(fd); 24110762Ssam fd = open(standalonecode, 0); 24210762Ssam if (fd < 0) { 24310762Ssam fprintf(stderr, "makefs: "); perror(standalonecode); 24410762Ssam exit(1); 24510762Ssam } 24610762Ssam if (read(fd, &bootimage[DEV_BSIZE], BBSIZE - DEV_BSIZE) < 0) { 24710762Ssam fprintf(stderr, "makefs: "); perror(standalonecode); 24810762Ssam exit(2); 24910762Ssam } 25010762Ssam close(fd); 251*10763Ssam fd = open(dev, 1); 25210762Ssam if (fd < 0) { 253*10763Ssam fprintf(stderr, "makefs: "); perror(dev); 25410762Ssam exit(1); 25510762Ssam } 25610762Ssam if (write(fd, bootimage, BBSIZE) != BBSIZE) { 257*10763Ssam fprintf(stderr, "makefs: "); perror(dev); 25810762Ssam exit(2); 25910762Ssam } 26010762Ssam close(fd); 26110762Ssam } 26210762Ssam 26310762Ssam /*VARARGS*/ 26410762Ssam fatal(fmt, arg1, arg2) 26510762Ssam char *fmt; 26610762Ssam { 26710762Ssam 26810762Ssam fprintf(stderr, "makefs: "); 26910762Ssam fprintf(stderr, fmt, arg1, arg2); 27010762Ssam putc('\n', stderr); 27110762Ssam exit(10); 27210762Ssam } 273