diff --git a/src/Makefile.am b/src/Makefile.am index 6cc567a..18b1cec 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -41,7 +41,7 @@ lib_LTLIBRARIES = libtirpc.la # release number of your package. This is an abuse that only fosters # misunderstanding of the purpose of library versions." # -libtirpc_la_LDFLAGS = -lpthread -version-info 1:10:0 +libtirpc_la_LDFLAGS = -Wl,-no-undefined -lpthread -version-info 1:10:0 libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \ clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \ @@ -69,7 +69,7 @@ if GSS endif libtirpc_la_SOURCES += key_call.c key_prot_xdr.c getpublickey.c -libtirpc_la_SOURCES += netname.c netnamer.c rtime.c +libtirpc_la_SOURCES += netname.c netnamer.c rpcdname.c rtime.c CLEANFILES = cscope.* *~ DISTCLEANFILES = Makefile.in diff --git a/src/libtirpc.map b/src/libtirpc.map index 063cddd..449b769 100644 --- a/src/libtirpc.map +++ b/src/libtirpc.map @@ -316,6 +316,13 @@ TIRPC_0.3.2 { xdr_unixcred; } TIRPC_0.3.1; +TIRPC_0.3.3 { + __getpublickey_LOCAL; + __key_decryptsession_pk_LOCAL; + __key_encryptsession_pk_LOCAL; + __key_gendes_LOCAL; +} TIRPC_0.3.2; + TIRPC_PRIVATE { global: __libc_clntudp_bufcreate; diff --git a/src/rpcdname.c b/src/rpcdname.c new file mode 100644 index 0000000..3e6a988 --- /dev/null +++ b/src/rpcdname.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * rpcdname.c + * Gets the default domain name + */ + +#include +#include +#include + +static char *default_domain = 0; + +static char * +get_default_domain() +{ + char temp[256]; + + if (default_domain) + return (default_domain); + if (getdomainname(temp, sizeof(temp)) < 0) + return (0); + if ((int) strlen(temp) > 0) { + default_domain = (char *)malloc((strlen(temp)+(unsigned)1)); + if (default_domain == 0) + return (0); + (void) strcpy(default_domain, temp); + return (default_domain); + } + return (0); +} + +/* + * This is a wrapper for the system call getdomainname which returns a + * ypclnt.h error code in the failure case. It also checks to see that + * the domain name is non-null, knowing that the null string is going to + * get rejected elsewhere in the NIS client package. + */ +int +__rpc_get_default_domain(domain) + char **domain; +{ + if ((*domain = get_default_domain()) != 0) + return (0); + return (-1); +} diff --git a/src/svc_generic.c b/src/svc_generic.c index f49d776..7aae796 100644 --- a/src/svc_generic.c +++ b/src/svc_generic.c @@ -283,6 +283,8 @@ svc_tli_create(fd, nconf, bindaddr, sendsz, recvsz) xprt->xp_type = __rpc_socktype2seman(si.si_socktype); if (nconf) { + if (xprt->xp_netid != NULL) + free(xprt->xp_netid); xprt->xp_netid = strdup(nconf->nc_netid); xprt->xp_tp = strdup(nconf->nc_device); } diff --git a/src/svc_vc.c b/src/svc_vc.c index 9824631..6848c09 100644 --- a/src/svc_vc.c +++ b/src/svc_vc.c @@ -392,6 +392,12 @@ svc_vc_destroy(xprt) __svc_vc_dodestroy(xprt); } +static bool_t +__svc_rendezvous_socket(xprt) + SVCXPRT *xprt; +{ + return (xprt->xp_ops->xp_recv == rendezvous_request); +} static void __svc_vc_dodestroy(xprt) SVCXPRT *xprt; @@ -403,7 +409,7 @@ __svc_vc_dodestroy(xprt) if (xprt->xp_fd != RPC_ANYFD) (void)close(xprt->xp_fd); - if (xprt->xp_port != 0) { + if (__svc_rendezvous_socket(xprt)) { /* a rendezvouser socket */ r = (struct cf_rendezvous *)xprt->xp_p1; mem_free(r, sizeof (struct cf_rendezvous));