opt = FS_OPTSPACE;
reqopt = opt = FS_OPTSPACE;
main(argc, argv)	int argc;	char *argv[];{	register int ch;	register struct partition *pp;	register struct disklabel *lp;	struct disklabel mfsfakelabel;	struct disklabel *getdisklabel();	struct partition oldpartition;	struct stat st;	struct statfs *mp;	int fsi, fso, len, n, maxpartitions;	char *cp, *s1, *s2, *special, *opstring, buf[BUFSIZ];	char *fstype = NULL;	char **saveargv = argv;	int ffs = 1;	if (strstr(__progname, "mfs"))		mfs = Nflag = 1;	maxpartitions = getmaxpartitions();	if (maxpartitions > 26)		fatal("insane maxpartitions value %d", maxpartitions);	opstring = mfs ?	    "NT:a:b:c:d:e:f:i:m:o:s:" :	    "NOS:T:a:b:c:d:e:f:i:k:l:m:n:o:p:r:s:t:u:x:z:";	while ((ch = getopt(argc, argv, opstring)) != -1) {		switch (ch) {		case 'N':			Nflag = 1;			break;		case 'O':			Oflag = 1;			break;		case 'S':			if ((sectorsize = atoi(optarg)) <= 0)				fatal("%s: bad sector size", optarg);			break;#ifdef COMPAT		case 'T':			disktype = optarg;			break;#endif		case 'a':			if ((maxcontig = atoi(optarg)) <= 0)				fatal("%s: bad maximum contiguous blocks\n",				    optarg);			break;		case 'b':			if ((bsize = atoi(optarg)) < MINBSIZE)				fatal("%s: bad block size", optarg);			break;		case 'c':			if ((cpg = atoi(optarg)) <= 0)				fatal("%s: bad cylinders/group", optarg);			cpgflg++;			break;		case 'd':			if ((rotdelay = atoi(optarg)) < 0)				fatal("%s: bad rotational delay\n", optarg);			break;		case 'e':			if ((maxbpg = atoi(optarg)) <= 0)		fatal("%s: bad blocks per file in a cylinder group\n",				    optarg);			break;		case 'f':			if ((fsize = atoi(optarg)) <= 0)				fatal("%s: bad fragment size", optarg);			break;		case 'i':			if ((density = atoi(optarg)) <= 0)				fatal("%s: bad bytes per inode\n", optarg);			break;		case 'k':			if ((trackskew = atoi(optarg)) < 0)				fatal("%s: bad track skew", optarg);			break;		case 'l':			if ((interleave = atoi(optarg)) <= 0)				fatal("%s: bad interleave", optarg);			break;		case 'm':			if ((minfree = atoi(optarg)) < 0 || minfree > 99)				fatal("%s: bad free space %%\n", optarg);			break;		case 'n':			if ((nrpos = atoi(optarg)) <= 0)				fatal("%s: bad rotational layout count\n",				    optarg);			break;		case 'o':			if (mfs)				getmntopts(optarg, mopts, &mntflags);			else {				if (strcmp(optarg, "space") == 0)					opt = FS_OPTSPACE;				else if (strcmp(optarg, "time") == 0)					opt = FS_OPTTIME;				else	fatal("%s: unknown optimization preference: use `space' or `time'.");			}			break;		case 'p':			if ((trackspares = atoi(optarg)) < 0)				fatal("%s: bad spare sectors per track",				    optarg);			break;		case 'r':			if ((rpm = atoi(optarg)) <= 0)				fatal("%s: bad revolutions/minute\n", optarg);			break;		case 's':			if ((fssize = atoi(optarg)) <= 0)				fatal("%s: bad file system size", optarg);			break;		case 'z':							if ((ntracks = atoi(optarg)) <= 0)				fatal("%s: bad total tracks", optarg);		case 't':			fstype = optarg;			if (strcmp(fstype, "ffs"))				ffs = 0;			break;		case 'u':			if ((nsectors = atoi(optarg)) <= 0)				fatal("%s: bad sectors/track", optarg);			break;		case 'x':			if ((cylspares = atoi(optarg)) < 0)				fatal("%s: bad spare sectors per cylinder",				    optarg);			break;		case '?':		default:			usage();		}		if (!ffs)			break;	}	argc -= optind;	argv += optind;	if (ffs && argc != 2 && (mfs || argc != 1))		usage();	special = argv[0];	if (!mfs) {		char execname[MAXPATHLEN], name[MAXPATHLEN];		if (fstype == NULL)			fstype = readlabelfs(special, 0);		if (fstype != NULL && strcmp(fstype, "ffs")) {			snprintf(name, sizeof name, "newfs_%s", fstype);			saveargv[0] = name;			snprintf(execname, sizeof execname, "%s/newfs_%s",			    _PATH_SBIN, fstype);			(void)execv(execname, saveargv);			snprintf(execname, sizeof execname, "%s/newfs_%s",			    _PATH_USRSBIN, fstype);			(void)execv(execname, saveargv);			err(1, "%s not found", name);		}	}	if (mfs && !strcmp(special, "swap")) {		/*		 * it's an MFS, mounted on "swap."  fake up a label.		 * XXX XXX XXX		 */		fso = -1;	/* XXX; normally done below. */		memset(&mfsfakelabel, 0, sizeof(mfsfakelabel));		mfsfakelabel.d_secsize = 512;		mfsfakelabel.d_nsectors = 64;		mfsfakelabel.d_ntracks = 16;		mfsfakelabel.d_ncylinders = 16;		mfsfakelabel.d_secpercyl = 1024;		mfsfakelabel.d_secperunit = 16384;		mfsfakelabel.d_rpm = 3600;		mfsfakelabel.d_interleave = 1;		mfsfakelabel.d_npartitions = 1;		mfsfakelabel.d_partitions[0].p_size = 16384;		mfsfakelabel.d_partitions[0].p_fsize = 1024;		mfsfakelabel.d_partitions[0].p_frag = 8;		mfsfakelabel.d_partitions[0].p_cpg = 16;		lp = &mfsfakelabel;		pp = &mfsfakelabel.d_partitions[0];		goto havelabel;	}	cp = strrchr(special, '/');	if (cp == 0) {		/*		 * No path prefix; try /dev/r%s then /dev/%s.		 */		(void)sprintf(device, "%sr%s", _PATH_DEV, special);		if (stat(device, &st) == -1)			(void)sprintf(device, "%s%s", _PATH_DEV, special);		special = device;	}	if (Nflag) {		fso = -1;	} else {		fso = open(special, O_WRONLY);		if (fso < 0)			fatal("%s: %s", special, strerror(errno));		/* Bail if target special is mounted */		n = getmntinfo(&mp, MNT_NOWAIT);		if (n == 0)			fatal("%s: getmntinfo: %s", special, strerror(errno));		len = sizeof(_PATH_DEV) - 1;		s1 = special;		if (strncmp(_PATH_DEV, s1, len) == 0)			s1 += len;		while (--n >= 0) {			s2 = mp->f_mntfromname;			if (strncmp(_PATH_DEV, s2, len) == 0) {				s2 += len - 1;				*s2 = 'r';			}			if (strcmp(s1, s2) == 0 || strcmp(s1, &s2[1]) == 0)				fatal("%s is mounted on %s",				    special, mp->f_mntonname);			++mp;		}	}	if (mfs && disktype != NULL) {		lp = (struct disklabel *)getdiskbyname(disktype);		if (lp == NULL)			fatal("%s: unknown disk type", disktype);		pp = &lp->d_partitions[1];	} else {		fsi = open(special, O_RDONLY);		if (fsi < 0)			fatal("%s: %s", special, strerror(errno));		if (fstat(fsi, &st) < 0)			fatal("%s: %s", special, strerror(errno));		if (!S_ISCHR(st.st_mode) && !mfs)			printf("%s: %s: not a character-special device\n",			    __progname, special);		cp = strchr(argv[0], '\0') - 1;		if (cp == 0 || (*cp < 'a' || *cp > ('a' + maxpartitions - 1))		    && !isdigit(*cp))			fatal("%s: can't figure out file system partition",			    argv[0]);#ifdef COMPAT		if (!mfs && disktype == NULL)			disktype = argv[1];#endif		lp = getdisklabel(special, fsi);		if (isdigit(*cp))			pp = &lp->d_partitions[0];		else			pp = &lp->d_partitions[*cp - 'a'];		if (pp->p_size == 0)			fatal("%s: `%c' partition is unavailable",			    argv[0], *cp);		if (pp->p_fstype == FS_BOOT)			fatal("%s: `%c' partition overlaps boot program",			      argv[0], *cp);	}havelabel:	if (fssize == 0)		fssize = pp->p_size;	if (fssize > pp->p_size && !mfs)	       fatal("%s: maximum file system size on the `%c' partition is %d",			argv[0], *cp, pp->p_size);	if (rpm == 0) {		rpm = lp->d_rpm;		if (rpm <= 0)			rpm = 3600;	}	if (ntracks == 0) {		ntracks = lp->d_ntracks;		if (ntracks <= 0)			fatal("%s: no default #tracks", argv[0]);	}	if (nsectors == 0) {		nsectors = lp->d_nsectors;		if (nsectors <= 0)			fatal("%s: no default #sectors/track", argv[0]);	}	if (sectorsize == 0) {		sectorsize = lp->d_secsize;		if (sectorsize <= 0)			fatal("%s: no default sector size", argv[0]);	}	if (trackskew == -1) {		trackskew = lp->d_trackskew;		if (trackskew < 0)			trackskew = 0;	}	if (interleave == 0) {		interleave = lp->d_interleave;		if (interleave <= 0)			interleave = 1;	}	if (fsize == 0) {		fsize = pp->p_fsize;		if (fsize <= 0)			fsize = MAX(DFL_FRAGSIZE, lp->d_secsize);	}	if (bsize == 0) {		bsize = pp->p_frag * pp->p_fsize;		if (bsize <= 0)			bsize = MIN(DFL_BLKSIZE, 8 * fsize);	}	/*	 * Maxcontig sets the default for the maximum number of blocks	 * that may be allocated sequentially. With filesystem clustering	 * it is possible to allocate contiguous blocks up to the maximum	 * transfer size permitted by the controller or buffering.	 */	if (maxcontig == 0)		maxcontig = MAX(1, MIN(MAXPHYS, MAXBSIZE) / bsize - 1);	if (density == 0)		density = NFPI * fsize;	if (minfree < MINFREE && opt != FS_OPTSPACE) {		fprintf(stderr, "Warning: changing optimization to space ");		fprintf(stderr, "because minfree is less than %d%%\n", MINFREE);		opt = FS_OPTSPACE;	}	if (trackspares == -1) {		trackspares = lp->d_sparespertrack;		if (trackspares < 0)			trackspares = 0;	}	nphyssectors = nsectors + trackspares;	if (cylspares == -1) {		cylspares = lp->d_sparespercyl;		if (cylspares < 0)			cylspares = 0;	}	secpercyl = nsectors * ntracks - cylspares;	if (secpercyl != lp->d_secpercyl)		fprintf(stderr, "%s (%d) %s (%lu)\n",			"Warning: calculated sectors per cylinder", secpercyl,			"disagrees with disk label", lp->d_secpercyl);	if (maxbpg == 0)		maxbpg = MAXBLKPG(bsize);#ifdef notdef /* label may be 0 if faked up by kernel */	bbsize = lp->d_bbsize;	sbsize = lp->d_sbsize;#endif	oldpartition = *pp;	realsectorsize = sectorsize;	if (sectorsize < DEV_BSIZE) {		int secperblk = DEV_BSIZE / sectorsize;		sectorsize = DEV_BSIZE;		nsectors /= secperblk;		nphyssectors /= secperblk;		secpercyl /= secperblk;		fssize /= secperblk;		pp->p_size /= secperblk;	} else if (sectorsize > DEV_BSIZE) {		int blkpersec = sectorsize / DEV_BSIZE;		sectorsize = DEV_BSIZE;		nsectors *= blkpersec;		nphyssectors *= blkpersec;		secpercyl *= blkpersec;		fssize *= blkpersec;		pp->p_size *= blkpersec;	}	mkfs(pp, special, fsi, fso);	if (realsectorsize < DEV_BSIZE)		pp->p_size *= DEV_BSIZE / realsectorsize;	else if (realsectorsize > DEV_BSIZE)		pp->p_size /= realsectorsize / DEV_BSIZE;	if (!Nflag && memcmp(pp, &oldpartition, sizeof(oldpartition)))		rewritelabel(special, fso, lp);	if (!Nflag)		close(fso);	close(fsi);#ifdef MFS	if (mfs) {		struct mfs_args args;		sprintf(buf, "mfs:%d", getpid());		args.fspec = buf;		args.export.ex_root = -2;		if (mntflags & MNT_RDONLY)			args.export.ex_flags = MNT_EXRDONLY;		else			args.export.ex_flags = 0;		args.base = membase;		args.size = fssize * sectorsize;		if (mount(MOUNT_MFS, argv[1], mntflags, &args) < 0)			fatal("%s: %s", argv[1], strerror(errno));	}#endif	exit(0);}