vol-gi-prototyping-20030513
[openafs.git] / src / vol / gi.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 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID("$Header$");
14
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <stdio.h>
18
19 int statflag;
20
21 #include "AFS_component_version_number.c"
22
23 void Perror(char *err, int a1, int a2, int a3)
24 {
25     char msg[200];
26     sprintf(msg, err, a1, a2, a3);
27     perror(msg);
28 }
29
30 int main(int argc, char **argv)
31 {
32         int error=0;
33         struct stat status;
34         int dev, fd, inode;
35
36 #if defined(AFS_NT40_ENV) || defined(AFS_NAMEI_ENV)
37         fprintf(stderr, "gi not supported on NT or NAMEI systems.\n");
38         exit(1);
39 #else
40
41         argc--; argv++;
42         while (argc && **argv == '-') {
43                 if (strcmp(*argv, "-stat") == 0)
44                         statflag = 1;
45                 else {
46                         error=1;
47                         break;
48                 }
49                 argc--; argv++;
50         }
51         if (error || argc!=2) {
52                 fprintf(stderr, "Usage: gi [-stat] partition inodenumber\n");
53                 exit(1);
54         }
55         if (stat(*argv, &status) != 0) {
56                 fprintf(stderr, "gi: cannot stat %s [should be mounted partition name]\n", *argv);
57                 exit(1);
58         }
59         dev = status.st_dev;
60         inode = atoi(*++argv);
61         fd = iopen(dev, inode, 0);
62         if (fd < 0) {
63                 Perror("Unable to open inode %d", inode, 0, 0);
64                 exit(1);
65         }
66         if (statflag) {
67                 if (fstat(fd, &status) != 0) {
68                         Perror("Unable to fstat the inode!", 0, 0, 0);
69                         exit(1);
70                 }
71                 printf("Inode status: dev=%d, ino=%d, mode=%o, nlink=%d, uid=%d, gid=%d, size=%d, mtime=%d, blocks=%d\n", status.st_dev, status.st_ino, status.st_mode, status.st_nlink, status.st_uid, status.st_gid, status.st_size, status.st_mtime);
72         }
73         else {
74                 /* Send the inode to standard out */
75                 char buf[4096]; int n;
76                 while ((n = read(fd, buf, sizeof(buf))) >0)
77                         write(1, buf, n);
78         }
79         exit(0);
80 #endif /* AFS_NT40_ENV || AFS_NAMEI_ENV */
81 }
82