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

📄 bad144.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
checkold(){	register int i;	register struct bt_bad *bt;	daddr_t sn, lsn;	int errors = 0, warned = 0;	if (oldbad.bt_flag != DKBAD_MAGIC) {		fprintf(stderr, "bad144: %s: bad flag in bad-sector table\n",			name);		errors++;	}	if (oldbad.bt_mbz != 0) {		fprintf(stderr, "bad144: %s: bad magic number\n", name);		errors++;	}	bt = oldbad.bt_bad;	for (i = 0; i < 126; i++, bt++) {		if (bt->bt_cyl == 0xffff && bt->bt_trksec == 0xffff)			break;		if ((bt->bt_cyl >= dp->d_ncylinders) ||		    ((bt->bt_trksec >> 8) >= dp->d_ntracks) ||		    ((bt->bt_trksec & 0xff) >= dp->d_nsectors)) {			fprintf(stderr,		     "bad144: cyl/trk/sect out of range in existing entry: ");			fprintf(stderr, "sn=%d, cn=%d, tn=%d, sn=%d\n",				badsn(bt), bt->bt_cyl, bt->bt_trksec>>8,				bt->bt_trksec & 0xff);			errors++;		}		sn = (bt->bt_cyl * dp->d_ntracks +		    (bt->bt_trksec >> 8)) *		    dp->d_nsectors + (bt->bt_trksec & 0xff);		if (i > 0 && sn < lsn && !warned) {		    fprintf(stderr,			"bad144: bad sector file is out of order\n");		    errors++;		    warned++;		}		if (i > 0 && sn == lsn) {		    fprintf(stderr,			"bad144: bad sector file contains duplicates (sn %d)\n",			sn);		    errors++;		}		lsn = sn;	}	if (errors)		exit(1);	return (i);}/* * Move the bad sector replacements * to make room for the new bad sectors. * new is the new number of bad sectors, old is the previous count. */shift(f, new, old){	daddr_t repl;	/*	 * First replacement is last sector of second-to-last track.	 */	repl = size - dp->d_nsectors - 1;	new--; old--;	while (new >= 0 && new != old) {		if (old < 0 ||		    compare(&curbad.bt_bad[new], &oldbad.bt_bad[old]) > 0) {			/*			 * Insert new replacement here-- copy original			 * sector if requested and possible,			 * otherwise write a zero block.			 */			if (!copy ||			    !blkcopy(f, badsn(&curbad.bt_bad[new]), repl - new))				blkzero(f, repl - new);		} else {			if (blkcopy(f, repl - old, repl - new) == 0)			    fprintf(stderr,				"Can't copy replacement sector %d to %d\n",				repl-old, repl-new);			old--;		}		new--;	}}char *buf;/* *  Copy disk sector s1 to s2. */blkcopy(f, s1, s2)daddr_t s1, s2;{	register tries, n;	if (buf == (char *)NULL) {		buf = malloc((unsigned)dp->d_secsize);		if (buf == (char *)NULL) {			fprintf(stderr, "Out of memory\n");			exit(20);		}	}	for (tries = 0; tries < RETRIES; tries++) {		if (lseek(f, dp->d_secsize * s1, L_SET) < 0)			Perror("lseek");		if ((n = read(f, buf, dp->d_secsize)) == dp->d_secsize)			break;	}	if (n != dp->d_secsize) {		fprintf(stderr, "bad144: can't read sector, %d: ", s1);		if (n < 0)			perror((char *)0);		return(0);	}	if (lseek(f, dp->d_secsize * s2, L_SET) < 0)		Perror("lseek");	if (verbose)		printf("copying %d to %d\n", s1, s2);	if (nflag == 0 && write(f, buf, dp->d_secsize) != dp->d_secsize) {		fprintf(stderr,		    "bad144: can't write replacement sector, %d: ", s2);		perror((char *)0);		return(0);	}	return(1);}char *zbuf;blkzero(f, sn)daddr_t sn;{	if (zbuf == (char *)NULL) {		zbuf = malloc((unsigned)dp->d_secsize);		if (zbuf == (char *)NULL) {			fprintf(stderr, "Out of memory\n");			exit(20);		}	}	if (lseek(f, dp->d_secsize * sn, L_SET) < 0)		Perror("lseek");	if (verbose)		printf("zeroing %d\n", sn);	if (nflag == 0 && write(f, zbuf, dp->d_secsize) != dp->d_secsize) {		fprintf(stderr,		    "bad144: can't write replacement sector, %d: ", sn);		perror((char *)0);	}}compare(b1, b2)register struct bt_bad *b1, *b2;{	if (b1->bt_cyl > b2->bt_cyl)		return(1);	if (b1->bt_cyl < b2->bt_cyl)		return(-1);	if (b1->bt_trksec == b2->bt_trksec)		dups++;	return (b1->bt_trksec - b2->bt_trksec);}daddr_tbadsn(bt)register struct bt_bad *bt;{	return ((bt->bt_cyl*dp->d_ntracks + (bt->bt_trksec>>8)) * dp->d_nsectors		+ (bt->bt_trksec&0xff));}#ifdef vaxstruct rp06hdr {	short	h_cyl;	short	h_trksec;	short	h_key1;	short	h_key2;	char	h_data[512];#define	RP06_FMT	010000		/* 1 == 16 bit, 0 == 18 bit */};/* * Most massbus and unibus drives * have headers of this form */struct hpuphdr {	u_short	hpup_cyl;	u_char	hpup_sect;	u_char	hpup_track;	char	hpup_data[512];#define	HPUP_OKSECT	0xc000		/* this normally means sector is good */#define	HPUP_16BIT	0x1000		/* 1 == 16 bit format */};int rp06format(), hpupformat();struct	formats {	char	*f_name;		/* disk name */	int	f_bufsize;		/* size of sector + header */	int	f_bic;			/* value to bic in hpup_cyl */	int	(*f_routine)();		/* routine for special handling */} formats[] = {	{ "rp06",	sizeof (struct rp06hdr), RP06_FMT,	rp06format },	{ "eagle",	sizeof (struct hpuphdr), HPUP_OKSECT,	hpupformat },	{ "capricorn",	sizeof (struct hpuphdr), HPUP_OKSECT,	hpupformat },	{ "rm03",	sizeof (struct hpuphdr), HPUP_OKSECT,	hpupformat },	{ "rm05",	sizeof (struct hpuphdr), HPUP_OKSECT,	hpupformat },	{ "9300",	sizeof (struct hpuphdr), HPUP_OKSECT,	hpupformat },	{ "9766",	sizeof (struct hpuphdr), HPUP_OKSECT,	hpupformat },	{ 0, 0, 0, 0 }};/*ARGSUSED*/hpupformat(fp, dp, blk, buf, count)	struct formats *fp;	struct disklabel *dp;	daddr_t blk;	char *buf;	int count;{	struct hpuphdr *hdr = (struct hpuphdr *)buf;	int sect;	if (count < sizeof(struct hpuphdr)) {		hdr->hpup_cyl = (HPUP_OKSECT | HPUP_16BIT) |			(blk / (dp->d_nsectors * dp->d_ntracks));		sect = blk % (dp->d_nsectors * dp->d_ntracks);		hdr->hpup_track = (u_char)(sect / dp->d_nsectors);		hdr->hpup_sect = (u_char)(sect % dp->d_nsectors);	}	return (0);}/*ARGSUSED*/rp06format(fp, dp, blk, buf, count)	struct formats *fp;	struct disklabel *dp;	daddr_t blk;	char *buf;	int count;{	if (count < sizeof(struct rp06hdr)) {		fprintf(stderr, "Can't read header on blk %d, can't reformat\n",			blk);		return (-1);	}	return (0);}format(fd, blk)	int fd;	daddr_t blk;{	register struct formats *fp;	static char *buf;	static char bufsize;	struct format_op fop;	int n;	for (fp = formats; fp->f_name; fp++)		if (strcmp(dp->d_typename, fp->f_name) == 0)			break;	if (fp->f_name == 0) {		fprintf(stderr, "bad144: don't know how to format %s disks\n",			dp->d_typename);		exit(2);	}	if (buf && bufsize < fp->f_bufsize) {		free(buf);		buf = NULL;	}	if (buf == NULL)		buf = malloc((unsigned)fp->f_bufsize);	if (buf == NULL) {		fprintf(stderr, "bad144: can't allocate sector buffer\n");		exit(3);	}	bufsize = fp->f_bufsize;	/*	 * Here we do the actual formatting.  All we really	 * do is rewrite the sector header and flag the bad sector	 * according to the format table description.  If a special	 * purpose format routine is specified, we allow it to	 * process the sector as well.	 */	if (verbose)		printf("format blk %d\n", blk);	bzero((char *)&fop, sizeof(fop));	fop.df_buf = buf;	fop.df_count = fp->f_bufsize;	fop.df_startblk = blk;	bzero(buf, fp->f_bufsize);	if (ioctl(fd, DIOCRFORMAT, &fop) < 0)		perror("bad144: read format");	if (fp->f_routine &&	    (*fp->f_routine)(fp, dp, blk, buf, fop.df_count) != 0)		return;	if (fp->f_bic) {		struct hpuphdr *xp = (struct hpuphdr *)buf;		xp->hpup_cyl &= ~fp->f_bic;	}	if (nflag)		return;	bzero((char *)&fop, sizeof(fop));	fop.df_buf = buf;	fop.df_count = fp->f_bufsize;	fop.df_startblk = blk;	if (ioctl(fd, DIOCWFORMAT, &fop) < 0)		Perror("write format");	if (fop.df_count != fp->f_bufsize) {		char msg[80];		(void)sprintf(msg, "bad144: write format %d", blk);		perror(msg);	}}#endifPerror(op)	char *op;{	fprintf(stderr, "bad144: "); perror(op);	exit(4);}

⌨️ 快捷键说明

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