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

📄 bad144.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1993, 198019861988 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1993, 198019861988\n\	The Regents of the University of California.  All rights reserved.\n";#endif not lint#ifndef lintstatic char sccsid[] = "@(#)bad144.c	8.1 (Berkeley) 6/6/93";#endif not lint/* * bad144 * * This program prints and/or initializes a bad block record for a pack, * in the format used by the DEC standard 144. * It can also add bad sector(s) to the record, moving the sector * replacements as necessary. * * It is preferable to write the bad information with a standard formatter, * but this program will do. *  * RP06 sectors are marked as bad by inverting the format bit in the * header; on other drives the valid-sector bit is cleared. */#include <sys/param.h>#include <sys/dkbad.h>#include <sys/ioctl.h>#include <sys/file.h>#include <sys/disklabel.h>#include <ufs/ffs/fs.h>#include <stdio.h>#include <paths.h>#define RETRIES	10		/* number of retries on reading old sectors */#define	RAWPART	"c"		/* disk partition containing badsector tables */int	fflag, add, copy, verbose, nflag;int	compare();int	dups;int	badfile = -1;		/* copy of badsector table to use, -1 if any */#define MAXSECSIZE	1024struct	dkbad curbad, oldbad;#define	DKBAD_MAGIC	0char	label[BBSIZE];daddr_t	size, getold(), badsn();struct	disklabel *dp;char	name[BUFSIZ];char	*malloc();off_t	lseek();main(argc, argv)	int argc;	char *argv[];{	register struct bt_bad *bt;	daddr_t	sn, bn[126];	int i, f, nbad, new, bad, errs;	argc--, argv++;	while (argc > 0 && **argv == '-') {		(*argv)++;		while (**argv) {			switch (**argv) {#if vax			    case 'f':				fflag++;				break;#endif			    case 'a':				add++;				break;			    case 'c':				copy++;				break;			    case 'v':				verbose++;				break;			    case 'n':				nflag++;				verbose++;				break;			    default:				if (**argv >= '0' && **argv <= '4') {					badfile = **argv - '0';					break;				}				goto usage;			}			(*argv)++;		}		argc--, argv++;	}	if (argc < 1) {usage:		fprintf(stderr,		  "usage: bad144 [ -f ] disk [ snum [ bn ... ] ]\n");		fprintf(stderr,	      "to read or overwrite bad-sector table, e.g.: bad144 hp0\n");		fprintf(stderr,		  "or bad144 -a [ -f ] [ -c ] disk  bn ...\n");		fprintf(stderr, "where options are:\n");		fprintf(stderr, "\t-a  add new bad sectors to the table\n");		fprintf(stderr, "\t-f  reformat listed sectors as bad\n");		fprintf(stderr, "\t-c  copy original sector to replacement\n");		exit(1);	}	if (argv[0][0] != '/')		(void)sprintf(name, "%s/r%s%s", _PATH_DEV, argv[0], RAWPART);	else		strcpy(name, argv[0]);	f = open(name, argc == 1? O_RDONLY : O_RDWR);	if (f < 0)		Perror(name);	if (read(f, label, sizeof(label)) < 0) 		Perror("read");	for (dp = (struct disklabel *)(label + LABELOFFSET);	    dp < (struct disklabel *)		(label + sizeof(label) - sizeof(struct disklabel));	    dp = (struct disklabel *)((char *)dp + 64))		if (dp->d_magic == DISKMAGIC && dp->d_magic2 == DISKMAGIC)			break;	if (dp->d_magic != DISKMAGIC || dp->d_magic2 != DISKMAGIC) {		fprintf(stderr, "Bad pack magic number (pack is unlabeled)\n");		exit(1);	}	if (dp->d_secsize > MAXSECSIZE || dp->d_secsize <= 0) {		fprintf(stderr, "Disk sector size too large/small (%d)\n",			dp->d_secsize);		exit(7);	}	size = dp->d_nsectors * dp->d_ntracks * dp->d_ncylinders; 	argc--;	argv++;	if (argc == 0) {		sn = getold(f, &oldbad);		printf("bad block information at sector %d in %s:\n",		    sn, name);		printf("cartridge serial number: %d(10)\n", oldbad.bt_csn);		switch (oldbad.bt_flag) {		case (u_short)-1:			printf("alignment cartridge\n");			break;		case DKBAD_MAGIC:			break;		default:			printf("bt_flag=%x(16)?\n", oldbad.bt_flag);			break;		}		bt = oldbad.bt_bad;		for (i = 0; i < 126; i++) {			bad = (bt->bt_cyl<<16) + bt->bt_trksec;			if (bad < 0)				break;			printf("sn=%d, cn=%d, tn=%d, sn=%d\n", badsn(bt),			    bt->bt_cyl, bt->bt_trksec>>8, bt->bt_trksec&0xff);			bt++;		}		(void) checkold(&oldbad);		exit(0);	}	if (add) {		/*		 * Read in the old badsector table.		 * Verify that it makes sense, and the bad sectors		 * are in order.  Copy the old table to the new one.		 */		(void) getold(f, &oldbad);		i = checkold(&oldbad);		if (verbose)			printf("Had %d bad sectors, adding %d\n", i, argc);		if (i + argc > 126) {			printf("bad144: not enough room for %d more sectors\n",				argc);			printf("limited to 126 by information format\n");			exit(1);		}		curbad = oldbad;	} else {		curbad.bt_csn = atoi(*argv++);		argc--;		curbad.bt_mbz = 0;		curbad.bt_flag = DKBAD_MAGIC;		if (argc > 126) {			printf("bad144: too many bad sectors specified\n");			printf("limited to 126 by information format\n");			exit(1);		}		i = 0;	}	errs = 0;	new = argc;	while (argc > 0) {		daddr_t sn = atoi(*argv++);		argc--;		if (sn < 0 || sn >= size) {			printf("%d: out of range [0,%d) for disk %s\n",			    sn, size, dp->d_typename);			errs++;			continue;		}		bn[i] = sn;		curbad.bt_bad[i].bt_cyl = sn / (dp->d_nsectors*dp->d_ntracks);		sn %= (dp->d_nsectors*dp->d_ntracks);		curbad.bt_bad[i].bt_trksec =		    ((sn/dp->d_nsectors) << 8) + (sn%dp->d_nsectors);		i++;	}	if (errs)		exit(1);	nbad = i;	while (i < 126) {		curbad.bt_bad[i].bt_trksec = -1;		curbad.bt_bad[i].bt_cyl = -1;		i++;	}	if (add) {		/*		 * Sort the new bad sectors into the list.		 * Then shuffle the replacement sectors so that		 * the previous bad sectors get the same replacement data.		 */		qsort((char *)curbad.bt_bad, nbad, sizeof (struct bt_bad),		    compare);		if (dups) {			fprintf(stderr,"bad144: bad sectors have been duplicated; can't add existing sectors\n");			exit(3);		}		shift(f, nbad, nbad-new);	}	if (badfile == -1)		i = 0;	else		i = badfile * 2;	for (; i < 10 && i < dp->d_nsectors; i += 2) {		if (lseek(f, dp->d_secsize * (size - dp->d_nsectors + i),		    L_SET) < 0)			Perror("lseek");		if (verbose)			printf("write badsect file at %d\n",				size - dp->d_nsectors + i);		if (nflag == 0 && write(f, (caddr_t)&curbad, sizeof(curbad)) !=		    sizeof(curbad)) {			char msg[80];			(void)sprintf(msg, "bad144: write bad sector file %d",			    i/2);			perror(msg);		}		if (badfile != -1)			break;	}#ifdef vax	if (nflag == 0 && fflag)		for (i = nbad - new; i < nbad; i++)			format(f, bn[i]);#endif#ifdef DIOCSBAD	if (nflag == 0 && ioctl(f, DIOCSBAD, (caddr_t)&curbad) < 0)		fprintf(stderr,	"Can't sync bad-sector file; reboot for changes to take effect\n");#endif	exit(0);}daddr_tgetold(f, bad)struct dkbad *bad;{	register int i;	daddr_t sn;	char msg[80];	if (badfile == -1)		i = 0;	else		i = badfile * 2;	for (; i < 10 && i < dp->d_nsectors; i += 2) {		sn = size - dp->d_nsectors + i;		if (lseek(f, sn * dp->d_secsize, L_SET) < 0)			Perror("lseek");		if (read(f, (char *) bad, dp->d_secsize) == dp->d_secsize) {			if (i > 0)				printf("Using bad-sector file %d\n", i/2);			return(sn);		}		(void)sprintf(msg, "bad144: read bad sector file at sn %d", sn);		perror(msg);		if (badfile != -1)			break;	}	fprintf(stderr, "bad144: %s: can't read bad block info\n", name);	exit(1);	/*NOTREACHED*/}

⌨️ 快捷键说明

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