include-afsconfig-before-param-h-20010712
[openafs.git] / src / sys / fixit.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11 This utility is used to increase the ref count on inodes moved to
12 lost+found by the non-AFS fsck. The program needs to be run once 
13 for every volume located on the partition that was fsck'ed.
14 Procedure:
15      cc -o fixit fixit.c
16      cd /vicepx
17      chmod 600 *
18      foreach volid ( cat <list-of-vol-ids> )
19        fixit lost+found $volid
20        echo $volid
21      end
22      umount <dev>
23      /etc/vfsck <dev>       <<<< AFS Version!
24
25 Non-AFS fsck causes inodes to be moved to lost+found, with names like
26 #<inode-no>. The volumes associated with these inodes will still be
27 available, until the #<inode-no> file is removed. This program simply
28 ups the ref count on the #<inode-no> files, so they're not returned
29 to the free list when the files are removed from lost+found
30 */
31
32 #include <afsconfig.h>
33 #include <afs/param.h>
34
35 RCSID("$Header$");
36
37 #include <sys/types.h>
38 #include <sys/file.h>
39 #include <dirent.h>
40 #include <sys/stat.h>
41 #ifdef AFS_HPUX_ENV
42 #include <sys/mknod.h>
43 #endif
44 #include <afs/afs_args.h>
45 #include <afs/afs.h>
46 #include <afs/afssyscalls.h>
47 #include <errno.h>
48
49 #include "AFS_component_version_number.c"
50
51 main(argc, argv) 
52 int argc;
53 char **argv;
54 {
55         DIR *tdir;
56         struct stat ts;
57         afs_int32 dev, code;
58         struct dirent *tde;
59
60         int volid;
61
62         if (geteuid() != 0) {
63             printf("must be run as root; sorry\n");
64             exit(1);
65         }
66         code = stat(argv[1], &ts);
67         if (code) {
68                 printf("can't stat %s\n", argv[1]);
69                 exit(1);
70         }
71         dev = ts.st_dev;
72         tdir = opendir(argv[1]);
73         if (!tdir) {
74                 printf("cant open %s\n", argv[1]);
75                 exit(1);
76         }
77         volid = atoi(argv[2]);
78         for(tde=readdir(tdir); tde; tde=readdir(tdir)) {
79                 if (tde->d_name[0] == '#') {
80                         printf("Inode %d\n", tde->d_ino);
81                         code = IINC(dev, tde->d_ino, volid);
82                         if (code == -1) {
83                                 perror("iinc");
84                                 printf("errno = %d\n", errno);
85 /* Remove this -- we don't want to exit, because we have to look
86 *  at each inode -- an error here means only that the iinc failed for
87 *  the current volume
88 *                               exit(1);
89 */
90                         } else
91                             printf("inode %d restored for volume %d\n", tde->d_ino, volid);
92                 }
93         }
94         exit(0);
95 }