home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sbin / badsect / badsect.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-16  |  5.2 KB  |  200 lines

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