Ejemplo n.º 1
0
void
quot(char *name, char *mp)
{
	int fd;
	struct fs *fs;

	get_inode(-1, NULL, 0);		/* flush cache */
	inituser();
	initfsizes();
	if ((fd = open(name,0)) < 0) {
		warn("%s", name);
		close(fd);
		return;
	}
	switch (sbget(fd, &fs, -1)) {
	case 0:
		break;
	case ENOENT:
		warn("Cannot find file system superblock");
		close(fd);
		return;
	default:
		warn("Unable to read file system superblock");
		close(fd);
		return;
	}
	printf("%s:",name);
	if (mp)
		printf(" (%s)",mp);
	putchar('\n');
	(*func)(fd, fs, name);
	close(fd);
}
Ejemplo n.º 2
0
int
fstyp_ufs(FILE *fp, char *label, size_t labelsize)
{
	struct fs *fs;

	switch (sbget(fileno(fp), &fs, STDSB)) {
	case 0:
		strlcpy(label, fs->fs_volname, labelsize);
		return (0);
	case ENOENT:
		/* Cannot find file system superblock */
		return (1);
	default:
		/* Unable to read file system superblock */
		return (1);
	}
}
Ejemplo n.º 3
0
/*
 * Read in the super block and its summary info.
 */
int
readsb(int listerr)
{
	off_t super;
	int bad, ret;
	struct fs *fs;

	super = bflag ? bflag * dev_bsize : -1;
	readcnt[sblk.b_type]++;
	if ((ret = sbget(fsreadfd, &fs, super)) != 0) {
		switch (ret) {
		case EINVAL:
			fprintf(stderr, "The previous newfs operation "
			    "on this volume did not complete.\nYou must "
			    "complete newfs before using this volume.\n");
			exit(11);
		case ENOENT:
			if (bflag)
				fprintf(stderr, "%jd is not a file system "
				    "superblock\n", super / dev_bsize);
			else
				fprintf(stderr, "Cannot find file system "
				    "superblock\n");
			return (0);
		case EIO:
		default:
			fprintf(stderr, "I/O error reading %jd\n",
			    super / dev_bsize);
			return (0);
		}
	}
	memcpy(&sblock, fs, fs->fs_sbsize);
	free(fs);
	/*
	 * Compute block size that the file system is based on,
	 * according to fsbtodb, and adjust superblock block number
	 * so we can tell if this is an alternate later.
	 */
	dev_bsize = sblock.fs_fsize / fsbtodb(&sblock, 1);
	sblk.b_bno = sblock.fs_sblockactualloc / dev_bsize;
	sblk.b_size = SBLOCKSIZE;
	/*
	 * Compare all fields that should not differ in alternate super block.
	 * When an alternate super-block is specified this check is skipped.
	 */
	if (bflag)
		goto out;
	getblk(&asblk, cgsblock(&sblock, sblock.fs_ncg - 1), sblock.fs_sbsize);
	if (asblk.b_errs)
		return (0);
	bad = 0;
#define CHK(x, y)				\
	if (altsblock.x != sblock.x) {		\
		bad++;				\
		if (listerr && debug)		\
			printf("SUPER BLOCK VS ALTERNATE MISMATCH %s: " y " vs " y "\n", \
			    #x, (intmax_t)sblock.x, (intmax_t)altsblock.x); \
	}
	CHK(fs_sblkno, "%jd");
	CHK(fs_cblkno, "%jd");
	CHK(fs_iblkno, "%jd");
	CHK(fs_dblkno, "%jd");
	CHK(fs_ncg, "%jd");
	CHK(fs_bsize, "%jd");
	CHK(fs_fsize, "%jd");
	CHK(fs_frag, "%jd");
	CHK(fs_bmask, "%#jx");
	CHK(fs_fmask, "%#jx");
	CHK(fs_bshift, "%jd");
	CHK(fs_fshift, "%jd");
	CHK(fs_fragshift, "%jd");
	CHK(fs_fsbtodb, "%jd");
	CHK(fs_sbsize, "%jd");
	CHK(fs_nindir, "%jd");
	CHK(fs_inopb, "%jd");
	CHK(fs_cssize, "%jd");
	CHK(fs_ipg, "%jd");
	CHK(fs_fpg, "%jd");
	CHK(fs_magic, "%#jx");
#undef CHK
	if (bad) {
		if (listerr == 0)
			return (0);
		if (preen)
			printf("%s: ", cdevname);
		printf(
		    "VALUES IN SUPER BLOCK LSB=%jd DISAGREE WITH THOSE IN\n"
		    "LAST ALTERNATE LSB=%jd\n",
		    sblk.b_bno, asblk.b_bno);
		if (reply("IGNORE ALTERNATE SUPER BLOCK") == 0)
			return (0);
	}
out:
	/*
	 * If not yet done, update UFS1 superblock with new wider fields.
	 */
	if (sblock.fs_magic == FS_UFS1_MAGIC &&
	    sblock.fs_maxbsize != sblock.fs_bsize) {
		sblock.fs_maxbsize = sblock.fs_bsize;
		sblock.fs_time = sblock.fs_old_time;
		sblock.fs_size = sblock.fs_old_size;
		sblock.fs_dsize = sblock.fs_old_dsize;
		sblock.fs_csaddr = sblock.fs_old_csaddr;
		sblock.fs_cstotal.cs_ndir = sblock.fs_old_cstotal.cs_ndir;
		sblock.fs_cstotal.cs_nbfree = sblock.fs_old_cstotal.cs_nbfree;
		sblock.fs_cstotal.cs_nifree = sblock.fs_old_cstotal.cs_nifree;
		sblock.fs_cstotal.cs_nffree = sblock.fs_old_cstotal.cs_nffree;
	}
	havesb = 1;
	return (1);
}