xref: /csrg-svn/sbin/newfs/newfs.c (revision 11057)
110762Ssam #ifndef lint
2*11057Ssam static char sccsid[] = "@(#)newfs.c	4.4 02/14/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");
123*11057Ssam 		fprintf(stderr, "\t-s file system size (sectors)\n");
124*11057Ssam 		fprintf(stderr, "\t-b block size\n");
125*11057Ssam 		fprintf(stderr, "\t-f frag size\n");
12610873Ssam 		fprintf(stderr, "\t-t tracks/cylinder\n");
12710873Ssam 		fprintf(stderr, "\t-c cylinders/group\n");
128*11057Ssam 		fprintf(stderr, "\t-S sector size\n");
12910762Ssam 		exit(1);
13010762Ssam 	}
13110762Ssam 	special = argv[0];
13210762Ssam again:
13310762Ssam 	if (stat(special, &st) < 0) {
13410762Ssam 		if (*special != '/') {
13510873Ssam 			if (*special == 'r')
13610873Ssam 				special++;
13710873Ssam 			special = sprintf(device, "/dev/r%s", special);
13810762Ssam 			goto again;
13910762Ssam 		}
14010762Ssam 		fprintf(stderr, "makefs: "); perror(special);
14110762Ssam 		exit(2);
14210762Ssam 	}
14310762Ssam 	if ((st.st_mode & S_IFMT) != S_IFBLK &&
14410762Ssam 	    (st.st_mode & S_IFMT) != S_IFCHR)
14510762Ssam 		fatal("%s: not a block or character device", special);
14610762Ssam 	dp = getdiskbyname(argv[1]);
14710762Ssam 	if (dp == 0)
14810762Ssam 		fatal("%s: unknown disk type", argv[1]);
14910762Ssam 	cp = index(argv[0], '\0') - 1;
15010762Ssam 	if (cp == 0 || *cp < 'a' || *cp > 'h')
15110762Ssam 		fatal("%s: can't figure out file system partition", argv[0]);
15210762Ssam 	pp = &dp->d_partitions[*cp - 'a'];
15310762Ssam 	if (fssize == 0) {
15410762Ssam 		fssize = pp->p_size;
15510762Ssam 		if (fssize < 0)
15610762Ssam 			fatal("%s: no default size for `%c' partition",
15710762Ssam 				argv[1], *cp);
15810762Ssam 	}
15910762Ssam 	if (nsectors == 0) {
16010762Ssam 		nsectors = dp->d_nsectors;
16110762Ssam 		if (nsectors < 0)
16210762Ssam 			fatal("%s: no default #sectors/track", argv[1]);
16310762Ssam 	}
16410762Ssam 	if (ntracks == 0) {
16510762Ssam 		ntracks = dp->d_ntracks;
16610762Ssam 		if (ntracks < 0)
16710762Ssam 			fatal("%s: no default #tracks", argv[1]);
16810762Ssam 	}
16910762Ssam 	if (sectorsize == 0) {
17010762Ssam 		sectorsize = dp->d_secsize;
17110762Ssam 		if (sectorsize < 0)
17210762Ssam 			fatal("%s: no default sector size", argv[1]);
17310762Ssam 	}
17410762Ssam 	if (bsize == 0) {
17510762Ssam 		bsize = pp->p_bsize;
17610762Ssam 		if (bsize < 0)
17710762Ssam 			fatal("%s: no default block size for `%c' partition",
17810762Ssam 				argv[1], *cp);
17910762Ssam 	}
18010762Ssam 	if (fsize == 0) {
18110762Ssam 		fsize = pp->p_fsize;
18210762Ssam 		if (fsize < 0)
18310762Ssam 			fatal("%s: no default frag size for `%c' partition",
18410762Ssam 				argv[1], *cp);
18510762Ssam 	}
18610762Ssam 	i = 0;
18710762Ssam 	av[i++] = sprintf(a2, "%d", fssize);
18810762Ssam 	av[i++] = sprintf(a3, "%d", nsectors);
18910762Ssam 	av[i++] = sprintf(a4, "%d", ntracks);
19010762Ssam 	av[i++] = sprintf(a5, "%d", bsize);
19110762Ssam 	av[i++] = sprintf(a6, "%d", fsize);
19210762Ssam 	if (cpg != 0)
19310762Ssam 		av[i++] = sprintf(a7, "%d", cpg);
19410762Ssam 	av[i++] = 0;
19510762Ssam 	sprintf(cmd, "/etc/mkfs %s", special);
19610762Ssam 	for (i = 0; av[i] != 0; i++) {
19710762Ssam 		strcat(cmd, " ");
19810762Ssam 		strcat(cmd, av[i]);
19910762Ssam 	}
20010762Ssam 	if (verbose)
20110762Ssam 		printf("%s\n", cmd);
20210762Ssam 	if (status = system(cmd))
20310762Ssam 		exit(status);
20410762Ssam 	if (*cp == 'a') {
20510762Ssam 		char type[3];
20610762Ssam 
20710762Ssam 		cp = rindex(special, '/');
20810762Ssam 		if (cp == NULL)
20910762Ssam 			fatal("%s: can't figure out disk type from name",
21010762Ssam 				special);
21110873Ssam 		if (cp[1] == 'r')
21210873Ssam 			cp++;
21310762Ssam 		type[0] = *++cp;
21410762Ssam 		type[1] = *++cp;
21510762Ssam 		type[2] = '\0';
21610762Ssam 		installboot(special, type);
21710762Ssam 	}
21810762Ssam 	exit(0);
21910762Ssam }
22010762Ssam 
22110762Ssam installboot(dev, type)
22210762Ssam 	char *dev, *type;
22310762Ssam {
22410762Ssam 	int fd;
22510762Ssam 	char bootblock[MAXPATHLEN], standalonecode[MAXPATHLEN];
22610762Ssam 	char bootimage[BBSIZE];
22710762Ssam 
22810762Ssam 	sprintf(bootblock, "/sys/mdec/%sboot", type);
22910762Ssam 	sprintf(standalonecode, "/sys/stand/boot%s", type);
23010762Ssam 	if (verbose) {
23110762Ssam 		printf("installing boot code\n");
23210762Ssam 		printf("sector 0 boot = %s\n", bootblock);
23310762Ssam 		printf("1st level boot = %s\n", standalonecode);
23410762Ssam 	}
23510762Ssam 	fd = open(bootblock, 0);
23610762Ssam 	if (fd < 0) {
23710762Ssam 		fprintf(stderr, "makefs: "); perror(bootblock);
23810762Ssam 		exit(1);
23910762Ssam 	}
24010762Ssam 	if (read(fd, bootimage, DEV_BSIZE) < 0) {
24110762Ssam 		fprintf(stderr, "makefs: "); perror(bootblock);
24210762Ssam 		exit(2);
24310762Ssam 	}
24410762Ssam 	close(fd);
24510762Ssam 	fd = open(standalonecode, 0);
24610762Ssam 	if (fd < 0) {
24710762Ssam 		fprintf(stderr, "makefs: "); perror(standalonecode);
24810762Ssam 		exit(1);
24910762Ssam 	}
25010762Ssam 	if (read(fd, &bootimage[DEV_BSIZE], BBSIZE - DEV_BSIZE) < 0) {
25110762Ssam 		fprintf(stderr, "makefs: "); perror(standalonecode);
25210762Ssam 		exit(2);
25310762Ssam 	}
25410762Ssam 	close(fd);
25510763Ssam 	fd = open(dev, 1);
25610762Ssam 	if (fd < 0) {
25710763Ssam 		fprintf(stderr, "makefs: "); perror(dev);
25810762Ssam 		exit(1);
25910762Ssam 	}
26010762Ssam 	if (write(fd, bootimage, BBSIZE) != BBSIZE) {
26110763Ssam 		fprintf(stderr, "makefs: "); perror(dev);
26210762Ssam 		exit(2);
26310762Ssam 	}
26410762Ssam 	close(fd);
26510762Ssam }
26610762Ssam 
26710762Ssam /*VARARGS*/
26810762Ssam fatal(fmt, arg1, arg2)
26910762Ssam 	char *fmt;
27010762Ssam {
27110762Ssam 
27210762Ssam 	fprintf(stderr, "makefs: ");
27310762Ssam 	fprintf(stderr, fmt, arg1, arg2);
27410762Ssam 	putc('\n', stderr);
27510762Ssam 	exit(10);
27610762Ssam }
277