forked from pool/libtirpc
Accepting request 48317 from Base:System
Copy from Base:System/libtirpc based on submit request 48317 from user dirkmueller OBS-URL: https://build.opensuse.org/request/show/48317 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libtirpc?expand=0&rev=14
This commit is contained in:
commit
8464d5ba7c
101
libtirpc-getpmaphandle.patch
Normal file
101
libtirpc-getpmaphandle.patch
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
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;
|
||||||
|
|
120
libtirpc-pmap-setunset.patch
Normal file
120
libtirpc-pmap-setunset.patch
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
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,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
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
|
Thu May 27 21:01:20 UTC 2010 - cristian.rodriguez@opensuse.org
|
||||||
|
|
||||||
|
@ -24,12 +24,14 @@ License: Other uncritical OpenSource License ; Sun Industry Standards Sou
|
|||||||
Group: System/Libraries
|
Group: System/Libraries
|
||||||
AutoReqProv: on
|
AutoReqProv: on
|
||||||
Version: 0.2.1_git201005272057
|
Version: 0.2.1_git201005272057
|
||||||
Release: 1
|
Release: 2
|
||||||
Summary: Transport Independent RPC Library
|
Summary: Transport Independent RPC Library
|
||||||
Url: http://sourceforge.net/projects/libtirpc/
|
Url: http://sourceforge.net/projects/libtirpc/
|
||||||
Source: %{name}-%{version}.tar.bz2
|
Source: %{name}-%{version}.tar.bz2
|
||||||
Patch21: libtirpc-clnt_broadcast_fix.patch
|
Patch21: libtirpc-clnt_broadcast_fix.patch
|
||||||
Patch22: libtirpc-rpc_broadcast_misformed_replies.patch
|
Patch22: libtirpc-rpc_broadcast_misformed_replies.patch
|
||||||
|
Patch31: libtirpc-getpmaphandle.patch
|
||||||
|
Patch32: libtirpc-pmap-setunset.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
%define debug_package_requires libtirpc1 = %{version}-%{release}
|
%define debug_package_requires libtirpc1 = %{version}-%{release}
|
||||||
|
|
||||||
@ -87,6 +89,8 @@ Authors:
|
|||||||
%setup -q
|
%setup -q
|
||||||
%patch21 -p1
|
%patch21 -p1
|
||||||
%patch22 -p1
|
%patch22 -p1
|
||||||
|
%patch31 -p1
|
||||||
|
%patch32 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
mkdir m4 #bug
|
mkdir m4 #bug
|
||||||
|
Loading…
Reference in New Issue
Block a user