|
|
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.