* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
"@(#) Copyright (c) 1983 Regents of the University of California.\n\
static char sccsid
[] = "@(#)badsect.c 5.2 (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(SBLOCK
, SBSIZE
, (char *)fs
);
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 (acg
.cg_magic
!= CG_MAGIC
) {
fprintf(stderr
, "cg %d: bad magic number\n", cg
);
if (isclr(acg
.cg_free
, 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
);