BSD 4_3_Tahoe release
[unix-history] / usr / src / new / sunrpc / rpcinfo.c
CommitLineData
135d6f9c
C
1/*
2 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
3 * unrestricted use provided that this legend is included on all tape
4 * media and as a part of the software program in whole or part. Users
5 * may copy or modify Sun RPC without charge, but are not authorized
6 * to license or distribute it to anyone else except as part of a product or
7 * program developed by the user.
8 *
9 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
10 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
11 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
12 *
13 * Sun RPC is provided with no support and without any obligation on the
14 * part of Sun Microsystems, Inc. to assist in its use, correction,
15 * modification or enhancement.
16 *
17 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
18 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
19 * OR ANY PART THEREOF.
20 *
21 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
22 * or profits or other special, indirect and consequential damages, even if
23 * Sun has been advised of the possibility of such damages.
24 *
25 * Sun Microsystems, Inc.
26 * 2550 Garcia Avenue
27 * Mountain View, California 94043
28 */
29
30/*
31 * Copyright (C) 1984, Sun Microsystems, Inc.
32 */
33
34/*
35 * rpcinfo: ping a particular rpc program
36 * or dump the portmapper
37 */
38
39#include <rpc/rpc.h>
40#include <stdio.h>
41#include <sys/socket.h>
42#include <sys/time.h>
43#include <netdb.h>
44#include <rpc/pmap_prot.h>
45#include <rpc/pmap_clnt.h>
46
47#define MAXHOSTLEN 256
48
49main(argc, argv)
50 char **argv;
51{
52 int ans;
53
54 if (argc < 2) {
55 usage();
56 exit(1);
57 }
58 if (argv[1][0] == '-') {
59 switch(argv[1][1]) {
60 case 't':
61 tcpping(argc-1, argv+1);
62 break;
63 case 'p':
64 pmapdump(argc-1, argv+1);
65 break;
66 case 'u':
67 udpping(argc-1, argv+1);
68 break;
69 default:
70 usage();
71 exit(1);
72 break;
73 }
74 }
75 else
76 usage();
77}
78
79udpping(argc, argv)
80 char **argv;
81{
82 int ans;
83
84 if (argc != 4) {
85 usage();
86 exit(1);
87 }
88 ans = callrpc(argv[1], atoi(argv[2]), atoi(argv[3]), NULLPROC,
89 xdr_void, 0, xdr_void, 0);
90 if (ans != 0) {
91 clnt_perrno(ans);
92 fprintf(stderr, "\n");
93 printf("proc %d vers %d is not available\n", atoi(argv[2]),
94 atoi(argv[3]));
95 }
96 else
97 printf("proc %d vers %d ready and waiting\n", atoi(argv[2]),
98 atoi(argv[3]));
99}
100
101tcpping(argc, argv)
102 int argc;
103 char **argv;
104{
105 struct timeval to;
106 struct sockaddr_in addr;
107 enum clnt_stat rpc_stat;
108 CLIENT *client;
109 int sock = -1;
110 struct hostent *hp;
111
112 if (argc != 4) {
113 usage();
114 exit(1);
115 }
116 if ((hp = gethostbyname(argv[1])) == NULL) {
117 fprintf(stderr, "can't find %s\n", argv[1]);
118 exit(1);
119 }
120 addr.sin_family = AF_INET;
121 addr.sin_port = 0;
122 addr.sin_addr.s_addr = *(int *)hp->h_addr;
123 if ((client = clnttcp_create(&addr, atoi(argv[2]),
124 atoi(argv[3]), &sock, 0, 0)) == NULL) {
125 clnt_pcreateerror("");
126 printf("proc %d vers %d is not available\n",
127 atoi(argv[2]), atoi(argv[3]));
128 exit(1);
129 }
130 to.tv_usec = 0;
131 to.tv_sec = 10;
132 rpc_stat = clnt_call(client, 0, xdr_void, NULL, xdr_void, NULL, to);
133 if (rpc_stat != RPC_SUCCESS) {
134 clnt_perrno(rpc_stat);
135 fprintf(stderr, "\n");
136 printf("proc %d vers %d is not available\n", atoi(argv[2]),
137 atoi(argv[3]));
138 }
139 else
140 printf("proc %d vers %d ready and waiting\n", atoi(argv[2]),
141 atoi(argv[3]));
142}
143
144pmapdump(argc, argv)
145 int argc;
146 char **argv;
147{
148 struct sockaddr_in server_addr;
149 struct hostent *hp;
150 struct pmaplist *head;
151 char hoststr[MAXHOSTLEN];
152 int socket = -1;
153 struct timeval minutetimeout;
154 char *hostnm;
155 register CLIENT *client;
156 enum clnt_stat rpc_stat;
157
158 if (argc > 2) {
159 usage();
160 exit(1);
161 }
162 if (argc == 2) {
163 hostnm = argv[1];
164 } else {
165 gethostname(hoststr, sizeof(hoststr));
166 hostnm = hoststr;
167 }
168 if ((hp = gethostbyname(hostnm)) == NULL) {
169 fprintf(stderr, "cannot get addr for '%s'\n", hostnm);
170 exit(0);
171 }
172 bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, hp->h_length);
173 server_addr.sin_family = AF_INET;
174 minutetimeout.tv_sec = 60;
175 minutetimeout.tv_usec = 0;
176 server_addr.sin_port = htons(PMAPPORT);
177 if ((client = clnttcp_create(&server_addr, PMAPPROG,
178 PMAPVERS, &socket, 50, 500)) == NULL) {
179 clnt_pcreateerror("rpcinfo: can't contact portmapper");
180 exit(1);
181 }
182 if (clnt_call(client, PMAPPROC_DUMP, xdr_void, NULL,
183 xdr_pmaplist, &head, minutetimeout) != RPC_SUCCESS) {
184 fprintf(stderr, "rpcinfo: can't contact portmapper");
185 clnt_perrno(rpc_stat);
186 fprintf(stderr, "\n");
187 exit(1);
188 }
189 if (head == NULL) {
190 printf("No remote programs registered.\n");
191 } else {
192 printf("[program, version, protocol, port]:\n\n");
193 for (; head != (struct pmaplist *)NULL; head = head->pml_next) {
194 printf("[%ld, %ld, %ld, %ld]\n",
195 head->pml_map.pm_prog,
196 head->pml_map.pm_vers,
197 head->pml_map.pm_prot,
198 head->pml_map.pm_port);
199 }
200 }
201}
202
203usage()
204{
205 fprintf(stderr, "Usage: rpcinfo -u host prognum versnum\n");
206 fprintf(stderr, " rpcinfo -t host prognum versnum\n");
207 fprintf(stderr, " rpcinfo -p [host]\n");
208}