|
|
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.