Blame SOURCES/rpcbind-0.2.0-systemd-socket.patch

bec77d
diff -up rpcbind-0.2.0/configure.ac.orig rpcbind-0.2.0/configure.ac
bec77d
--- rpcbind-0.2.0/configure.ac.orig	2015-05-04 08:15:10.394432254 -0400
bec77d
+++ rpcbind-0.2.0/configure.ac	2015-05-04 08:48:36.463258254 -0400
bec77d
@@ -36,6 +36,18 @@ AC_SUBST([nss_modules], [$with_nss_modul
bec77d
 
bec77d
 PKG_CHECK_MODULES([TIRPC], [libtirpc])
bec77d
 
bec77d
+PKG_PROG_PKG_CONFIG
bec77d
+AC_ARG_WITH([systemdsystemunitdir],
bec77d
+  AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
bec77d
+  [], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
bec77d
+  if test "x$with_systemdsystemunitdir" != xno; then
bec77d
+    AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
bec77d
+     PKG_CHECK_MODULES([SYSTEMD], [libsystemd], [],
bec77d
+	   [PKG_CHECK_MODULES([SYSTEMD], [libsystemd-daemon], [],
bec77d
+	   AC_MSG_ERROR([libsystemd support requested but found]))])
bec77d
+  fi
bec77d
+AM_CONDITIONAL(SYSTEMD, [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ])
bec77d
+
bec77d
 AS_IF([test x$enable_libwrap = xyes], [
bec77d
 	AC_CHECK_LIB([wrap], [hosts_access], ,
bec77d
 		AC_MSG_ERROR([libwrap support requested but unable to find libwrap]))
bec77d
diff -up rpcbind-0.2.0/Makefile.am.orig rpcbind-0.2.0/Makefile.am
bec77d
--- rpcbind-0.2.0/Makefile.am.orig	2015-05-04 08:15:10.394432254 -0400
bec77d
+++ rpcbind-0.2.0/Makefile.am	2015-05-04 08:48:36.463258254 -0400
bec77d
@@ -39,6 +39,12 @@ rpcbind_SOURCES = \
bec77d
 	src/warmstart.c
bec77d
 rpcbind_LDADD = $(TIRPC_LIBS)
bec77d
 
bec77d
+if SYSTEMD
bec77d
+AM_CPPFLAGS += $(SYSTEMD_CFLAGS) -DSYSTEMD
bec77d
+
bec77d
+rpcbind_LDADD += $(SYSTEMD_LIBS)
bec77d
+endif
bec77d
+
bec77d
 rpcinfo_SOURCES =       src/rpcinfo.c
bec77d
 rpcinfo_LDADD   =       $(TIRPC_LIBS)
bec77d
 
bec77d
diff -up rpcbind-0.2.0/src/rpcbind.c.orig rpcbind-0.2.0/src/rpcbind.c
bec77d
--- rpcbind-0.2.0/src/rpcbind.c.orig	2015-05-04 08:15:10.394432254 -0400
bec77d
+++ rpcbind-0.2.0/src/rpcbind.c	2015-05-04 08:48:36.463258254 -0400
bec77d
@@ -56,6 +56,9 @@
bec77d
 #include <netinet/in.h>
bec77d
 #endif
bec77d
 #include <arpa/inet.h>
bec77d
+#ifdef SYSTEMD
bec77d
+#include <systemd/sd-daemon.h>
bec77d
+#endif
bec77d
 #include <fcntl.h>
bec77d
 #include <netdb.h>
bec77d
 #include <stdio.h>
bec77d
@@ -291,6 +294,7 @@ init_transport(struct netconfig *nconf)
bec77d
 	u_int32_t host_addr[4];  /* IPv4 or IPv6 */
bec77d
 	struct sockaddr_un sun;
bec77d
 	mode_t oldmask;
bec77d
+	int n;
bec77d
         res = NULL;
bec77d
 
bec77d
 	if ((nconf->nc_semantics != NC_TPI_CLTS) &&
bec77d
@@ -309,6 +313,76 @@ init_transport(struct netconfig *nconf)
bec77d
 			fprintf(stderr, "[%d] - %s\n", i, *s);
bec77d
 	}
bec77d
 #endif
bec77d
+	if (!__rpc_nconf2sockinfo(nconf, &si)) {
bec77d
+		syslog(LOG_ERR, "cannot get information for %s",
bec77d
+		    nconf->nc_netid);
bec77d
+		return (1);
bec77d
+	}
bec77d
+
bec77d
+#ifdef SYSTEMD
bec77d
+	n = sd_listen_fds(0);
bec77d
+	if (n < 0) {
bec77d
+		syslog(LOG_ERR, "failed to acquire systemd sockets: %s", strerror(-n));
bec77d
+		return 1;
bec77d
+	}
bec77d
+
bec77d
+	/* Try to find if one of the systemd sockets we were given match
bec77d
+	 * our netconfig structure. */
bec77d
+
bec77d
+	for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
bec77d
+		struct __rpc_sockinfo si_other;
bec77d
+		union {
bec77d
+			struct sockaddr sa;
bec77d
+			struct sockaddr_un un;
bec77d
+			struct sockaddr_in in4;
bec77d
+			struct sockaddr_in6 in6;
bec77d
+			struct sockaddr_storage storage;
bec77d
+		} sa;
bec77d
+		socklen_t addrlen = sizeof(sa);
bec77d
+
bec77d
+		if (!__rpc_fd2sockinfo(fd, &si_other)) {
bec77d
+			syslog(LOG_ERR, "cannot get information for fd %i", fd);
bec77d
+			return 1;
bec77d
+		}
bec77d
+
bec77d
+		if (si.si_af != si_other.si_af ||
bec77d
+                    si.si_socktype != si_other.si_socktype ||
bec77d
+                    si.si_proto != si_other.si_proto)
bec77d
+			continue;
bec77d
+
bec77d
+		if (getsockname(fd, &sa.sa, &addrlen) < 0) {
bec77d
+			syslog(LOG_ERR, "failed to query socket name: %s",
bec77d
+                               strerror(errno));
bec77d
+			goto error;
bec77d
+		}
bec77d
+
bec77d
+		/* Copy the address */
bec77d
+		taddr.addr.maxlen = taddr.addr.len = addrlen;
bec77d
+		taddr.addr.buf = malloc(addrlen);
bec77d
+		if (taddr.addr.buf == NULL) {
bec77d
+			syslog(LOG_ERR,
bec77d
+                               "cannot allocate memory for %s address",
bec77d
+                               nconf->nc_netid);
bec77d
+			goto error;
bec77d
+		}
bec77d
+		memcpy(taddr.addr.buf, &sa, addrlen);
bec77d
+
bec77d
+		my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr,
bec77d
+                          RPC_MAXDATASIZE, RPC_MAXDATASIZE);
bec77d
+		if (my_xprt == (SVCXPRT *)NULL) {
bec77d
+			syslog(LOG_ERR, "%s: could not create service",
bec77d
+                               nconf->nc_netid);
bec77d
+			goto error;
bec77d
+		}
bec77d
+	}
bec77d
+
bec77d
+	/*
bec77d
+	 * If none of the systemd sockets matched, we set up the socket in
bec77d
+	 * the normal way:
bec77d
+	 */
bec77d
+#endif
bec77d
+	if (my_xprt != NULL)
bec77d
+		goto got_socket;
bec77d
 
bec77d
 	/*
bec77d
 	 * XXX - using RPC library internal functions. For NC_TPI_CLTS
bec77d
@@ -322,12 +396,6 @@ init_transport(struct netconfig *nconf)
bec77d
 		}
bec77d
 	}
bec77d
 
bec77d
-	if (!__rpc_nconf2sockinfo(nconf, &si)) {
bec77d
-		syslog(LOG_ERR, "cannot get information for %s",
bec77d
-		    nconf->nc_netid);
bec77d
-		return (1);
bec77d
-	}
bec77d
-
bec77d
 	if ((strcmp(nconf->nc_netid, "local") == 0) ||
bec77d
 	    (strcmp(nconf->nc_netid, "unix") == 0)) {
bec77d
 		memset(&sun, 0, sizeof sun);
bec77d
@@ -564,6 +632,7 @@ init_transport(struct netconfig *nconf)
bec77d
 			goto error;
bec77d
 		}
bec77d
 	}
bec77d
+got_socket:
bec77d
 
bec77d
 #ifdef PORTMAP
bec77d
 	/*