Standardize License information
[openafs.git] / src / venus / whatfid.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 /* file         whatfid.c */
11
12
13 #include <afs/param.h>
14 #include <stdio.h>
15 #include <errno.h>
16 #ifdef  AFS_AIX32_ENV
17 #include <signal.h>
18 #endif
19 #include <sys/ioctl.h>
20 #include <sys/socket.h>
21 #include <netdb.h>
22 #include <netinet/in.h>
23 #include <afs/stds.h>
24 #include <afs/vice.h>
25 #include <afs/venus.h>
26 #include "afs/prs_fs.h"
27 #include <afs/afsint.h>
28 #include <afs/auth.h>
29 #include <afs/cellconfig.h>
30 #include <afs/cmd.h>
31 #include <strings.h>
32
33
34 struct VenusFid {
35     afs_int32 Cell;
36     struct AFSFid Fid;
37 };
38
39
40 char *pn;
41 void PioctlError();
42
43 #include "AFS_component_version_number.c"
44
45 int WhatFidCmd_FileParm;
46 int WhatFidCmd_FollowLinkParm;
47 int
48 WhatFidCmd(as)
49 register struct cmd_syndesc *as;
50 {
51     register afs_int32 code;
52     struct ViceIoctl blob;
53     struct VenusFid vFid;
54     register struct cmd_item *ti;
55     struct VolumeStatus *status;
56     char *name;
57     int follow = 1;
58
59     if (as->parms[1].items)
60         follow = 0;
61     for(ti=as->parms[0].items; ti; ti=ti->next) {
62         /* once per file */
63         blob.out_size = sizeof(struct VenusFid);
64         blob.in_size = 0;
65         blob.out = (char*)&vFid;
66         code = pioctl(ti->data, VIOCGETFID, &blob, follow);
67         if (code) {
68             PioctlError(code, ti->data);
69             continue;
70         }
71         printf("%s: %x:%d.%d.%d\n", ti->data, vFid.Cell, vFid.Fid.Volume,
72                vFid.Fid.Vnode, vFid.Fid.Unique);
73     }
74     return 0;
75 }
76                
77
78
79 main(argc, argv)
80 int argc;
81 char **argv; {
82     register afs_int32 code;
83     register struct cmd_syndesc *ts;
84     
85 #ifdef  AFS_AIX32_ENV
86     /*
87      * The following signal action for AIX is necessary so that in case of a 
88      * crash (i.e. core is generated) we can include the user's data section 
89      * in the core dump. Unfortunately, by default, only a partial core is
90      * generated which, in many cases, isn't too useful.
91      */
92     struct sigaction nsa;
93     
94     sigemptyset(&nsa.sa_mask);
95     nsa.sa_handler = SIG_DFL;
96     nsa.sa_flags = SA_FULLDUMP;
97     sigaction(SIGSEGV, &nsa, NULL);
98 #endif
99
100     pn = argv[0];
101
102     ts = cmd_CreateSyntax("initcmd", WhatFidCmd, 0, "list fid for file(s)");
103     WhatFidCmd_FileParm = cmd_AddParm(ts, "-path", CMD_LIST, 0, "pathnames");
104     WhatFidCmd_FollowLinkParm = cmd_AddParm(ts, "-link", CMD_FLAG, CMD_OPTIONAL,
105                                       "do not follow symlinks");
106     
107     exit(cmd_Dispatch(argc, argv));
108 }
109
110 void
111 PioctlError(code, filename)
112     int   code;
113     char *filename;
114 { /*Die*/
115
116     if (errno == EINVAL) {
117         if (filename)
118             fprintf(stderr,"%s: Invalid argument; it is possible that %s is not in AFS.\n", pn, filename);
119         else fprintf(stderr,"%s: Invalid argument.\n", pn);
120     }
121     else if (errno == ENOENT) {
122         if (filename) fprintf(stderr,"%s: File '%s' doesn't exist\n", pn, filename);
123         else fprintf(stderr,"%s: no such file returned\n", pn);
124     }
125     else if (errno == EROFS)  fprintf(stderr,"%s: You can not change a backup or readonly volume\n", pn);
126     else if (errno == EACCES || errno == EPERM) {
127         if (filename) fprintf(stderr,"%s: You don't have the required access rights on '%s'\n", pn, filename);
128         else fprintf(stderr,"%s: You do not have the required rights to do this operation\n", pn);
129     }
130     else {
131         if (filename) fprintf(stderr,"%s:'%s'", pn, filename);
132         else fprintf(stderr,"%s", pn);
133         fprintf(stderr,": %s\n", error_message(errno));
134     }
135 } /*Die*/