⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newfs.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		/* 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 ((st.st_mode & S_IFMT) != S_IFCHR && !mfs)			printf("%s: %s: not a character-special device\n",			    progname, special);		cp = index(argv[0], '\0') - 1;		if (cp == 0 || (*cp < 'a' || *cp > 'h') && !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);	}	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);	headswitch = lp->d_headswitch;	trackseek = lp->d_trkseek;#ifdef notdef /* label may be 0 if faked up by kernel */	bbsize = lp->d_bbsize;	sbsize = lp->d_sbsize;#endif	oldpartition = *pp;#ifdef tahoe	realsectorsize = sectorsize;	if (sectorsize != DEV_BSIZE) {		/* XXX */		int secperblk = DEV_BSIZE / sectorsize;		sectorsize = DEV_BSIZE;		nsectors /= secperblk;		nphyssectors /= secperblk;		secpercyl /= secperblk;		fssize /= secperblk;		pp->p_size /= secperblk;	}#endif	mkfs(pp, special, fsi, fso);#ifdef tahoe	if (realsectorsize != DEV_BSIZE)		pp->p_size *= DEV_BSIZE / realsectorsize;#endif	if (!Nflag && bcmp(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);}#ifdef COMPATchar lmsg[] = "%s: can't read disk label; disk type must be specified";#elsechar lmsg[] = "%s: can't read disk label";#endifstruct disklabel *getdisklabel(s, fd)	char *s;	int fd;{	static struct disklabel lab;	if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) {#ifdef COMPAT		if (disktype) {			struct disklabel *lp, *getdiskbyname();			unlabeled++;			lp = getdiskbyname(disktype);			if (lp == NULL)				fatal("%s: unknown disk type", disktype);			return (lp);		}#endif		warn("ioctl (GDINFO)");		fatal(lmsg, s);	}	return (&lab);}rewritelabel(s, fd, lp)	char *s;	int fd;	register struct disklabel *lp;{#ifdef COMPAT	if (unlabeled)		return;#endif	lp->d_checksum = 0;	lp->d_checksum = dkcksum(lp);	if (ioctl(fd, DIOCWDINFO, (char *)lp) < 0) {		warn("ioctl (WDINFO)");		fatal("%s: can't rewrite disk label", s);	}#if vax	if (lp->d_type == DTYPE_SMD && lp->d_flags & D_BADSECT) {		register i;		int cfd;		daddr_t alt;		char specname[64];		char blk[1024];		char *cp;		/*		 * Make name for 'c' partition.		 */		strcpy(specname, s);		cp = specname + strlen(specname) - 1;		if (!isdigit(*cp))			*cp = 'c';		cfd = open(specname, O_WRONLY);		if (cfd < 0)			fatal("%s: %s", specname, strerror(errno));		bzero(blk, sizeof(blk));		*(struct disklabel *)(blk + LABELOFFSET) = *lp;		alt = lp->d_ncylinders * lp->d_secpercyl - lp->d_nsectors;		for (i = 1; i < 11 && i < lp->d_nsectors; i += 2) {			if (lseek(cfd, (off_t)(alt + i) * lp->d_secsize,			    L_SET) == -1)				fatal("lseek to badsector area: %s",				    strerror(errno));			if (write(cfd, blk, lp->d_secsize) < lp->d_secsize)				warn("alternate label %d write", i/2);		}		close(cfd);	}#endif}/*VARARGS*/void#if __STDC__fatal(const char *fmt, ...)#elsefatal(fmt, va_alist)	char *fmt;	va_dcl#endif{	va_list ap;#if __STDC__	va_start(ap, fmt);#else	va_start(ap);#endif	if (fcntl(STDERR_FILENO, F_GETFL) < 0) {		openlog(progname, LOG_CONS, LOG_DAEMON);		vsyslog(LOG_ERR, fmt, ap);		closelog();	} else {		vwarnx(fmt, ap);	}	va_end(ap);	exit(1);	/*NOTREACHED*/}usage(){	if (mfs) {		fprintf(stderr,		    "usage: %s [ -fsoptions ] special-device mount-point\n",			progname);	} else		fprintf(stderr,		    "usage: %s [ -fsoptions ] special-device%s\n",		    progname,#ifdef COMPAT		    " [device-type]");#else		    "");#endif	fprintf(stderr, "where fsoptions are:\n");	fprintf(stderr,	    "\t-N do not create file system, just print out parameters\n");	fprintf(stderr, "\t-O create a 4.3BSD format filesystem\n");	fprintf(stderr, "\t-S sector size\n");#ifdef COMPAT	fprintf(stderr, "\t-T disktype\n");#endif	fprintf(stderr, "\t-a maximum contiguous blocks\n");	fprintf(stderr, "\t-b block size\n");	fprintf(stderr, "\t-c cylinders/group\n");	fprintf(stderr, "\t-d rotational delay between contiguous blocks\n");	fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n");	fprintf(stderr, "\t-f frag size\n");	fprintf(stderr, "\t-i number of bytes per inode\n");	fprintf(stderr, "\t-k sector 0 skew, per track\n");	fprintf(stderr, "\t-l hardware sector interleave\n");	fprintf(stderr, "\t-m minimum free space %%\n");	fprintf(stderr, "\t-n number of distinguished rotational positions\n");	fprintf(stderr, "\t-o optimization preference (`space' or `time')\n");	fprintf(stderr, "\t-p spare sectors per track\n");	fprintf(stderr, "\t-s file system size (sectors)\n");	fprintf(stderr, "\t-r revolutions/minute\n");	fprintf(stderr, "\t-t tracks/cylinder\n");	fprintf(stderr, "\t-u sectors/track\n");	fprintf(stderr, "\t-x spare sectors per cylinder\n");	exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -