|
|
1.1 root 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:
49: main(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:
79: udpping(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:
101: tcpping(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:
144: pmapdump(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:
203: usage()
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.