|
|
1.1 root 1: /*
2: * Copyright (c) 1981, 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1981, 1983 The Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)badsect.c 5.9 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: /*
31: * badsect
32: *
33: * Badsect takes a list of file-system relative sector numbers
34: * and makes files containing the blocks of which these sectors are a part.
35: * It can be used to contain sectors which have problems if these sectors
36: * are not part of the bad file for the pack (see bad144). For instance,
37: * this program can be used if the driver for the file system in question
38: * does not support bad block forwarding.
39: */
40: #include <sys/param.h>
41: #include <sys/dir.h>
42: #include <sys/stat.h>
43: #include <ufs/fs.h>
44: #include <ufs/dinode.h>
45: #include <stdio.h>
46: #include <paths.h>
47:
48: union {
49: struct fs fs;
50: char fsx[SBSIZE];
51: } ufs;
52: #define sblock ufs.fs
53: union {
54: struct cg cg;
55: char cgx[MAXBSIZE];
56: } ucg;
57: #define acg ucg.cg
58: struct fs *fs;
59: int fso, fsi;
60: int errs;
61: long dev_bsize = 1;
62:
63: char buf[MAXBSIZE];
64:
65:
66: main(argc, argv)
67: int argc;
68: char *argv[];
69: {
70: daddr_t number;
71: struct stat stbuf, devstat;
72: register struct direct *dp;
73: DIR *dirp;
74: int fd;
75: char name[BUFSIZ];
76:
77: if (argc < 3) {
78: fprintf(stderr, "usage: badsect bbdir blkno [ blkno ]\n");
79: exit(1);
80: }
81: if (chdir(argv[1]) < 0 || stat(".", &stbuf) < 0) {
82: perror(argv[1]);
83: exit(2);
84: }
85: strcpy(name, _PATH_DEV);
86: if ((dirp = opendir(name)) == NULL) {
87: perror(name);
88: exit(3);
89: }
90: while ((dp = readdir(dirp)) != NULL) {
91: strcpy(&name[5], dp->d_name);
92: if (stat(name, &devstat) < 0) {
93: perror(name);
94: exit(4);
95: }
96: if (stbuf.st_dev == devstat.st_rdev &&
97: (devstat.st_mode & IFMT) == IFBLK)
98: break;
99: }
100: closedir(dirp);
101: if (dp == NULL) {
102: printf("Cannot find dev 0%o corresponding to %s\n",
103: stbuf.st_rdev, argv[1]);
104: exit(5);
105: }
106: if ((fsi = open(name, 0)) < 0) {
107: perror(name);
108: exit(6);
109: }
110: fs = &sblock;
111: rdfs(SBOFF, SBSIZE, (char *)fs);
112: dev_bsize = fs->fs_fsize / fsbtodb(fs, 1);
113: for (argc -= 2, argv += 2; argc > 0; argc--, argv++) {
114: number = atoi(*argv);
115: if (chkuse(number, 1))
116: continue;
117: if (mknod(*argv, IFMT|0600, dbtofsb(fs, number)) < 0) {
118: perror(*argv);
119: errs++;
120: }
121: }
122: printf("Don't forget to run ``fsck %s''\n", name);
123: exit(errs);
124: }
125:
126: chkuse(blkno, cnt)
127: daddr_t blkno;
128: int cnt;
129: {
130: int cg;
131: daddr_t fsbn, bn;
132:
133: fsbn = dbtofsb(fs, blkno);
134: if ((unsigned)(fsbn+cnt) > fs->fs_size) {
135: printf("block %d out of range of file system\n", blkno);
136: return (1);
137: }
138: cg = dtog(fs, fsbn);
139: if (fsbn < cgdmin(fs, cg)) {
140: if (cg == 0 || (fsbn+cnt) > cgsblock(fs, cg)) {
141: printf("block %d in non-data area: cannot attach\n",
142: blkno);
143: return (1);
144: }
145: } else {
146: if ((fsbn+cnt) > cgbase(fs, cg+1)) {
147: printf("block %d in non-data area: cannot attach\n",
148: blkno);
149: return (1);
150: }
151: }
152: rdfs(fsbtodb(fs, cgtod(fs, cg)), (int)sblock.fs_cgsize,
153: (char *)&acg);
154: if (!cg_chkmagic(&acg)) {
155: fprintf(stderr, "cg %d: bad magic number\n", cg);
156: errs++;
157: return (1);
158: }
159: bn = dtogd(fs, fsbn);
160: if (isclr(cg_blksfree(&acg), bn))
161: printf("Warning: sector %d is in use\n", blkno);
162: return (0);
163: }
164:
165: /*
166: * read a block from the file system
167: */
168: rdfs(bno, size, bf)
169: int bno, size;
170: char *bf;
171: {
172: int n;
173:
174: if (lseek(fsi, bno * dev_bsize, 0) < 0) {
175: printf("seek error: %ld\n", bno);
176: perror("rdfs");
177: exit(1);
178: }
179: n = read(fsi, bf, size);
180: if(n != size) {
181: printf("read error: %ld\n", bno);
182: perror("rdfs");
183: exit(1);
184: }
185: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.