09dc7b49aece8a390d7b124f65832b80a1ad0f2b
* Copyright (c) 1981, 1983 The Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"@(#) Copyright (c) 1981, 1983 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)badsect.c 5.5 (Berkeley) %G%";
* Badsect takes a list of file-system relative sector numbers
* and makes files containing the blocks of which these sectors are a part.
* It can be used to contain sectors which have problems if these sectors
* are not part of the bad file for the pack (see bad144). For instance,
* this program can be used if the driver for the file system in question
* does not support bad block forwarding.
struct stat stbuf
, devstat
;
register struct direct
*dp
;
fprintf(stderr
, "usage: badsect bbdir blkno [ blkno ]\n");
if (chdir(argv
[1]) < 0 || stat(".", &stbuf
) < 0) {
if ((dirp
= opendir(name
)) == NULL
) {
while ((dp
= readdir(dirp
)) != NULL
) {
strcpy(&name
[5], dp
->d_name
);
if (stat(name
, &devstat
) < 0) {
if (stbuf
.st_dev
== devstat
.st_rdev
&&
(devstat
.st_mode
& IFMT
) == IFBLK
)
printf("Cannot find dev 0%o corresponding to %s\n",
if ((fsi
= open(name
, 0)) < 0) {
rdfs(SBOFF
, SBSIZE
, (char *)fs
);
dev_bsize
= fs
->fs_fsize
/ fsbtodb(fs
, 1);
for (argc
-= 2, argv
+= 2; argc
> 0; argc
--, argv
++) {
if (mknod(*argv
, IFMT
|0600, dbtofsb(fs
, number
)) < 0) {
printf("Don't forget to run ``fsck %s''\n", name
);
fsbn
= dbtofsb(fs
, blkno
);
if ((unsigned)(fsbn
+cnt
) > fs
->fs_size
) {
printf("block %d out of range of file system\n", blkno
);
if (fsbn
< cgdmin(fs
, cg
)) {
if (cg
== 0 || (fsbn
+cnt
) > cgsblock(fs
, cg
)) {
printf("block %d in non-data area: cannot attach\n",
if ((fsbn
+cnt
) > cgbase(fs
, cg
+1)) {
printf("block %d in non-data area: cannot attach\n",
rdfs(fsbtodb(fs
, cgtod(fs
, cg
)), (int)sblock
.fs_cgsize
,
if (!cg_chkmagic(&acg
)) {
fprintf(stderr
, "cg %d: bad magic number\n", cg
);
if (isclr(cg_blksfree(&acg
), bn
))
printf("Warning: sector %d is in use\n", blkno
);
* read a block from the file system
if (lseek(fsi
, bno
* dev_bsize
, 0) < 0) {
printf("seek error: %ld\n", bno
);
printf("read error: %ld\n", bno
);