|
|
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: #ifndef lint ! 30: static char sccsid[] = "@(#)pmap_clnt.c 1.4 85/04/08 Copyr 1984 Sun Micro"; ! 31: #endif ! 32: ! 33: /* ! 34: * pmap_clnt.c ! 35: * Client interface to pmap rpc service. ! 36: * ! 37: * Copyright (C) 1984, Sun Microsystems, Inc. ! 38: */ ! 39: ! 40: #include "types.h" ! 41: #include <netinet/in.h> ! 42: #include "xdr.h" ! 43: #include "auth.h" ! 44: #include "clnt.h" ! 45: #include "rpc_msg.h" ! 46: #include "pmap_prot.h" ! 47: #include "pmap_clnt.h" ! 48: #include <sys/socket.h> ! 49: #include <sys/time.h> ! 50: #include <stdio.h> ! 51: #include <net/if.h> ! 52: #include <sys/ioctl.h> ! 53: #include <arpa/inet.h> ! 54: #define NAMELEN 255 ! 55: ! 56: static struct timeval timeout = { 5, 0 }; ! 57: static struct timeval tottimeout = { 60, 0 }; ! 58: static struct sockaddr_in myaddress; ! 59: ! 60: void clnt_perror(); ! 61: ! 62: ! 63: /* ! 64: * Set a mapping between program,version and port. ! 65: * Calls the pmap service remotely to do the mapping. ! 66: */ ! 67: bool_t ! 68: pmap_set(program, version, protocol, port) ! 69: u_long program; ! 70: u_long version; ! 71: u_long protocol; ! 72: u_short port; ! 73: { ! 74: struct sockaddr_in myaddress; ! 75: int socket = -1; ! 76: register CLIENT *client; ! 77: struct pmap parms; ! 78: bool_t rslt; ! 79: ! 80: get_myaddress(&myaddress); ! 81: client = clntudp_create(&myaddress, PMAPPROG, PMAPVERS, ! 82: timeout, &socket); ! 83: if (client == (CLIENT *)NULL) ! 84: return (FALSE); ! 85: parms.pm_prog = program; ! 86: parms.pm_vers = version; ! 87: parms.pm_prot = protocol; ! 88: parms.pm_port = port; ! 89: if (CLNT_CALL(client, PMAPPROC_SET, xdr_pmap, &parms, xdr_bool, &rslt, ! 90: tottimeout) != RPC_SUCCESS) { ! 91: clnt_perror(client, "Cannot register service"); ! 92: return (FALSE); ! 93: } ! 94: CLNT_DESTROY(client); ! 95: (void)close(socket); ! 96: return (rslt); ! 97: } ! 98: ! 99: /* ! 100: * Remove the mapping between program,version and port. ! 101: * Calls the pmap service remotely to do the un-mapping. ! 102: */ ! 103: bool_t ! 104: pmap_unset(program, version) ! 105: u_long program; ! 106: u_long version; ! 107: { ! 108: struct sockaddr_in myaddress; ! 109: int socket = -1; ! 110: register CLIENT *client; ! 111: struct pmap parms; ! 112: bool_t rslt; ! 113: ! 114: get_myaddress(&myaddress); ! 115: client = clntudp_create(&myaddress, PMAPPROG, PMAPVERS, ! 116: timeout, &socket); ! 117: if (client == (CLIENT *)NULL) ! 118: return (FALSE); ! 119: parms.pm_prog = program; ! 120: parms.pm_vers = version; ! 121: parms.pm_port = parms.pm_prot = 0; ! 122: CLNT_CALL(client, PMAPPROC_UNSET, xdr_pmap, &parms, xdr_bool, &rslt, ! 123: tottimeout); ! 124: CLNT_DESTROY(client); ! 125: (void)close(socket); ! 126: return (rslt); ! 127: } ! 128: ! 129: /* ! 130: * don't use gethostbyname, which would invoke yellow pages ! 131: */ ! 132: get_myaddress(addr) ! 133: struct sockaddr_in *addr; ! 134: { ! 135: int s; ! 136: char buf[BUFSIZ]; ! 137: struct ifconf ifc; ! 138: struct ifreq ifreq, *ifr; ! 139: int len, slop; ! 140: ! 141: if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { ! 142: perror("get_myaddress: socket"); ! 143: exit(1); ! 144: } ! 145: ifc.ifc_len = sizeof (buf); ! 146: ifc.ifc_buf = buf; ! 147: if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) { ! 148: perror("get_myaddress: ioctl (get interface configuration)"); ! 149: exit(1); ! 150: } ! 151: ifr = ifc.ifc_req; ! 152: for (len = ifc.ifc_len; len; len -= sizeof ifreq) { ! 153: ifreq = *ifr; ! 154: if (ioctl(s, SIOCGIFFLAGS, (char *)&ifreq) < 0) { ! 155: perror("get_myaddress: ioctl"); ! 156: exit(1); ! 157: } ! 158: if ((ifreq.ifr_flags & IFF_UP) && ! 159: ifr->ifr_addr.sa_family == AF_INET) { ! 160: *addr = *((struct sockaddr_in *)&ifr->ifr_addr); ! 161: addr->sin_port = htons(PMAPPORT); ! 162: break; ! 163: } ! 164: /* ! 165: * Deal with variable length addresses ! 166: */ ! 167: slop = ifr->ifr_addr.sa_len - sizeof (struct sockaddr); ! 168: if (slop) { ! 169: ifr = (struct ifreq *) ((caddr_t)ifr + slop); ! 170: len -= slop; ! 171: } ! 172: ifr++; ! 173: } ! 174: close(s); ! 175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.