forked from pool/libtirpc
Accepting request 48317 from Base:System
checked in (request 48317) OBS-URL: https://build.opensuse.org/request/show/48317 OBS-URL: https://build.opensuse.org/package/show/Base:System/libtirpc?expand=0&rev=9
This commit is contained in:
parent
643b6c0ae7
commit
7dfc62e739
@ -1,101 +0,0 @@
|
||||
commit 258824b705df18d171eaf072cfda692504e3649e
|
||||
Author: Olaf Kirch <okir@suse.de>
|
||||
Date: Mon Aug 23 12:58:41 2010 +0200
|
||||
|
||||
Introduce new helper function getpmaphandle
|
||||
|
||||
This moves some code for creation of PMAP handles out of the getaddr
|
||||
code and into a function of its own.
|
||||
|
||||
Signed-off-by: Olaf Kirch <okir@suse.de>
|
||||
|
||||
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
|
||||
index a800128..962d9c7 100644
|
||||
--- a/src/rpcb_clnt.c
|
||||
+++ b/src/rpcb_clnt.c
|
||||
@@ -434,6 +434,44 @@ out_err:
|
||||
return (client);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Create a PMAP client handle.
|
||||
+ */
|
||||
+static CLIENT *
|
||||
+getpmaphandle(nconf, hostname, tgtaddr)
|
||||
+ const struct netconfig *nconf;
|
||||
+ const char *hostname;
|
||||
+ char **tgtaddr;
|
||||
+{
|
||||
+ CLIENT *client = NULL;
|
||||
+ rpcvers_t pmapvers = 2;
|
||||
+
|
||||
+ /*
|
||||
+ * Try UDP only - there are some portmappers out
|
||||
+ * there that use UDP only.
|
||||
+ */
|
||||
+ if (nconf == NULL || strcmp(nconf->nc_proto, NC_TCP) == 0) {
|
||||
+ struct netconfig *newnconf;
|
||||
+
|
||||
+ if ((newnconf = getnetconfigent("udp")) == NULL) {
|
||||
+ rpc_createerr.cf_stat = RPC_UNKNOWNPROTO;
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ client = getclnthandle(hostname, newnconf, tgtaddr);
|
||||
+ freenetconfigent(newnconf);
|
||||
+ } else if (strcmp(nconf->nc_proto, NC_UDP) == 0) {
|
||||
+ if (strcmp(nconf->nc_protofmly, NC_INET) != 0)
|
||||
+ return NULL;
|
||||
+ client = getclnthandle(hostname, nconf, tgtaddr);
|
||||
+ }
|
||||
+
|
||||
+ /* Set version */
|
||||
+ if (client != NULL)
|
||||
+ CLNT_CONTROL(client, CLSET_VERS, (char *)&pmapvers);
|
||||
+
|
||||
+ return client;
|
||||
+}
|
||||
+
|
||||
/* XXX */
|
||||
#define IN4_LOCALHOST_STRING "127.0.0.1"
|
||||
#define IN6_LOCALHOST_STRING "::1"
|
||||
@@ -770,34 +808,20 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp)
|
||||
if (strcmp(nconf->nc_protofmly, NC_INET) == 0) {
|
||||
u_short port = 0;
|
||||
struct netbuf remote;
|
||||
- rpcvers_t pmapvers = 2;
|
||||
struct pmap pmapparms;
|
||||
|
||||
- /*
|
||||
- * Try UDP only - there are some portmappers out
|
||||
- * there that use UDP only.
|
||||
- */
|
||||
- if (strcmp(nconf->nc_proto, NC_TCP) == 0) {
|
||||
- struct netconfig *newnconf;
|
||||
-
|
||||
- if ((newnconf = getnetconfigent("udp")) == NULL) {
|
||||
- rpc_createerr.cf_stat = RPC_UNKNOWNPROTO;
|
||||
- return (NULL);
|
||||
- }
|
||||
- client = getclnthandle(host, newnconf, &parms.r_addr);
|
||||
- freenetconfigent(newnconf);
|
||||
- } else if (strcmp(nconf->nc_proto, NC_UDP) == 0)
|
||||
- client = getclnthandle(host, nconf, &parms.r_addr);
|
||||
- else
|
||||
+ if (strcmp(nconf->nc_proto, NC_UDP) != 0
|
||||
+ && strcmp(nconf->nc_proto, NC_TCP) != 0)
|
||||
goto try_rpcbind;
|
||||
+
|
||||
+ client = getpmaphandle(nconf, IN4_LOCALHOST_STRING, &parms.r_addr);
|
||||
if (client == NULL)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
- * Set version and retry timeout.
|
||||
+ * Set retry timeout.
|
||||
*/
|
||||
CLNT_CONTROL(client, CLSET_RETRY_TIMEOUT, (char *)&rpcbrmttime);
|
||||
- CLNT_CONTROL(client, CLSET_VERS, (char *)&pmapvers);
|
||||
|
||||
pmapparms.pm_prog = program;
|
||||
pmapparms.pm_vers = version;
|
||||
|
@ -1,120 +0,0 @@
|
||||
commit 30feadb3ae5a8d001aabc44f8ddad44298ec61a2
|
||||
Author: Olaf Kirch <okir@suse.de>
|
||||
Date: Mon Aug 23 14:36:13 2010 +0200
|
||||
|
||||
pmap_set/unset: allow compat functions to work with old-style portmap
|
||||
|
||||
This change fixes a bug when running applications compiled against
|
||||
libtirpc on a host with old-style portmap. Without this change, the
|
||||
pmap_set/pmap_unset compatibility functions will actually be mapped
|
||||
to a RPCB_SET/UNSET call. If the server does not support anything more
|
||||
recent than PMAP, the operations will fail completely.
|
||||
|
||||
This fix makes pmap_set/unset try the old portmapper functions
|
||||
first, and if those fail, try to fall back to the new rpcbind
|
||||
interface.
|
||||
|
||||
Signed-off-by: Olaf Kirch <okir@suse.de>
|
||||
|
||||
diff --git a/src/pmap_clnt.c b/src/pmap_clnt.c
|
||||
index 1d5d153..24cf94a 100644
|
||||
--- a/src/pmap_clnt.c
|
||||
+++ b/src/pmap_clnt.c
|
||||
@@ -58,6 +58,10 @@ pmap_set(u_long program, u_long version, int protocol, int port)
|
||||
struct netconfig *nconf;
|
||||
char buf[32];
|
||||
|
||||
+#ifdef PORTMAP
|
||||
+ if (__pmap_set(program, version, protocol, port))
|
||||
+ return (TRUE);
|
||||
+#endif
|
||||
if ((protocol != IPPROTO_UDP) && (protocol != IPPROTO_TCP)) {
|
||||
return (FALSE);
|
||||
}
|
||||
@@ -89,6 +93,11 @@ pmap_unset(u_long program, u_long version)
|
||||
bool_t udp_rslt = FALSE;
|
||||
bool_t tcp_rslt = FALSE;
|
||||
|
||||
+#ifdef PORTMAP
|
||||
+ if (__pmap_set(program, version, IPPROTO_UDP, 0)
|
||||
+ && __pmap_set(program, version, IPPROTO_TCP, 0))
|
||||
+ return (TRUE);
|
||||
+#endif
|
||||
nconf = __rpc_getconfip("udp");
|
||||
if (nconf != NULL) {
|
||||
udp_rslt = rpcb_unset((rpcprog_t)program, (rpcvers_t)version,
|
||||
diff --git a/src/rpc_com.h b/src/rpc_com.h
|
||||
index 38c2cfe..0a20a01 100644
|
||||
--- a/src/rpc_com.h
|
||||
+++ b/src/rpc_com.h
|
||||
@@ -86,6 +86,9 @@ bool_t __xdrrec_getrec(XDR *, enum xprt_stat *, bool_t);
|
||||
void __xprt_unregister_unlocked(SVCXPRT *);
|
||||
void __xprt_set_raddr(SVCXPRT *, const struct sockaddr_storage *);
|
||||
|
||||
+#ifdef PORTMAP
|
||||
+bool_t __pmap_set(rpcprog_t, rpcvers_t, int protocol, int port);
|
||||
+#endif
|
||||
|
||||
SVCXPRT **__svc_xports;
|
||||
int __svc_maxrec;
|
||||
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
|
||||
index 531c619..9562646 100644
|
||||
--- a/src/rpcb_clnt.c
|
||||
+++ b/src/rpcb_clnt.c
|
||||
@@ -476,6 +476,55 @@ getpmaphandle(nconf, hostname, tgtaddr)
|
||||
#define IN4_LOCALHOST_STRING "127.0.0.1"
|
||||
#define IN6_LOCALHOST_STRING "::1"
|
||||
|
||||
+#ifdef PORTMAP
|
||||
+/*
|
||||
+ * Perform a PMAP_SET or PMAP_UNSET call to the
|
||||
+ * local rpcbind/portmap service.
|
||||
+ */
|
||||
+bool_t
|
||||
+__pmap_set(program, version, protocol, port)
|
||||
+ rpcprog_t program;
|
||||
+ rpcvers_t version;
|
||||
+ int protocol;
|
||||
+ int port;
|
||||
+{
|
||||
+ CLIENT *client;
|
||||
+ rpcproc_t pmapproc;
|
||||
+ struct pmap pmapparms;
|
||||
+ bool_t rslt = FALSE;
|
||||
+ enum clnt_stat clnt_st;
|
||||
+
|
||||
+ /* Arguments should already have been checked by caller */
|
||||
+
|
||||
+ pmapproc = port? PMAPPROC_SET : PMAPPROC_UNSET;
|
||||
+ pmapparms.pm_prog = program;
|
||||
+ pmapparms.pm_vers = version;
|
||||
+ pmapparms.pm_prot = protocol;
|
||||
+ pmapparms.pm_port = port;
|
||||
+
|
||||
+ client = getpmaphandle(NULL, IN4_LOCALHOST_STRING, NULL);
|
||||
+ if (client == NULL)
|
||||
+ return (FALSE);
|
||||
+
|
||||
+ clnt_st = CLNT_CALL(client, pmapproc,
|
||||
+ (xdrproc_t) xdr_pmap, (caddr_t)(void *) &pmapparms,
|
||||
+ (xdrproc_t) xdr_bool, (caddr_t)(void *) &rslt,
|
||||
+ tottimeout);
|
||||
+
|
||||
+ if (clnt_st == RPC_SUCCESS)
|
||||
+ return rslt;
|
||||
+
|
||||
+ if (clnt_st != RPC_PROGVERSMISMATCH &&
|
||||
+ clnt_st != RPC_PROGUNAVAIL) {
|
||||
+ rpc_createerr.cf_stat = RPC_PMAPFAILURE;
|
||||
+ clnt_geterr(client, &rpc_createerr.cf_error);
|
||||
+ return (FALSE);
|
||||
+ }
|
||||
+
|
||||
+ return (TRUE);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* This routine will return a client handle that is connected to the local
|
||||
* rpcbind. Returns NULL on error and free's everything.
|
||||
|
@ -1,11 +1,3 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Sep 15 14:38:57 UTC 2010 - max@novell.com
|
||||
|
||||
- Fix interoperability of libtirpc with the old portmapper:
|
||||
* Add libtirpc-getpmaphandle.patch
|
||||
* Add libtirpc-pmap-setunset.patch
|
||||
* bnc#633007
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu May 27 21:01:20 UTC 2010 - cristian.rodriguez@opensuse.org
|
||||
|
||||
|
@ -30,8 +30,6 @@ Url: http://sourceforge.net/projects/libtirpc/
|
||||
Source: %{name}-%{version}.tar.bz2
|
||||
Patch21: libtirpc-clnt_broadcast_fix.patch
|
||||
Patch22: libtirpc-rpc_broadcast_misformed_replies.patch
|
||||
Patch31: libtirpc-getpmaphandle.patch
|
||||
Patch32: libtirpc-pmap-setunset.patch
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
%define debug_package_requires libtirpc1 = %{version}-%{release}
|
||||
|
||||
@ -89,8 +87,6 @@ Authors:
|
||||
%setup -q
|
||||
%patch21 -p1
|
||||
%patch22 -p1
|
||||
%patch31 -p1
|
||||
%patch32 -p1
|
||||
|
||||
%build
|
||||
mkdir m4 #bug
|
||||
|
Loading…
Reference in New Issue
Block a user