cmdebug-obsd-ce32-20051102
[openafs.git] / src / venus / dedebug.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
16 #include <sys/types.h>
17 #include <netinet/in.h>
18 #include <sys/socket.h>
19 #include <netdb.h>
20 #include <stdio.h>
21 #ifdef  AFS_AIX32_ENV
22 #include <signal.h>
23 #endif
24 #include <afs/afscbint.h>
25 #include <afs/cmd.h>
26 #include <rx/rx.h>
27 #include <lock.h>
28
29 extern struct rx_securityClass *rxnull_NewServerSecurityObject();
30 extern struct hostent *hostutil_GetHostByName();
31
32 static PrintCacheEntries(struct rx_connection *aconn, int aint32)
33 {
34     register int i;
35     register afs_int32 code, addr, inode, flags, time;
36     char *fileName;
37
38     for(i=0;i<100000;i++) {
39         code = RXAFSCB_GetDE(aconn, i, &addr, &inode, &flags, &time, &fileName);
40         if (code) {
41             if (code == 1) break;
42             printf("cmdebug: failed to get cache entry %d (%s)\n", i,
43                    error_message(code));
44             return code;
45         }
46
47         /* otherwise print this entry */
48         printf("%d: ** dentry %d %08x %d %d %s\n",
49                i, addr, inode, flags, time, fileName);
50
51         printf("\n");
52     }
53     printf("Returned %d entries.\n", i);
54     return 0;
55 }
56
57 static CommandProc(as)
58 struct cmd_syndesc *as; {
59     struct rx_connection *conn;
60     register char *hostName;
61     register struct hostent *thp;
62     afs_int32 port;
63     struct rx_securityClass *secobj;
64     int int32p;
65     afs_int32 addr;
66
67     hostName = as->parms[0].items->data;
68     if (as->parms[1].items)
69         port = atoi(as->parms[1].items->data);
70     else
71         port = 7001;
72     thp = hostutil_GetHostByName(hostName);
73     if (!thp) {
74         printf("cmdebug: can't resolve address for host %s.\n", hostName);
75         exit(1);
76     }
77     memcpy(&addr, thp->h_addr, sizeof(afs_int32));
78     secobj = rxnull_NewServerSecurityObject();
79     conn = rx_NewConnection(addr, htons(port), 1, secobj, 0);
80     if (!conn) {
81         printf("cmdebug: failed to create connection for host %s\n", hostName);
82         exit(1);
83     }
84     if (as->parms[2].items) int32p = 1;
85     else int32p = 0;
86     PrintCacheEntries(conn, int32p);
87     return 0;
88 }
89
90 #include "AFS_component_version_number.c"
91
92 main(argc, argv)
93 int argc;
94 char **argv; {
95     register struct cmd_syndesc *ts;
96
97 #ifdef  AFS_AIX32_ENV
98     /*
99      * The following signal action for AIX is necessary so that in case of a 
100      * crash (i.e. core is generated) we can include the user's data section 
101      * in the core dump. Unfortunately, by default, only a partial core is
102      * generated which, in many cases, isn't too useful.
103      */
104     struct sigaction nsa;
105     
106     sigemptyset(&nsa.sa_mask);
107     nsa.sa_handler = SIG_DFL;
108     nsa.sa_flags = SA_FULLDUMP;
109     sigaction(SIGSEGV, &nsa, NULL);
110 #endif
111     rx_Init(0);
112
113     ts = cmd_CreateSyntax((char *) 0, CommandProc, 0, "probe unik server");
114     cmd_AddParm(ts, "-servers", CMD_SINGLE, CMD_REQUIRED, "server machine");
115     cmd_AddParm(ts, "-port", CMD_SINGLE, CMD_OPTIONAL, "IP port");
116     cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print all info");
117
118     cmd_Dispatch(argc, argv);
119     exit(0);
120 }