This is a combination of two patches: 1) Taken from https://salsa.debian.org/debian/libtirpc/-/raw/master/debian/patches/03-kfreebsd.diff Description: Fix build on non Linux architectures Author: Andreas Beckmann Last-Update: 2019-09-01 2) Taken from https://salsa.debian.org/debian/libtirpc/-/raw/master/debian/patches/05-hurd-port.diff Description: Get source building on Hurd - Look for before using it. - Define MAXHOSTNAMELEN to 64 if missing. - Bind sockets on Hurd like on Linux. Author: Petter Reinholdtsen --- a/src/svc_dg.c +++ b/src/svc_dg.c @@ -648,6 +648,7 @@ void svc_dg_enable_pktinfo(int fd, const struct __rpc_sockinfo *si) { +#ifdef __linux__ int val = 1; switch (si->si_af) { @@ -660,6 +661,7 @@ break; #endif } +#endif } /* @@ -670,6 +672,7 @@ int svc_dg_valid_pktinfo(struct msghdr *msg) { +#ifdef __linux__ struct cmsghdr *cmsg; if (!msg->msg_name) @@ -716,4 +719,7 @@ } return 1; +#else + return 0; +#endif } --- a/src/clnt_vc.c +++ b/src/clnt_vc.c @@ -71,10 +71,12 @@ #define MCALL_MSG_SIZE 24 #define CMGROUP_MAX 16 -#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */ #undef rpc_createerr /* make it clear it is a thread safe variable */ +#ifndef SCM_CREDS +#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */ + /* * Credentials structure, used to verify the identity of a peer * process that has sent us a message. This is allocated by the @@ -90,6 +92,7 @@ short cmcred_ngroups; /* number or groups */ gid_t cmcred_groups[CMGROUP_MAX]; /* groups */ }; +#endif struct cmessage { struct cmsghdr cmsg; --- a/src/getpeereid.c +++ b/src/getpeereid.c @@ -25,9 +25,14 @@ */ +#include "config.h" + #include #include #include +#ifdef HAVE_SYS_USER_H +# include +#endif /* HAVE_SYS_USER_H */ #include #include --- a/src/getpeereid.c +++ b/src/getpeereid.c @@ -35,12 +36,25 @@ int getpeereid(int s, uid_t *euid, gid_t *egid) { +#ifndef HAVE_SYS_USER_H + return(-1); +#else +#ifdef XUCRED_VERSION + struct xucred uc; +#define uid cr_uid +#define gid cr_gid +#else struct ucred uc; +#endif socklen_t uclen; int error; uclen = sizeof(uc); +#ifdef XUCRED_VERSION + error = getsockopt(s, 0, LOCAL_PEERCRED, &uc, &uclen); +#else error = getsockopt(s, SOL_SOCKET, SO_PEERCRED, &uc, &uclen); /* SCM_CREDENTIALS */ +#endif if (error != 0) return (error); // if (uc.cr_version != XUCRED_VERSION) @@ -59,4 +66,5 @@ *euid = uc.uid; *egid = uc.gid; return (0); +#endif /* HAVE_SYS_USER_H */ } --- a/tirpc/reentrant.h +++ b/tirpc/reentrant.h @@ -36,7 +36,7 @@ * These definitions are only guaranteed to be valid on Linux. */ -#if defined(__linux__) +#if defined(__linux__) || defined(__GLIBC__) #include --- a/configure.ac +++ b/configure.ac @@ -93,7 +93,7 @@ AC_PROG_LIBTOOL 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 features.h gssapi/gssapi_ext.h]) +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 features.h gssapi/gssapi_ext.h sys/user.h]) AC_CHECK_LIB([pthread], [pthread_create]) AC_CHECK_FUNCS([getrpcbyname getrpcbynumber setrpcent endrpcent getrpcent]) --- a/src/auth_unix.c +++ b/src/auth_unix.c @@ -56,6 +56,11 @@ #include #include +/* Workaround for Hurd */ +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 64 +#endif + /* auth_unix.c */ static void authunix_nextverf (AUTH *); static bool_t authunix_marshal (AUTH *, XDR *); --- a/src/bindresvport.c +++ b/src/bindresvport.c @@ -64,7 +64,7 @@ return bindresvport_sa(sd, (struct sockaddr *)sin); } -#ifdef __linux__ +#if defined(__linux__) || defined(__GNU__) #define STARTPORT 600 #define LOWPORT 512