libtirpc 0.2.1
authorYaakov Selkowitz <yselkowitz@users.sourceforge.net>
Mon, 26 Aug 2013 22:41:54 +0000 (17:41 -0500)
committerYaakov Selkowitz <yselkowitz@users.sourceforge.net>
Mon, 26 Aug 2013 22:41:54 +0000 (17:41 -0500)
Patchset by Chuck Wilson

01-thread_key_t-warnings.patch [new file with mode: 0644]
02-silence-more-warnings.patch [new file with mode: 0644]
03-make-install-with-out-of-sourcetree-builds.patch [new file with mode: 0644]
04-Clean-up-and-modernize-autotool-usage.patch [new file with mode: 0644]
05-Make-NIS-support-optional.patch [new file with mode: 0644]
06-Allow-using-system-XDR-implementation.patch [new file with mode: 0644]
07-cygwin-specific-fixes.patch [new file with mode: 0644]
08-misc.patch [new file with mode: 0644]
libtirpc.cygport [new file with mode: 0644]

diff --git a/01-thread_key_t-warnings.patch b/01-thread_key_t-warnings.patch
new file mode 100644 (file)
index 0000000..59b751c
--- /dev/null
@@ -0,0 +1,128 @@
+diff --git a/src/clnt_simple.c b/src/clnt_simple.c
+index e66da6a..03336f0 100644
+--- a/src/clnt_simple.c
++++ b/src/clnt_simple.c
+@@ -104,9 +104,9 @@ rpc_call(host, prognum, versnum, procnum, inproc, in, outproc, out, nettype)
+       extern thread_key_t rpc_call_key;
+       extern mutex_t tsd_lock;
+-      if (rpc_call_key == -1) {
++      if (rpc_call_key == (thread_key_t)(-1)) {
+               mutex_lock(&tsd_lock);
+-              if (rpc_call_key == -1)
++              if (rpc_call_key == (thread_key_t)(-1))
+                       thr_keycreate(&rpc_call_key, rpc_call_destroy);
+               mutex_unlock(&tsd_lock);
+       }
+diff --git a/src/getnetconfig.c b/src/getnetconfig.c
+index af4a484..5efbf89 100644
+--- a/src/getnetconfig.c
++++ b/src/getnetconfig.c
+@@ -136,10 +136,10 @@ __nc_error()
+        * (including non-threaded programs), or if an allocation
+        * fails.
+        */
+-      if (nc_key == -1) {
++      if (nc_key == (thread_key_t)(-1)) {
+               error = 0;
+               mutex_lock(&nc_lock);
+-              if (nc_key == -1)
++              if (nc_key == (thread_key_t)(-1))
+                       error = thr_keycreate(&nc_key, free);
+               mutex_unlock(&nc_lock);
+               if (error)
+diff --git a/src/mt_misc.c b/src/mt_misc.c
+index 4cba143..3286bd9 100644
+--- a/src/mt_misc.c
++++ b/src/mt_misc.c
+@@ -79,11 +79,11 @@ pthread_mutex_t    tsd_lock = PTHREAD_MUTEX_INITIALIZER;
+ /* Library global tsd keys */
+ thread_key_t clnt_broadcast_key;
+-thread_key_t rpc_call_key = -1;
+-thread_key_t tcp_key = -1;
+-thread_key_t udp_key = -1;
+-thread_key_t nc_key = -1;
+-thread_key_t rce_key = -1;
++thread_key_t rpc_call_key = (thread_key_t)(-1);
++thread_key_t tcp_key = (thread_key_t)(-1);
++thread_key_t udp_key = (thread_key_t)(-1);
++thread_key_t nc_key = (thread_key_t)(-1);
++thread_key_t rce_key = (thread_key_t)(-1);
+ /* xprtlist (svc_generic.c) */
+ pthread_mutex_t       xprtlist_lock = PTHREAD_MUTEX_INITIALIZER;
+@@ -101,7 +101,7 @@ __rpc_createerr()
+       struct rpc_createerr *rce_addr;
+       mutex_lock(&tsd_lock);
+-      if (rce_key == -1)
++      if (rce_key == (thread_key_t)(-1))
+               thr_keycreate(&rce_key, free);
+       mutex_unlock(&tsd_lock);
+@@ -122,17 +122,17 @@ __rpc_createerr()
+ void tsd_key_delete(void)
+ {
+-      if (clnt_broadcast_key != -1)
++      if (clnt_broadcast_key != (thread_key_t)(-1))
+               thr_keydelete(clnt_broadcast_key);
+-      if (rpc_call_key != -1)
++      if (rpc_call_key != (thread_key_t)(-1))
+               thr_keydelete(rpc_call_key);
+-      if (tcp_key != -1)
++      if (tcp_key != (thread_key_t)(-1))
+               thr_keydelete(tcp_key);
+-      if (udp_key != -1)
++      if (udp_key != (thread_key_t)(-1))
+               thr_keydelete(udp_key);
+-      if (nc_key != -1)
++      if (nc_key != (thread_key_t)(-1))
+               thr_keydelete(nc_key);
+-      if (rce_key != -1)
++      if (rce_key != (thread_key_t)(-1))
+               thr_keydelete(rce_key);
+       return;
+ }
+diff --git a/src/rpc_generic.c b/src/rpc_generic.c
+index 541275c..d4f1283 100644
+--- a/src/rpc_generic.c
++++ b/src/rpc_generic.c
+@@ -228,16 +228,16 @@ __rpc_getconfip(nettype)
+       extern thread_key_t tcp_key, udp_key;
+       extern mutex_t tsd_lock;
+-      if (tcp_key == -1) {
++      if (tcp_key == (thread_key_t)(-1)) {
+               mutex_lock(&tsd_lock);
+-              if (tcp_key == -1)
++              if (tcp_key == (thread_key_t)(-1))
+                       thr_keycreate(&tcp_key, free);
+               mutex_unlock(&tsd_lock);
+       }
+       netid_tcp = (char *)thr_getspecific(tcp_key);
+-      if (udp_key == -1) {
++      if (udp_key == (thread_key_t)(-1)) {
+               mutex_lock(&tsd_lock);
+-              if (udp_key == -1)
++              if (udp_key == (thread_key_t)(-1))
+                       thr_keycreate(&udp_key, free);
+               mutex_unlock(&tsd_lock);
+       }
+diff --git a/src/rpc_soc.c b/src/rpc_soc.c
+index 709a8a8..bef5c2c 100644
+--- a/src/rpc_soc.c
++++ b/src/rpc_soc.c
+@@ -467,9 +467,9 @@ clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
+ {
+       extern mutex_t tsd_lock;
+-      if (clnt_broadcast_key == -1) {
++      if (clnt_broadcast_key == (thread_key_t)(-1)) {
+               mutex_lock(&tsd_lock);
+-              if (clnt_broadcast_key == -1)
++              if (clnt_broadcast_key == (thread_key_t)(-1))
+                       thr_keycreate(&clnt_broadcast_key, free);
+               mutex_unlock(&tsd_lock);
+       }
diff --git a/02-silence-more-warnings.patch b/02-silence-more-warnings.patch
new file mode 100644 (file)
index 0000000..742dc34
--- /dev/null
@@ -0,0 +1,38 @@
+diff --git a/src/clnt_bcast.c b/src/clnt_bcast.c
+index 140407b..d2c4147 100644
+--- a/src/clnt_bcast.c
++++ b/src/clnt_bcast.c
+@@ -74,8 +74,12 @@
+ #define       INITTIME 4000   /* Time to wait initially */
+ #define       WAITTIME 8000   /* Maximum time to wait */
++#ifndef POLLRDNORM
+ # define POLLRDNORM     0x040           /* Normal data may be read.  */
++#endif
++#ifndef POLLRDBAND
+ # define POLLRDBAND     0x080           /* Priority data may be read.  */
++#endif
+@@ -542,7 +546,7 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
+               try_again:
+                       inlen = recvfrom(fdlist[i].fd, inbuf, fdlist[i].dsize,
+                           0, (struct sockaddr *)(void *)&fdlist[i].raddr,
+-                          &fdlist[i].asize);
++                          (socklen_t *)&fdlist[i].asize);
+                       if (inlen < 0) {
+                               if (errno == EINTR)
+                                       goto try_again;
+diff --git a/tirpc/rpc/clnt_soc.h b/tirpc/rpc/clnt_soc.h
+index 82330a3..8172f04 100644
+--- a/tirpc/rpc/clnt_soc.h
++++ b/tirpc/rpc/clnt_soc.h
+@@ -47,6 +47,7 @@
+  */
+ #include <sys/cdefs.h>
++#include <netinet/in.h>
+ #define UDPMSGSIZE      8800    /* rpc imposed limit on udp msg size */  
diff --git a/03-make-install-with-out-of-sourcetree-builds.patch b/03-make-install-with-out-of-sourcetree-builds.patch
new file mode 100644 (file)
index 0000000..a2b76d3
--- /dev/null
@@ -0,0 +1,11 @@
+diff --git a/doc/Makefile.am b/doc/Makefile.am
+index cc4fa76..bac7c0f 100644
+--- a/doc/Makefile.am
++++ b/doc/Makefile.am
+@@ -1,5 +1,5 @@
+ install: install-am
+       $(mkinstalldirs) $(DESTDIR)/etc
+-      cp -p ./etc_netconfig $(DESTDIR)/etc/netconfig
++      cp -p $(srcdir)/etc_netconfig $(DESTDIR)/etc/netconfig
+       chmod 0644 $(DESTDIR)/etc/netconfig
diff --git a/04-Clean-up-and-modernize-autotool-usage.patch b/04-Clean-up-and-modernize-autotool-usage.patch
new file mode 100644 (file)
index 0000000..13082af
--- /dev/null
@@ -0,0 +1,138 @@
+diff --git a/Makefile.am b/Makefile.am
+index 7f5f37b..f5d6062 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1,3 +1,5 @@
++ACLOCAL_AMFLAGS = -I m4
++
+ SUBDIRS = src man doc
+ nobase_include_HEADERS = tirpc/netconfig.h \
+diff --git a/configure.ac b/configure.ac
+index 0f3ce42..28beb70 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1,9 +1,16 @@
+-AC_INIT(libtirpc, 0.2.1)
+-AM_INIT_AUTOMAKE(libtirpc, 0.2.1)
+-AM_MAINTAINER_MODE
++AC_INIT([TI-RPC Library],
++      [0.2.1],
++      [libtirpc-devel@lists.sourceforge.net],
++      [libtirpc],
++      [http://nfsv4.bullopensource.org/doc/tirpc_rpcbind.php])
+ AC_CONFIG_SRCDIR([src/auth_des.c])
++AM_INIT_AUTOMAKE
++AM_MAINTAINER_MODE
++AC_CONFIG_MACRO_DIR([m4])
+-AC_ARG_ENABLE(gss,[  --enable-gss            Turn on gss api], [case "${enableval}" in
++AC_ARG_ENABLE([gss],
++      [AS_HELP_STRING([--enable-gss], [Turn on gss api])],
++      [case "${enableval}" in
+         yes) gss=true ; AC_CHECK_LIB([gssapi],[gss_init_sec_context]) ;;
+         no)  gss=false ;;
+         *) AC_MSG_ERROR(bad value ${enableval} for --enable-gss) ;;
+@@ -17,8 +24,7 @@ fi
+ AC_PROG_CC
+ AM_CONFIG_HEADER(config.h)
+-AC_PROG_LIBTOOL
+-##AC_PROG_RANLIB
++LT_INIT([win32-dll])
+ AC_HEADER_DIRENT
+ AC_PREFIX_DEFAULT(/usr)
+ AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h])
+diff --git a/m4/.gitignore b/m4/.gitignore
+new file mode 100644
+index 0000000..464ba5c
+--- /dev/null
++++ b/m4/.gitignore
+@@ -0,0 +1,5 @@
++libtool.m4
++lt~obsolete.m4
++ltoptions.m4
++ltsugar.m4
++ltversion.m4
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 7b002da..daa6202 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -40,9 +40,14 @@ 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 = -lnsl -lpthread -version-info 1:10:0
++libtirpc_la_LDFLAGS = -lnsl -lpthread -version-info 1:10:0 -no-undefined
+-libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
++XDR_SRCS = xdr.c xdr_rec.c xdr_array.c xdr_float.c \
++         xdr_mem.c xdr_reference.c xdr_stdio.c
++
++GSS_SRCS = auth_gss.c authgss_prot.c svc_auth_gss.c svc_auth_none.c
++
++BASE_SRCS = 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 \
+         clnt_vc.c rpc_dtablesize.c getnetconfig.c getnetpath.c getrpcent.c \
+         getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+@@ -52,44 +57,30 @@ libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c cln
+         svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
+         auth_time.c auth_des.c authdes_prot.c
++libtirpc_la_SOURCES = $(BASE_SRCS)
++libtirpc_la_CFLAGS = $(AM_CFLAGS)
++libtirpc_la_CPPFLAGS = $(AM_CPPFLAGS)
++
+ ## XDR
+-libtirpc_la_SOURCES += xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c
++libtirpc_la_SOURCES += $(XDR_SRCS)
+ ## Secure-RPC
+ if GSS
+-    libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c \
+-              svc_auth_none.c
++    libtirpc_la_SOURCES += $(GSS_SRCS)
+     libtirpc_la_LDFLAGS += $(GSSGLUE_LIBS)
+-    libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS $(GSSGLUE_CFLAGS)
++    libtirpc_la_CPPFLAGS += -DHAVE_RPCSEC_GSS
++    libtirpc_la_CFLAGS += $(GSSGLUE_CFLAGS)
+ endif
+ ## libtirpc_a_SOURCES += key_call.c key_prot_xdr.c getpublickey.c
+-## libtirpc_a_SOURCES += netname.c netnamer.c rpcdname.c \
+-## libtirpc_a_SOURCES += rtime.c \
+-## auth_time.c auth_des.c authdes_prot.c 
++## libtirpc_a_SOURCES += netname.c netnamer.c rpcdname.c
++## libtirpc_a_SOURCES += rtime.c
++
++libtirpc_la_DEPS = $(BASE_SRCS) $(XDR_SRCS)
+ if GSS
+-$(libtirpc_la_OBJECTS) :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 \
+-        clnt_vc.c rpc_dtablesize.c getnetconfig.c getnetpath.c getrpcent.c \
+-        getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+-        pmap_prot.c pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c \
+-        rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+-        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+-        svc_raw.c svc_run.c svc_simple.c svc_vc.c \
+-      xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c \
+-      auth_gss.c authgss_prot.c svc_auth_gss.c getpeereid.c \
+-      auth_time.c auth_des.c authdes_prot.c svc_auth_none.c
+-        
+-else
+-$(libtirpc_la_OBJECTS) :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 \
+-        clnt_vc.c rpc_dtablesize.c getnetconfig.c getnetpath.c getrpcent.c \
+-        getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+-        pmap_prot.c pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c \
+-        rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+-        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+-        svc_raw.c svc_run.c svc_simple.c svc_vc.c \
+-      xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c \
+-      getpeereid.c auth_time.c auth_des.c authdes_prot.c
++libtirpc_la_DEPS += $(GSS_SRCS)
+ endif
++
++$(libtirpc_la_OBJECTS) : $(libtirpc_la_DEPS)
++
diff --git a/05-Make-NIS-support-optional.patch b/05-Make-NIS-support-optional.patch
new file mode 100644 (file)
index 0000000..9a1b7c9
--- /dev/null
@@ -0,0 +1,105 @@
+diff --git a/configure.ac b/configure.ac
+index 28beb70..ebafefc 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -28,7 +28,22 @@ LT_INIT([win32-dll])
+ AC_HEADER_DIRENT
+ AC_PREFIX_DEFAULT(/usr)
+ AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h])
++AC_CHECK_HEADER([rpcsvc/nis.h],
++      # traditional 'have a header' symbol
++      [AC_DEFINE([HAVE_RPCSVC_NIS_H], [1],
++              [Define to 1 if you have <rpcsvc/nis.h>.])
++      # but use this symbol to indicate that TI-RPC should be NIS-aware
++      AC_DEFINE([HAVE_NIS], [1],
++              [Define to 1 if you have <rpcsvc/nis.h> and want an NIS-aware TI-RPC])
++      tirpc_has_nis=yes],
++      [tirpc_has_nis=no])
++AM_CONDITIONAL(HAVE_NIS, test x$tirpc_has_nis = xyes)
++
+ AC_CHECK_LIB([pthread], [pthread_create])
++# Only add -lnsl if needed, for yp_match
++AC_CHECK_FUNC([yp_match], , AC_CHECK_LIB([nsl], [yp_match]))
++# Only add -lsocket if needed, for setsockopt
++AC_CHECK_FUNC([setsockopt], , AC_CHECK_LIB([socket], [setsockopt]))
+ AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile])
+diff --git a/src/Makefile.am b/src/Makefile.am
+index daa6202..9bb2474 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -40,11 +40,13 @@ 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 = -lnsl -lpthread -version-info 1:10:0 -no-undefined
++libtirpc_la_LDFLAGS = -version-info 1:10:0 -no-undefined
+ XDR_SRCS = xdr.c xdr_rec.c xdr_array.c xdr_float.c \
+          xdr_mem.c xdr_reference.c xdr_stdio.c
++NIS_SRCS = auth_time.c auth_des.c
++
+ GSS_SRCS = auth_gss.c authgss_prot.c svc_auth_gss.c svc_auth_none.c
+ BASE_SRCS = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
+@@ -55,19 +57,25 @@ BASE_SRCS = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c
+         rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+         rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+         svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
+-        auth_time.c auth_des.c authdes_prot.c
++        authdes_prot.c
+ libtirpc_la_SOURCES = $(BASE_SRCS)
+ libtirpc_la_CFLAGS = $(AM_CFLAGS)
+ libtirpc_la_CPPFLAGS = $(AM_CPPFLAGS)
++libtirpc_la_LIBADD = $(LIBS)
+ ## XDR
+ libtirpc_la_SOURCES += $(XDR_SRCS)
++## NIS
++if HAVE_NIS
++libtirpc_la_SOURCES += $(NIS_SRCS)
++endif
++
+ ## Secure-RPC
+ if GSS
+     libtirpc_la_SOURCES += $(GSS_SRCS)
+-    libtirpc_la_LDFLAGS += $(GSSGLUE_LIBS)
++    libtirpc_la_LIBADD += $(GSSGLUE_LIBS)
+     libtirpc_la_CPPFLAGS += -DHAVE_RPCSEC_GSS
+     libtirpc_la_CFLAGS += $(GSSGLUE_CFLAGS)
+ endif
+@@ -78,6 +86,10 @@ endif
+ libtirpc_la_DEPS = $(BASE_SRCS) $(XDR_SRCS)
++if HAVE_NIS
++libtirpc_la_DEPS += $(NIS_SRCS)
++endif
++
+ if GSS
+ libtirpc_la_DEPS += $(GSS_SRCS)
+ endif
+diff --git a/src/rpc_soc.c b/src/rpc_soc.c
+index bef5c2c..ccf337c 100644
+--- a/src/rpc_soc.c
++++ b/src/rpc_soc.c
+@@ -479,6 +479,7 @@ clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
+           (resultproc_t) rpc_wrap_bcast, "udp");
+ }
++#ifdef HAVE_NIS
+ /*
+  * Create the client des authentication object. Obsoleted by
+  * authdes_seccreate().
+@@ -510,6 +511,7 @@ fallback:
+       dummy = authdes_seccreate(servername, window, NULL, ckey);
+       return (dummy);
+ }
++#endif /* HAVE_NIS */
+ /*
+  * Create a client handle for a unix connection. Obsoleted by clnt_vc_create()
diff --git a/06-Allow-using-system-XDR-implementation.patch b/06-Allow-using-system-XDR-implementation.patch
new file mode 100644 (file)
index 0000000..85d67ea
--- /dev/null
@@ -0,0 +1,1202 @@
+diff --git a/Makefile.am b/Makefile.am
+index f5d6062..76f7c82 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -2,11 +2,22 @@ ACLOCAL_AMFLAGS = -I m4
+ SUBDIRS = src man doc
++xdrdir = $(includedir)/tirpc/rpc
++
++# The normal XDR headers which are used/installed when
++# providing a local implementation of XDR. (That is,
++# when --enable-xdr)
++XDR_FULL_HDRS = tirpc/xdr-full/rpc/types.h tirpc/xdr-full/rpc/xdr.h
++
++# The stub xdr headers provide tirpc-specific additions to
++# the system versions. Used when libtirpc is configured to
++# use the system XDR implementation and does not provide its
++# own verson -- that is, when --disable-xdr.
++XDR_STUB_HDRS = tirpc/xdr-stub/rpc/types.h
++
+ nobase_include_HEADERS = tirpc/netconfig.h \
+                        tirpc/rpcsvc/crypt.x \
+                        tirpc/rpcsvc/crypt.h \
+-                       tirpc/rpc/xdr.h \
+-                       tirpc/rpc/types.h \
+                        tirpc/rpc/svc_soc.h \
+                        tirpc/rpc/svc.h \
+                        tirpc/rpc/svc_dg.h \
+@@ -33,6 +44,13 @@ nobase_include_HEADERS = tirpc/netconfig.h \
+                        tirpc/rpc/auth.h \
+                        tirpc/rpc/auth_gss.h \
+                        tirpc/rpc/auth_des.h
+-    
++if XDR
++dist_xdr_HEADERS = $(XDR_FULL_HDRS)
++else
++dist_xdr_HEADERS = $(XDR_STUB_HDRS)
++endif
++
++EXTRA_DIST = $(XDR_FULL_HDRS) $(XDR_STUB_HDRS)
++
+ pkgconfigdir=$(libdir)/pkgconfig
+ pkgconfig_DATA = libtirpc.pc
+diff --git a/configure.ac b/configure.ac
+index ebafefc..16face3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -22,6 +22,19 @@ if test x$gss = xtrue; then
+       AC_MSG_ERROR([Unable to locate information required to use libgssglue.]))
+ fi
++# Should libtirpc include XDR routines (default=yes), or
++# expect that a system library provides suitable ones (no).
++AC_ARG_ENABLE([xdr],
++      [AS_HELP_STRING([--enable-xdr],
++              [Provide an XDR implementation (default=yes)])],
++      [case "${enableval}" in
++      yes) xdr=true ;;
++      no)  xdr=false ;;
++      *) AC_MSG_ERROR([bad value ${enableval} for --enable-xdr]) ;;
++      esac],[xdr=true])
++AM_CONDITIONAL(XDR, test x$xdr = xtrue)
++
++
+ AC_PROG_CC
+ AM_CONFIG_HEADER(config.h)
+ LT_INIT([win32-dll])
+@@ -39,6 +52,19 @@ AC_CHECK_HEADER([rpcsvc/nis.h],
+       [tirpc_has_nis=no])
+ AM_CONDITIONAL(HAVE_NIS, test x$tirpc_has_nis = xyes)
++if test x$xdr != xtrue; then
++      AC_CHECK_HEADER([rpc/xdr.h],
++              [tirpc_has_rpc_xdr_h=yes],
++              [tirpc_has_rpc_xdr_h=no])
++      AC_CHECK_HEADER([rpc/types.h],
++              [tirpc_has_rpc_types_h=yes],
++              [tirpc_has_rpc_types_h=no])
++      case x${tirpc_has_rpc_xdr_h},x${tirpc_has_rpc_types_h} in
++      xyes,xyes ) ;;
++      * ) AC_MSG_ERROR([Unable to locate system XDR headers]) ;;
++      esac
++fi
++
+ AC_CHECK_LIB([pthread], [pthread_create])
+ # Only add -lnsl if needed, for yp_match
+ AC_CHECK_FUNC([yp_match], , AC_CHECK_LIB([nsl], [yp_match]))
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 9bb2474..24a7c29 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -64,14 +64,19 @@ libtirpc_la_CFLAGS = $(AM_CFLAGS)
+ libtirpc_la_CPPFLAGS = $(AM_CPPFLAGS)
+ libtirpc_la_LIBADD = $(LIBS)
+-## XDR
+-libtirpc_la_SOURCES += $(XDR_SRCS)
+-
+ ## NIS
+ if HAVE_NIS
+ libtirpc_la_SOURCES += $(NIS_SRCS)
+ endif
++## XDR
++if XDR
++libtirpc_la_SOURCES += $(XDR_SRCS)
++INCLUDES += -I$(top_srcdir)/tirpc/xdr-full
++else
++INCLUDES += -I$(top_srcdir)/tirpc/xdr-stub
++endif
++
+ ## Secure-RPC
+ if GSS
+     libtirpc_la_SOURCES += $(GSS_SRCS)
+@@ -84,12 +89,16 @@ endif
+ ## libtirpc_a_SOURCES += netname.c netnamer.c rpcdname.c
+ ## libtirpc_a_SOURCES += rtime.c
+-libtirpc_la_DEPS = $(BASE_SRCS) $(XDR_SRCS)
++libtirpc_la_DEPS = $(BASE_SRCS)
+ if HAVE_NIS
+ libtirpc_la_DEPS += $(NIS_SRCS)
+ endif
++if XDR
++libtirpc_la_DEPS += $(XDR_SRCS)
++endif
++
+ if GSS
+ libtirpc_la_DEPS += $(GSS_SRCS)
+ endif
+diff --git a/tirpc/rpc/types.h b/tirpc/rpc/types.h
+deleted file mode 100644
+index d99a57b..0000000
+--- a/tirpc/rpc/types.h
++++ /dev/null
+@@ -1,110 +0,0 @@
+-/*    $NetBSD: types.h,v 1.13 2000/06/13 01:02:44 thorpej Exp $       */
+-
+-/*
+- * 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.
+- *
+- *    from: @(#)types.h 1.18 87/07/24 SMI
+- *    from: @(#)types.h       2.3 88/08/15 4.0 RPCSRC
+- * $FreeBSD: src/include/rpc/types.h,v 1.10.6.1 2003/12/18 00:59:50 peter Exp $
+- */
+-
+-/*
+- * Rpc additions to <sys/types.h>
+- */
+-#ifndef _TIRPC_TYPES_H
+-#define _TIRPC_TYPES_H
+-
+-#include <sys/types.h>
+-//#include <sys/_null.h>
+-
+-typedef int32_t bool_t;
+-typedef int32_t enum_t;
+-
+-typedef u_int32_t rpcprog_t;
+-typedef u_int32_t rpcvers_t;
+-typedef u_int32_t rpcproc_t;
+-typedef u_int32_t rpcprot_t;
+-typedef u_int32_t rpcport_t;
+-typedef   int32_t rpc_inline_t;
+-
+-#ifndef NULL
+-#     define NULL     0
+-#endif
+-#define __dontcare__  -1
+-
+-#ifndef FALSE
+-#     define FALSE    (0)
+-#endif
+-#ifndef TRUE
+-#     define TRUE     (1)
+-#endif
+-
+-#define mem_alloc(bsize)      calloc(1, bsize)
+-#define mem_free(ptr, bsize)  free(ptr)
+-
+-#include <sys/time.h>
+-#include <sys/param.h>
+-#include <stdlib.h>
+-#include <netconfig.h>
+-
+-/*
+- * The netbuf structure is defined here, because FreeBSD / NetBSD only use
+- * it inside the RPC code. It's in <xti.h> on SVR4, but it would be confusing
+- * to have an xti.h, since FreeBSD / NetBSD does not support XTI/TLI.
+- */
+-
+-/*
+- * The netbuf structure is used for transport-independent address storage.
+- */
+-struct netbuf {
+-  unsigned int maxlen;
+-  unsigned int len;
+-  void *buf;
+-};
+-
+-/*
+- * The format of the addres and options arguments of the XTI t_bind call.
+- * Only provided for compatibility, it should not be used.
+- */
+-
+-struct t_bind {
+-  struct netbuf   addr;
+-  unsigned int    qlen;
+-};
+-
+-/*
+- * Internal library and rpcbind use. This is not an exported interface, do
+- * not use.
+- */
+-struct __rpc_sockinfo {
+-      int si_af; 
+-      int si_proto;
+-      int si_socktype;
+-      int si_alen;
+-};
+-
+-#endif /* _TIRPC_TYPES_H */
+diff --git a/tirpc/rpc/xdr.h b/tirpc/rpc/xdr.h
+deleted file mode 100644
+index 3a6bc96..0000000
+--- a/tirpc/rpc/xdr.h
++++ /dev/null
+@@ -1,366 +0,0 @@
+-/*    $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $    */
+-
+-/*
+- * 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.
+- *
+- *    from: @(#)xdr.h 1.19 87/04/22 SMI
+- *    from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC
+- * $FreeBSD: src/include/rpc/xdr.h,v 1.23 2003/03/07 13:19:40 nectar Exp $
+- */
+-
+-/*
+- * xdr.h, External Data Representation Serialization Routines.
+- *
+- * Copyright (C) 1984, Sun Microsystems, Inc.
+- */
+-
+-#ifndef _TIRPC_XDR_H
+-#define _TIRPC_XDR_H
+-#include <sys/cdefs.h>
+-#include <stdio.h>
+-#include <netinet/in.h>
+-// Rajout pour la définition des types
+-#include <rpc/types.h>
+-
+-/*
+- * XDR provides a conventional way for converting between C data
+- * types and an external bit-string representation.  Library supplied
+- * routines provide for the conversion on built-in C data types.  These
+- * routines and utility routines defined here are used to help implement
+- * a type encode/decode routine for each user-defined type.
+- *
+- * Each data type provides a single procedure which takes two arguments:
+- *
+- *    bool_t
+- *    xdrproc(xdrs, argresp)
+- *            XDR *xdrs;
+- *            <type> *argresp;
+- *
+- * xdrs is an instance of a XDR handle, to which or from which the data
+- * type is to be converted.  argresp is a pointer to the structure to be
+- * converted.  The XDR handle contains an operation field which indicates
+- * which of the operations (ENCODE, DECODE * or FREE) is to be performed.
+- *
+- * XDR_DECODE may allocate space if the pointer argresp is null.  This
+- * data can be freed with the XDR_FREE operation.
+- *
+- * We write only one procedure per data type to make it easy
+- * to keep the encode and decode procedures for a data type consistent.
+- * In many cases the same code performs all operations on a user defined type,
+- * because all the hard work is done in the component type routines.
+- * decode as a series of calls on the nested data types.
+- */
+-
+-/*
+- * Xdr operations.  XDR_ENCODE causes the type to be encoded into the
+- * stream.  XDR_DECODE causes the type to be extracted from the stream.
+- * XDR_FREE can be used to release the space allocated by an XDR_DECODE
+- * request.
+- */
+-enum xdr_op {
+-      XDR_ENCODE=0,
+-      XDR_DECODE=1,
+-      XDR_FREE=2
+-};
+-
+-/*
+- * This is the number of bytes per unit of external data.
+- */
+-#define BYTES_PER_XDR_UNIT    (4)
+-#define RNDUP(x)  ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
+-                  * BYTES_PER_XDR_UNIT)
+-
+-/*
+- * The XDR handle.
+- * Contains operation which is being applied to the stream,
+- * an operations vector for the particular implementation (e.g. see xdr_mem.c),
+- * and two private fields for the use of the particular implementation.
+- */
+-typedef struct __rpc_xdr {
+-      enum xdr_op     x_op;           /* operation; fast additional param */
+-      const struct xdr_ops {
+-              /* get a long from underlying stream */
+-              bool_t  (*x_getlong)(struct __rpc_xdr *, long *);
+-              /* put a long to " */
+-              bool_t  (*x_putlong)(struct __rpc_xdr *, const long *);
+-              /* get some bytes from " */
+-              bool_t  (*x_getbytes)(struct __rpc_xdr *, char *, u_int);
+-              /* put some bytes to " */
+-              bool_t  (*x_putbytes)(struct __rpc_xdr *, const char *, u_int);
+-              /* returns bytes off from beginning */
+-              u_int   (*x_getpostn)(struct __rpc_xdr *);
+-              /* lets you reposition the stream */
+-              bool_t  (*x_setpostn)(struct __rpc_xdr *, u_int);
+-              /* buf quick ptr to buffered data */
+-              int32_t *(*x_inline)(struct __rpc_xdr *, u_int);
+-              /* free privates of this xdr_stream */
+-              void    (*x_destroy)(struct __rpc_xdr *);
+-              bool_t  (*x_control)(struct __rpc_xdr *, int, void *);
+-      } *x_ops;
+-      char *          x_public;       /* users' data */
+-      void *          x_private;      /* pointer to private data */
+-      char *          x_base;         /* private used for position info */
+-      u_int           x_handy;        /* extra private word */
+-} XDR;
+-
+-/*
+- * A xdrproc_t exists for each data type which is to be encoded or decoded.
+- *
+- * The second argument to the xdrproc_t is a pointer to an opaque pointer.
+- * The opaque pointer generally points to a structure of the data type
+- * to be decoded.  If this pointer is 0, then the type routines should
+- * allocate dynamic storage of the appropriate size and return it.
+- */
+-#ifdef _KERNEL
+-typedef       bool_t (*xdrproc_t)(XDR *, void *, u_int);
+-#else
+-/*
+- * XXX can't actually prototype it, because some take three args!!!
+- */
+-typedef       bool_t (*xdrproc_t)(XDR *, ...);
+-#endif
+-
+-/*
+- * Operations defined on a XDR handle
+- *
+- * XDR                *xdrs;
+- * long               *longp;
+- * char *      addr;
+- * u_int       len;
+- * u_int       pos;
+- */
+-#define XDR_GETLONG(xdrs, longp)                      \
+-      (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
+-#define xdr_getlong(xdrs, longp)                      \
+-      (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
+-
+-#define XDR_PUTLONG(xdrs, longp)                      \
+-      (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
+-#define xdr_putlong(xdrs, longp)                      \
+-      (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
+-
+-static __inline int
+-xdr_getint32(XDR *xdrs, int32_t *ip)
+-{
+-      long l;
+-
+-      if (!xdr_getlong(xdrs, &l))
+-              return (FALSE);
+-      *ip = (int32_t)l;
+-      return (TRUE);
+-}
+-
+-static __inline int
+-xdr_putint32(XDR *xdrs, int32_t *ip)
+-{
+-      long l;
+-
+-      l = (long)*ip;
+-      return xdr_putlong(xdrs, &l);
+-}
+-
+-#define XDR_GETINT32(xdrs, int32p)    xdr_getint32(xdrs, int32p)
+-#define XDR_PUTINT32(xdrs, int32p)    xdr_putint32(xdrs, int32p)
+-
+-#define XDR_GETBYTES(xdrs, addr, len)                 \
+-      (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
+-#define xdr_getbytes(xdrs, addr, len)                 \
+-      (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
+-
+-#define XDR_PUTBYTES(xdrs, addr, len)                 \
+-      (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
+-#define xdr_putbytes(xdrs, addr, len)                 \
+-      (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
+-
+-#define XDR_GETPOS(xdrs)                              \
+-      (*(xdrs)->x_ops->x_getpostn)(xdrs)
+-#define xdr_getpos(xdrs)                              \
+-      (*(xdrs)->x_ops->x_getpostn)(xdrs)
+-
+-#define XDR_SETPOS(xdrs, pos)                         \
+-      (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
+-#define xdr_setpos(xdrs, pos)                         \
+-      (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
+-
+-#define       XDR_INLINE(xdrs, len)                           \
+-      (*(xdrs)->x_ops->x_inline)(xdrs, len)
+-#define       xdr_inline(xdrs, len)                           \
+-      (*(xdrs)->x_ops->x_inline)(xdrs, len)
+-
+-#define       XDR_DESTROY(xdrs)                               \
+-      if ((xdrs)->x_ops->x_destroy)                   \
+-              (*(xdrs)->x_ops->x_destroy)(xdrs)
+-#define       xdr_destroy(xdrs)                               \
+-      if ((xdrs)->x_ops->x_destroy)                   \
+-              (*(xdrs)->x_ops->x_destroy)(xdrs)
+-
+-#define XDR_CONTROL(xdrs, req, op)                    \
+-      if ((xdrs)->x_ops->x_control)                   \
+-              (*(xdrs)->x_ops->x_control)(xdrs, req, op)
+-#define xdr_control(xdrs, req, op) XDR_CONTROL(xdrs, req, op)
+-
+-/*
+- * Solaris strips the '_t' from these types -- not sure why.
+- * But, let's be compatible.
+- */
+-#define xdr_rpcvers(xdrs, versp) xdr_u_int32(xdrs, versp)
+-#define xdr_rpcprog(xdrs, progp) xdr_u_int32(xdrs, progp)
+-#define xdr_rpcproc(xdrs, procp) xdr_u_int32(xdrs, procp)
+-#define xdr_rpcprot(xdrs, protp) xdr_u_int32(xdrs, protp)
+-#define xdr_rpcport(xdrs, portp) xdr_u_int32(xdrs, portp)
+-
+-/*
+- * Support struct for discriminated unions.
+- * You create an array of xdrdiscrim structures, terminated with
+- * an entry with a null procedure pointer.  The xdr_union routine gets
+- * the discriminant value and then searches the array of structures
+- * for a matching value.  If a match is found the associated xdr routine
+- * is called to handle that part of the union.  If there is
+- * no match, then a default routine may be called.
+- * If there is no match and no default routine it is an error.
+- */
+-#define NULL_xdrproc_t ((xdrproc_t)0)
+-struct xdr_discrim {
+-      int     value;
+-      xdrproc_t proc;
+-};
+-
+-/*
+- * In-line routines for fast encode/decode of primitive data types.
+- * Caveat emptor: these use single memory cycles to get the
+- * data from the underlying buffer, and will fail to operate
+- * properly if the data is not aligned.  The standard way to use these
+- * is to say:
+- *    if ((buf = XDR_INLINE(xdrs, count)) == NULL)
+- *            return (FALSE);
+- *    <<< macro calls >>>
+- * where ``count'' is the number of bytes of data occupied
+- * by the primitive data types.
+- *
+- * N.B. and frozen for all time: each data type here uses 4 bytes
+- * of external representation.
+- */
+-#define IXDR_GET_INT32(buf)           ((int32_t)ntohl((u_int32_t)*(buf)++))
+-#define IXDR_PUT_INT32(buf, v)                (*(buf)++ =(int32_t)htonl((u_int32_t)v))
+-#define IXDR_GET_U_INT32(buf)         ((u_int32_t)IXDR_GET_INT32(buf))
+-#define IXDR_PUT_U_INT32(buf, v)      IXDR_PUT_INT32((buf), ((int32_t)(v)))
+-
+-#define IXDR_GET_LONG(buf)            ((long)ntohl((u_int32_t)*(buf)++))
+-#define IXDR_PUT_LONG(buf, v)         (*(buf)++ =(int32_t)htonl((u_int32_t)v))
+-
+-#define IXDR_GET_BOOL(buf)            ((bool_t)IXDR_GET_LONG(buf))
+-#define IXDR_GET_ENUM(buf, t)         ((t)IXDR_GET_LONG(buf))
+-#define IXDR_GET_U_LONG(buf)          ((u_long)IXDR_GET_LONG(buf))
+-#define IXDR_GET_SHORT(buf)           ((short)IXDR_GET_LONG(buf))
+-#define IXDR_GET_U_SHORT(buf)         ((u_short)IXDR_GET_LONG(buf))
+-
+-#define IXDR_PUT_BOOL(buf, v)         IXDR_PUT_LONG((buf), (v))
+-#define IXDR_PUT_ENUM(buf, v)         IXDR_PUT_LONG((buf), (v))
+-#define IXDR_PUT_U_LONG(buf, v)               IXDR_PUT_LONG((buf), (v))
+-#define IXDR_PUT_SHORT(buf, v)                IXDR_PUT_LONG((buf), (v))
+-#define IXDR_PUT_U_SHORT(buf, v)      IXDR_PUT_LONG((buf), (v))
+-
+-/*
+- * These are the "generic" xdr routines.
+- */
+-__BEGIN_DECLS
+-extern bool_t xdr_void(void);
+-extern bool_t xdr_int(XDR *, int *);
+-extern bool_t xdr_u_int(XDR *, u_int *);
+-extern bool_t xdr_long(XDR *, long *);
+-extern bool_t xdr_u_long(XDR *, u_long *);
+-extern bool_t xdr_short(XDR *, short *);
+-extern bool_t xdr_u_short(XDR *, u_short *);
+-extern bool_t xdr_int16_t(XDR *, int16_t *);
+-extern bool_t xdr_u_int16_t(XDR *, u_int16_t *);
+-extern bool_t xdr_int32_t(XDR *, int32_t *);
+-extern bool_t xdr_u_int32_t(XDR *, u_int32_t *);
+-extern bool_t xdr_int64_t(XDR *, int64_t *);
+-extern bool_t xdr_u_int64_t(XDR *, u_int64_t *);
+-extern bool_t xdr_bool(XDR *, bool_t *);
+-extern bool_t xdr_enum(XDR *, enum_t *);
+-extern bool_t xdr_array(XDR *, char **, u_int *, u_int, u_int, xdrproc_t);
+-extern bool_t xdr_bytes(XDR *, char **, u_int *, u_int);
+-extern bool_t xdr_opaque(XDR *, char *, u_int);
+-extern bool_t xdr_string(XDR *, char **, u_int);
+-extern bool_t xdr_union(XDR *, enum_t *, char *, const struct xdr_discrim *, xdrproc_t);
+-extern bool_t xdr_char(XDR *, char *);
+-extern bool_t xdr_u_char(XDR *, u_char *);
+-extern bool_t xdr_vector(XDR *, char *, u_int, u_int, xdrproc_t);
+-extern bool_t xdr_float(XDR *, float *);
+-extern bool_t xdr_double(XDR *, double *);
+-extern bool_t xdr_quadruple(XDR *, long double *);
+-extern bool_t xdr_reference(XDR *, char **, u_int, xdrproc_t);
+-extern bool_t xdr_pointer(XDR *, char **, u_int, xdrproc_t);
+-extern bool_t xdr_wrapstring(XDR *, char **);
+-extern void   xdr_free(xdrproc_t, void *);
+-extern bool_t xdr_hyper(XDR *, quad_t *);
+-extern bool_t xdr_u_hyper(XDR *, u_quad_t *);
+-extern bool_t xdr_longlong_t(XDR *, quad_t *);
+-extern bool_t xdr_u_longlong_t(XDR *, u_quad_t *);
+-__END_DECLS
+-
+-/*
+- * Common opaque bytes objects used by many rpc protocols;
+- * declared here due to commonality.
+- */
+-#define MAX_NETOBJ_SZ 1024
+-struct netobj {
+-      u_int   n_len;
+-      char    *n_bytes;
+-};
+-typedef struct netobj netobj;
+-extern bool_t   xdr_netobj(XDR *, struct netobj *);
+-
+-/*
+- * These are the public routines for the various implementations of
+- * xdr streams.
+- */
+-__BEGIN_DECLS
+-/* XDR using memory buffers */
+-extern void   xdrmem_create(XDR *, char *, u_int, enum xdr_op);
+-
+-/* XDR using stdio library */
+-extern void   xdrstdio_create(XDR *, FILE *, enum xdr_op);
+-
+-/* XDR pseudo records for tcp */
+-extern void   xdrrec_create(XDR *, u_int, u_int, void *,
+-                          int (*)(void *, void *, int),
+-                          int (*)(void *, void *, int));
+-
+-/* make end of xdr record */
+-extern bool_t xdrrec_endofrecord(XDR *, int);
+-
+-/* move to beginning of next record */
+-extern bool_t xdrrec_skiprecord(XDR *);
+-
+-/* true if no more input */
+-extern bool_t xdrrec_eof(XDR *);
+-extern u_int xdrrec_readbytes(XDR *, caddr_t, u_int);
+-__END_DECLS
+-
+-#endif /* !_TIRPC_XDR_H */
+diff --git a/tirpc/xdr-full/rpc/types.h b/tirpc/xdr-full/rpc/types.h
+new file mode 100644
+index 0000000..d99a57b
+--- /dev/null
++++ b/tirpc/xdr-full/rpc/types.h
+@@ -0,0 +1,110 @@
++/*    $NetBSD: types.h,v 1.13 2000/06/13 01:02:44 thorpej Exp $       */
++
++/*
++ * 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.
++ *
++ *    from: @(#)types.h 1.18 87/07/24 SMI
++ *    from: @(#)types.h       2.3 88/08/15 4.0 RPCSRC
++ * $FreeBSD: src/include/rpc/types.h,v 1.10.6.1 2003/12/18 00:59:50 peter Exp $
++ */
++
++/*
++ * Rpc additions to <sys/types.h>
++ */
++#ifndef _TIRPC_TYPES_H
++#define _TIRPC_TYPES_H
++
++#include <sys/types.h>
++//#include <sys/_null.h>
++
++typedef int32_t bool_t;
++typedef int32_t enum_t;
++
++typedef u_int32_t rpcprog_t;
++typedef u_int32_t rpcvers_t;
++typedef u_int32_t rpcproc_t;
++typedef u_int32_t rpcprot_t;
++typedef u_int32_t rpcport_t;
++typedef   int32_t rpc_inline_t;
++
++#ifndef NULL
++#     define NULL     0
++#endif
++#define __dontcare__  -1
++
++#ifndef FALSE
++#     define FALSE    (0)
++#endif
++#ifndef TRUE
++#     define TRUE     (1)
++#endif
++
++#define mem_alloc(bsize)      calloc(1, bsize)
++#define mem_free(ptr, bsize)  free(ptr)
++
++#include <sys/time.h>
++#include <sys/param.h>
++#include <stdlib.h>
++#include <netconfig.h>
++
++/*
++ * The netbuf structure is defined here, because FreeBSD / NetBSD only use
++ * it inside the RPC code. It's in <xti.h> on SVR4, but it would be confusing
++ * to have an xti.h, since FreeBSD / NetBSD does not support XTI/TLI.
++ */
++
++/*
++ * The netbuf structure is used for transport-independent address storage.
++ */
++struct netbuf {
++  unsigned int maxlen;
++  unsigned int len;
++  void *buf;
++};
++
++/*
++ * The format of the addres and options arguments of the XTI t_bind call.
++ * Only provided for compatibility, it should not be used.
++ */
++
++struct t_bind {
++  struct netbuf   addr;
++  unsigned int    qlen;
++};
++
++/*
++ * Internal library and rpcbind use. This is not an exported interface, do
++ * not use.
++ */
++struct __rpc_sockinfo {
++      int si_af; 
++      int si_proto;
++      int si_socktype;
++      int si_alen;
++};
++
++#endif /* _TIRPC_TYPES_H */
+diff --git a/tirpc/xdr-full/rpc/xdr.h b/tirpc/xdr-full/rpc/xdr.h
+new file mode 100644
+index 0000000..3a6bc96
+--- /dev/null
++++ b/tirpc/xdr-full/rpc/xdr.h
+@@ -0,0 +1,366 @@
++/*    $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $    */
++
++/*
++ * 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.
++ *
++ *    from: @(#)xdr.h 1.19 87/04/22 SMI
++ *    from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC
++ * $FreeBSD: src/include/rpc/xdr.h,v 1.23 2003/03/07 13:19:40 nectar Exp $
++ */
++
++/*
++ * xdr.h, External Data Representation Serialization Routines.
++ *
++ * Copyright (C) 1984, Sun Microsystems, Inc.
++ */
++
++#ifndef _TIRPC_XDR_H
++#define _TIRPC_XDR_H
++#include <sys/cdefs.h>
++#include <stdio.h>
++#include <netinet/in.h>
++// Rajout pour la définition des types
++#include <rpc/types.h>
++
++/*
++ * XDR provides a conventional way for converting between C data
++ * types and an external bit-string representation.  Library supplied
++ * routines provide for the conversion on built-in C data types.  These
++ * routines and utility routines defined here are used to help implement
++ * a type encode/decode routine for each user-defined type.
++ *
++ * Each data type provides a single procedure which takes two arguments:
++ *
++ *    bool_t
++ *    xdrproc(xdrs, argresp)
++ *            XDR *xdrs;
++ *            <type> *argresp;
++ *
++ * xdrs is an instance of a XDR handle, to which or from which the data
++ * type is to be converted.  argresp is a pointer to the structure to be
++ * converted.  The XDR handle contains an operation field which indicates
++ * which of the operations (ENCODE, DECODE * or FREE) is to be performed.
++ *
++ * XDR_DECODE may allocate space if the pointer argresp is null.  This
++ * data can be freed with the XDR_FREE operation.
++ *
++ * We write only one procedure per data type to make it easy
++ * to keep the encode and decode procedures for a data type consistent.
++ * In many cases the same code performs all operations on a user defined type,
++ * because all the hard work is done in the component type routines.
++ * decode as a series of calls on the nested data types.
++ */
++
++/*
++ * Xdr operations.  XDR_ENCODE causes the type to be encoded into the
++ * stream.  XDR_DECODE causes the type to be extracted from the stream.
++ * XDR_FREE can be used to release the space allocated by an XDR_DECODE
++ * request.
++ */
++enum xdr_op {
++      XDR_ENCODE=0,
++      XDR_DECODE=1,
++      XDR_FREE=2
++};
++
++/*
++ * This is the number of bytes per unit of external data.
++ */
++#define BYTES_PER_XDR_UNIT    (4)
++#define RNDUP(x)  ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
++                  * BYTES_PER_XDR_UNIT)
++
++/*
++ * The XDR handle.
++ * Contains operation which is being applied to the stream,
++ * an operations vector for the particular implementation (e.g. see xdr_mem.c),
++ * and two private fields for the use of the particular implementation.
++ */
++typedef struct __rpc_xdr {
++      enum xdr_op     x_op;           /* operation; fast additional param */
++      const struct xdr_ops {
++              /* get a long from underlying stream */
++              bool_t  (*x_getlong)(struct __rpc_xdr *, long *);
++              /* put a long to " */
++              bool_t  (*x_putlong)(struct __rpc_xdr *, const long *);
++              /* get some bytes from " */
++              bool_t  (*x_getbytes)(struct __rpc_xdr *, char *, u_int);
++              /* put some bytes to " */
++              bool_t  (*x_putbytes)(struct __rpc_xdr *, const char *, u_int);
++              /* returns bytes off from beginning */
++              u_int   (*x_getpostn)(struct __rpc_xdr *);
++              /* lets you reposition the stream */
++              bool_t  (*x_setpostn)(struct __rpc_xdr *, u_int);
++              /* buf quick ptr to buffered data */
++              int32_t *(*x_inline)(struct __rpc_xdr *, u_int);
++              /* free privates of this xdr_stream */
++              void    (*x_destroy)(struct __rpc_xdr *);
++              bool_t  (*x_control)(struct __rpc_xdr *, int, void *);
++      } *x_ops;
++      char *          x_public;       /* users' data */
++      void *          x_private;      /* pointer to private data */
++      char *          x_base;         /* private used for position info */
++      u_int           x_handy;        /* extra private word */
++} XDR;
++
++/*
++ * A xdrproc_t exists for each data type which is to be encoded or decoded.
++ *
++ * The second argument to the xdrproc_t is a pointer to an opaque pointer.
++ * The opaque pointer generally points to a structure of the data type
++ * to be decoded.  If this pointer is 0, then the type routines should
++ * allocate dynamic storage of the appropriate size and return it.
++ */
++#ifdef _KERNEL
++typedef       bool_t (*xdrproc_t)(XDR *, void *, u_int);
++#else
++/*
++ * XXX can't actually prototype it, because some take three args!!!
++ */
++typedef       bool_t (*xdrproc_t)(XDR *, ...);
++#endif
++
++/*
++ * Operations defined on a XDR handle
++ *
++ * XDR                *xdrs;
++ * long               *longp;
++ * char *      addr;
++ * u_int       len;
++ * u_int       pos;
++ */
++#define XDR_GETLONG(xdrs, longp)                      \
++      (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
++#define xdr_getlong(xdrs, longp)                      \
++      (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
++
++#define XDR_PUTLONG(xdrs, longp)                      \
++      (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
++#define xdr_putlong(xdrs, longp)                      \
++      (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
++
++static __inline int
++xdr_getint32(XDR *xdrs, int32_t *ip)
++{
++      long l;
++
++      if (!xdr_getlong(xdrs, &l))
++              return (FALSE);
++      *ip = (int32_t)l;
++      return (TRUE);
++}
++
++static __inline int
++xdr_putint32(XDR *xdrs, int32_t *ip)
++{
++      long l;
++
++      l = (long)*ip;
++      return xdr_putlong(xdrs, &l);
++}
++
++#define XDR_GETINT32(xdrs, int32p)    xdr_getint32(xdrs, int32p)
++#define XDR_PUTINT32(xdrs, int32p)    xdr_putint32(xdrs, int32p)
++
++#define XDR_GETBYTES(xdrs, addr, len)                 \
++      (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
++#define xdr_getbytes(xdrs, addr, len)                 \
++      (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
++
++#define XDR_PUTBYTES(xdrs, addr, len)                 \
++      (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
++#define xdr_putbytes(xdrs, addr, len)                 \
++      (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
++
++#define XDR_GETPOS(xdrs)                              \
++      (*(xdrs)->x_ops->x_getpostn)(xdrs)
++#define xdr_getpos(xdrs)                              \
++      (*(xdrs)->x_ops->x_getpostn)(xdrs)
++
++#define XDR_SETPOS(xdrs, pos)                         \
++      (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
++#define xdr_setpos(xdrs, pos)                         \
++      (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
++
++#define       XDR_INLINE(xdrs, len)                           \
++      (*(xdrs)->x_ops->x_inline)(xdrs, len)
++#define       xdr_inline(xdrs, len)                           \
++      (*(xdrs)->x_ops->x_inline)(xdrs, len)
++
++#define       XDR_DESTROY(xdrs)                               \
++      if ((xdrs)->x_ops->x_destroy)                   \
++              (*(xdrs)->x_ops->x_destroy)(xdrs)
++#define       xdr_destroy(xdrs)                               \
++      if ((xdrs)->x_ops->x_destroy)                   \
++              (*(xdrs)->x_ops->x_destroy)(xdrs)
++
++#define XDR_CONTROL(xdrs, req, op)                    \
++      if ((xdrs)->x_ops->x_control)                   \
++              (*(xdrs)->x_ops->x_control)(xdrs, req, op)
++#define xdr_control(xdrs, req, op) XDR_CONTROL(xdrs, req, op)
++
++/*
++ * Solaris strips the '_t' from these types -- not sure why.
++ * But, let's be compatible.
++ */
++#define xdr_rpcvers(xdrs, versp) xdr_u_int32(xdrs, versp)
++#define xdr_rpcprog(xdrs, progp) xdr_u_int32(xdrs, progp)
++#define xdr_rpcproc(xdrs, procp) xdr_u_int32(xdrs, procp)
++#define xdr_rpcprot(xdrs, protp) xdr_u_int32(xdrs, protp)
++#define xdr_rpcport(xdrs, portp) xdr_u_int32(xdrs, portp)
++
++/*
++ * Support struct for discriminated unions.
++ * You create an array of xdrdiscrim structures, terminated with
++ * an entry with a null procedure pointer.  The xdr_union routine gets
++ * the discriminant value and then searches the array of structures
++ * for a matching value.  If a match is found the associated xdr routine
++ * is called to handle that part of the union.  If there is
++ * no match, then a default routine may be called.
++ * If there is no match and no default routine it is an error.
++ */
++#define NULL_xdrproc_t ((xdrproc_t)0)
++struct xdr_discrim {
++      int     value;
++      xdrproc_t proc;
++};
++
++/*
++ * In-line routines for fast encode/decode of primitive data types.
++ * Caveat emptor: these use single memory cycles to get the
++ * data from the underlying buffer, and will fail to operate
++ * properly if the data is not aligned.  The standard way to use these
++ * is to say:
++ *    if ((buf = XDR_INLINE(xdrs, count)) == NULL)
++ *            return (FALSE);
++ *    <<< macro calls >>>
++ * where ``count'' is the number of bytes of data occupied
++ * by the primitive data types.
++ *
++ * N.B. and frozen for all time: each data type here uses 4 bytes
++ * of external representation.
++ */
++#define IXDR_GET_INT32(buf)           ((int32_t)ntohl((u_int32_t)*(buf)++))
++#define IXDR_PUT_INT32(buf, v)                (*(buf)++ =(int32_t)htonl((u_int32_t)v))
++#define IXDR_GET_U_INT32(buf)         ((u_int32_t)IXDR_GET_INT32(buf))
++#define IXDR_PUT_U_INT32(buf, v)      IXDR_PUT_INT32((buf), ((int32_t)(v)))
++
++#define IXDR_GET_LONG(buf)            ((long)ntohl((u_int32_t)*(buf)++))
++#define IXDR_PUT_LONG(buf, v)         (*(buf)++ =(int32_t)htonl((u_int32_t)v))
++
++#define IXDR_GET_BOOL(buf)            ((bool_t)IXDR_GET_LONG(buf))
++#define IXDR_GET_ENUM(buf, t)         ((t)IXDR_GET_LONG(buf))
++#define IXDR_GET_U_LONG(buf)          ((u_long)IXDR_GET_LONG(buf))
++#define IXDR_GET_SHORT(buf)           ((short)IXDR_GET_LONG(buf))
++#define IXDR_GET_U_SHORT(buf)         ((u_short)IXDR_GET_LONG(buf))
++
++#define IXDR_PUT_BOOL(buf, v)         IXDR_PUT_LONG((buf), (v))
++#define IXDR_PUT_ENUM(buf, v)         IXDR_PUT_LONG((buf), (v))
++#define IXDR_PUT_U_LONG(buf, v)               IXDR_PUT_LONG((buf), (v))
++#define IXDR_PUT_SHORT(buf, v)                IXDR_PUT_LONG((buf), (v))
++#define IXDR_PUT_U_SHORT(buf, v)      IXDR_PUT_LONG((buf), (v))
++
++/*
++ * These are the "generic" xdr routines.
++ */
++__BEGIN_DECLS
++extern bool_t xdr_void(void);
++extern bool_t xdr_int(XDR *, int *);
++extern bool_t xdr_u_int(XDR *, u_int *);
++extern bool_t xdr_long(XDR *, long *);
++extern bool_t xdr_u_long(XDR *, u_long *);
++extern bool_t xdr_short(XDR *, short *);
++extern bool_t xdr_u_short(XDR *, u_short *);
++extern bool_t xdr_int16_t(XDR *, int16_t *);
++extern bool_t xdr_u_int16_t(XDR *, u_int16_t *);
++extern bool_t xdr_int32_t(XDR *, int32_t *);
++extern bool_t xdr_u_int32_t(XDR *, u_int32_t *);
++extern bool_t xdr_int64_t(XDR *, int64_t *);
++extern bool_t xdr_u_int64_t(XDR *, u_int64_t *);
++extern bool_t xdr_bool(XDR *, bool_t *);
++extern bool_t xdr_enum(XDR *, enum_t *);
++extern bool_t xdr_array(XDR *, char **, u_int *, u_int, u_int, xdrproc_t);
++extern bool_t xdr_bytes(XDR *, char **, u_int *, u_int);
++extern bool_t xdr_opaque(XDR *, char *, u_int);
++extern bool_t xdr_string(XDR *, char **, u_int);
++extern bool_t xdr_union(XDR *, enum_t *, char *, const struct xdr_discrim *, xdrproc_t);
++extern bool_t xdr_char(XDR *, char *);
++extern bool_t xdr_u_char(XDR *, u_char *);
++extern bool_t xdr_vector(XDR *, char *, u_int, u_int, xdrproc_t);
++extern bool_t xdr_float(XDR *, float *);
++extern bool_t xdr_double(XDR *, double *);
++extern bool_t xdr_quadruple(XDR *, long double *);
++extern bool_t xdr_reference(XDR *, char **, u_int, xdrproc_t);
++extern bool_t xdr_pointer(XDR *, char **, u_int, xdrproc_t);
++extern bool_t xdr_wrapstring(XDR *, char **);
++extern void   xdr_free(xdrproc_t, void *);
++extern bool_t xdr_hyper(XDR *, quad_t *);
++extern bool_t xdr_u_hyper(XDR *, u_quad_t *);
++extern bool_t xdr_longlong_t(XDR *, quad_t *);
++extern bool_t xdr_u_longlong_t(XDR *, u_quad_t *);
++__END_DECLS
++
++/*
++ * Common opaque bytes objects used by many rpc protocols;
++ * declared here due to commonality.
++ */
++#define MAX_NETOBJ_SZ 1024
++struct netobj {
++      u_int   n_len;
++      char    *n_bytes;
++};
++typedef struct netobj netobj;
++extern bool_t   xdr_netobj(XDR *, struct netobj *);
++
++/*
++ * These are the public routines for the various implementations of
++ * xdr streams.
++ */
++__BEGIN_DECLS
++/* XDR using memory buffers */
++extern void   xdrmem_create(XDR *, char *, u_int, enum xdr_op);
++
++/* XDR using stdio library */
++extern void   xdrstdio_create(XDR *, FILE *, enum xdr_op);
++
++/* XDR pseudo records for tcp */
++extern void   xdrrec_create(XDR *, u_int, u_int, void *,
++                          int (*)(void *, void *, int),
++                          int (*)(void *, void *, int));
++
++/* make end of xdr record */
++extern bool_t xdrrec_endofrecord(XDR *, int);
++
++/* move to beginning of next record */
++extern bool_t xdrrec_skiprecord(XDR *);
++
++/* true if no more input */
++extern bool_t xdrrec_eof(XDR *);
++extern u_int xdrrec_readbytes(XDR *, caddr_t, u_int);
++__END_DECLS
++
++#endif /* !_TIRPC_XDR_H */
+diff --git a/tirpc/xdr-stub/rpc/types.h b/tirpc/xdr-stub/rpc/types.h
+new file mode 100644
+index 0000000..bb062ed
+--- /dev/null
++++ b/tirpc/xdr-stub/rpc/types.h
+@@ -0,0 +1,87 @@
++/*    $NetBSD: types.h,v 1.13 2000/06/13 01:02:44 thorpej Exp $       */
++
++/*
++ * 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.
++ *
++ *    from: @(#)types.h 1.18 87/07/24 SMI
++ *    from: @(#)types.h       2.3 88/08/15 4.0 RPCSRC
++ * $FreeBSD: src/include/rpc/types.h,v 1.10.6.1 2003/12/18 00:59:50 peter Exp $
++ */
++
++/*
++ * TIRPC additions to <rpc/types.h> and <sys/types.h>
++ * Note that by using include_next, this variant is usable
++ * only when the compiler supports that extension. If this
++ * is a problem, then don't build libtirpc with --disable-xdr.
++ */
++#ifndef _TIRPC_STUB_TYPES_H
++#define _TIRPC_STUB_TYPES_H
++
++#include_next <rpc/types.h>
++
++#include <sys/time.h>
++#include <sys/param.h>
++#include <stdlib.h>
++#include <netconfig.h>
++
++/*
++ * The netbuf structure is defined here, because FreeBSD / NetBSD only use
++ * it inside the RPC code. It's in <xti.h> on SVR4, but it would be confusing
++ * to have an xti.h, since FreeBSD / NetBSD does not support XTI/TLI.
++ */
++
++/*
++ * The netbuf structure is used for transport-independent address storage.
++ */
++struct netbuf {
++  unsigned int maxlen;
++  unsigned int len;
++  void *buf;
++};
++
++/*
++ * The format of the addres and options arguments of the XTI t_bind call.
++ * Only provided for compatibility, it should not be used.
++ */
++
++struct t_bind {
++  struct netbuf   addr;
++  unsigned int    qlen;
++};
++
++/*
++ * Internal library and rpcbind use. This is not an exported interface, do
++ * not use.
++ */
++struct __rpc_sockinfo {
++      int si_af;
++      int si_proto;
++      int si_socktype;
++      int si_alen;
++};
++
++#endif /* _TIRPC_STUB_TYPES_H */
diff --git a/07-cygwin-specific-fixes.patch b/07-cygwin-specific-fixes.patch
new file mode 100644 (file)
index 0000000..eee187d
--- /dev/null
@@ -0,0 +1,63 @@
+diff --git a/src/authunix_prot.c b/src/authunix_prot.c
+index bf76a9d..62bdf37 100644
+--- a/src/authunix_prot.c
++++ b/src/authunix_prot.c
+@@ -56,10 +56,17 @@ xdr_authunix_parms(xdrs, p)
+       if (xdr_u_long(xdrs, &(p->aup_time))
+           && xdr_string(xdrs, &(p->aup_machname), MAX_MACHINE_NAME)
++#ifdef __CYGWIN__
++          && xdr_u_long(xdrs, &(p->aup_uid))
++          && xdr_u_long(xdrs, &(p->aup_gid))
++          && xdr_array(xdrs, (caddr_t *)&(p->aup_gids),
++                  &(p->aup_len), NGRPS, sizeof(unsigned long), (xdrproc_t)xdr_u_long) ) {
++#else
+           && xdr_u_int(xdrs, &(p->aup_uid))
+           && xdr_u_int(xdrs, &(p->aup_gid))
+           && xdr_array(xdrs, (caddr_t *)&(p->aup_gids),
+                   &(p->aup_len), NGRPS, sizeof(int), (xdrproc_t)xdr_int) ) {
++#endif
+               return (TRUE);
+       }
+       return (FALSE);
+diff --git a/src/bindresvport.c b/src/bindresvport.c
+index 6ce3e81..8c40183 100644
+--- a/src/bindresvport.c
++++ b/src/bindresvport.c
+@@ -58,7 +58,7 @@ bindresvport(sd, sin)
+         return bindresvport_sa(sd, (struct sockaddr *)sin);
+ }
+-#ifdef __linux__
++#if defined(__linux__) || defined(__CYGWIN__)
+ #define STARTPORT 600
+ #define LOWPORT 512
+diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
+index 4a3e96c..41b33f8 100644
+--- a/src/rpcb_clnt.c
++++ b/src/rpcb_clnt.c
+@@ -557,7 +557,11 @@ rpcb_set(program, version, nconf, address)
+        * completeness.  For non-unix platforms, perhaps some other
+        * string or an empty string can be sent.
+        */
++#ifdef __CYGWIN__
++      (void) snprintf(uidbuf, sizeof uidbuf, "%lu", geteuid());
++#else
+       (void) snprintf(uidbuf, sizeof uidbuf, "%d", geteuid());
++#endif
+       parms.r_owner = uidbuf;
+       CLNT_CALL(client, (rpcproc_t)RPCBPROC_SET, (xdrproc_t) xdr_rpcb,
+@@ -601,7 +605,11 @@ rpcb_unset(program, version, nconf)
+       }
+       /*LINTED const castaway*/
+       parms.r_addr = (char *) &nullstring[0];
++#ifdef __CYGWIN__
++      (void) snprintf(uidbuf, sizeof uidbuf, "%lu", geteuid());
++#else
+       (void) snprintf(uidbuf, sizeof uidbuf, "%d", geteuid());
++#endif
+       parms.r_owner = uidbuf;
+       CLNT_CALL(client, (rpcproc_t)RPCBPROC_UNSET, (xdrproc_t) xdr_rpcb,
diff --git a/08-misc.patch b/08-misc.patch
new file mode 100644 (file)
index 0000000..aafac19
--- /dev/null
@@ -0,0 +1,27 @@
+--- origsrc/libtirpc-0.2.1/src/getrpcent.c     2009-11-30 09:04:55.000000000 -0500
++++ src/libtirpc-0.2.1/src/getrpcent.c 2010-08-18 22:12:57.844600000 -0400
+@@ -87,7 +87,6 @@ _rpcdata()
+       return (d);
+ }
+-#ifdef GQ
+ struct rpcent *
+ getrpcbynumber(number)
+       int number;
+@@ -136,7 +135,7 @@ no_yp:
+ struct rpcent *
+ getrpcbyname(name)
+-      char *name;
++      const char *name;
+ {
+       struct rpcent *rpc = NULL;
+       char **rp;
+@@ -156,7 +155,6 @@ done:
+       endrpcent();
+       return (rpc);
+ }
+-#endif /* GQ */
+ void
+ setrpcent(f)
diff --git a/libtirpc.cygport b/libtirpc.cygport
new file mode 100644 (file)
index 0000000..60541be
--- /dev/null
@@ -0,0 +1,34 @@
+NAME="libtirpc"
+VERSION=0.2.1
+RELEASE=1
+CATEGORY="Libs"
+SUMMARY="A port of Sun's Transport-Independent RPC library"
+DESCRIPTION="TI-RPC provides a library that implements Transport Independent
+Remote Procedure Calls. It supports RPCs over IPv4, IPv6, as well as local
+unix sockets."
+HOMEPAGE="http://libtirpc.sourceforge.net"
+SRC_URI="mirror://sourceforge/libtirpc/${NAME}-${VERSION}.tar.bz2"
+PATCH_URI="
+       01-thread_key_t-warnings.patch
+       02-silence-more-warnings.patch
+       03-make-install-with-out-of-sourcetree-builds.patch
+       04-Clean-up-and-modernize-autotool-usage.patch
+       05-Make-NIS-support-optional.patch
+       06-Allow-using-system-XDR-implementation.patch
+       07-cygwin-specific-fixes.patch
+       08-misc.patch
+"
+
+PKG_NAMES="${NAME}1 ${NAME}-common ${NAME}-devel"
+libtirpc1_REQUIRES="libtirpc-common"
+libtirpc1_CONTENTS="usr/bin/cygtirpc-1.dll"
+libtirpc_common_CONTENTS="etc/ usr/share/doc/ usr/share/man/man5/"
+libtirpc_devel_CONTENTS="usr/include/ usr/lib/ usr/share/man/man3/"
+
+CYGCONF_ARGS="--disable-xdr"
+
+src_install () {
+       cd ${B}
+       cyginstall
+       make_etc_defaults /etc/netconfig
+}
This page took 0.05347 seconds and 5 git commands to generate.