Accepting request 104050 from network
Automatic submission by obs-autosubmit OBS-URL: https://build.opensuse.org/request/show/104050 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/rpcbind?expand=0&rev=24
This commit is contained in:
commit
97ddcc9401
731
0001-systemd-add-support-for-system-bus-activation.patch
Normal file
731
0001-systemd-add-support-for-system-bus-activation.patch
Normal file
@ -0,0 +1,731 @@
|
||||
Delivered-To: cr@cristianrodriguez.net
|
||||
Received: by 10.180.126.41 with SMTP id mv9cs133382wib;
|
||||
Thu, 22 Dec 2011 17:05:49 -0800 (PST)
|
||||
Received: by 10.213.15.203 with SMTP id l11mr2621843eba.5.1324602347791;
|
||||
Thu, 22 Dec 2011 17:05:47 -0800 (PST)
|
||||
Return-Path: <teg@jklm.no>
|
||||
Received: from mx2.suse.de (cantor2.suse.de. [195.135.220.15])
|
||||
by mx.google.com with ESMTPS id q2si6918918eef.172.2011.12.22.17.05.47
|
||||
(version=TLSv1/SSLv3 cipher=OTHER);
|
||||
Thu, 22 Dec 2011 17:05:47 -0800 (PST)
|
||||
Received-SPF: softfail (google.com: domain of transitioning teg@jklm.no does not designate 195.135.220.15 as permitted sender) client-ip=195.135.220.15;
|
||||
Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning teg@jklm.no does not designate 195.135.220.15 as permitted sender) smtp.mail=teg@jklm.no
|
||||
Received: from mail-lpp01m010-f48.google.com (mail-lpp01m010-f48.google.com [209.85.215.48])
|
||||
(using TLSv1 with cipher RC4-SHA (128/128 bits))
|
||||
(No client certificate requested)
|
||||
by mx2.suse.de (Postfix) with ESMTP id 3ACC28738D
|
||||
for <crrodriguez@opensuse.org>; Fri, 23 Dec 2011 02:05:46 +0100 (CET)
|
||||
Received: by laam7 with SMTP id m7so4957545laa.35
|
||||
for <crrodriguez@opensuse.org>; Thu, 22 Dec 2011 17:05:45 -0800 (PST)
|
||||
Received: by 10.152.110.6 with SMTP id hw6mr10613571lab.37.1324602344510;
|
||||
Thu, 22 Dec 2011 17:05:44 -0800 (PST)
|
||||
Received: from localhost.localdomain (cm-84.212.224.43.getinternet.no. [84.212.224.43])
|
||||
by mx.google.com with ESMTPS id 5sm9033897lah.0.2011.12.22.17.05.42
|
||||
(version=TLSv1/SSLv3 cipher=OTHER);
|
||||
Thu, 22 Dec 2011 17:05:43 -0800 (PST)
|
||||
From: Tom Gundersen <teg@jklm.no>
|
||||
To: linux-nfs@vger.kernel.org
|
||||
Cc: Tom Gundersen <teg@jklm.no>, Steve Dickson <steved@redhat.com>,
|
||||
systemd-devel@lists.freedesktop.org,
|
||||
=?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
|
||||
Subject: [PATCH] rpcbind: add support for systemd socket activation
|
||||
Date: Fri, 23 Dec 2011 02:05:27 +0100
|
||||
Message-Id: <1324602327-1789-1-git-send-email-teg@jklm.no>
|
||||
X-Mailer: git-send-email 1.7.8
|
||||
In-Reply-To: <4EEFCBF0.1070407@opensuse.org>
|
||||
References: <4EEFCBF0.1070407@opensuse.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Making rpcbind sockect activated will greatly simplify
|
||||
its integration in systemd systems. In essence, other services
|
||||
may now assume that rpcbind is always available, even during very
|
||||
early boot. This means that we no longer need to worry about any
|
||||
ordering dependencies.
|
||||
|
||||
This is based on a patch originally posted by Lennart Poettering:
|
||||
<http://permalink.gmane.org/gmane.linux.nfs/33774>.
|
||||
|
||||
That patch was not merged due to the lack of a shared library and
|
||||
as systemd was seen to be too Fedora specific.
|
||||
|
||||
Systemd now provides a shared library, and it is shipped by defalt in
|
||||
OpenSUSE in addition to Fedora, and it is available in Debain, Gentoo,
|
||||
Arch, and others.
|
||||
|
||||
This version of the patch has three changes from the original:
|
||||
|
||||
* It uses the shared library.
|
||||
* It comes with unit files.
|
||||
* It is rebased on top of master.
|
||||
|
||||
Please review the patch with "git show -b" or otherwise ignoring the
|
||||
whitespace changes, or it will be extremely difficult to read.
|
||||
|
||||
Comments welcome.
|
||||
|
||||
v2: correctly enable systemd code at compile time
|
||||
handle the case where not all the required sockets were supplied
|
||||
listen on udp/tcp port 111 in addition to /var/run/rpcbind.sock
|
||||
do not daemonize
|
||||
|
||||
Original-patch-by: Lennart Poettering <lennart@poettering.net>
|
||||
Cc: Steve Dickson <steved@redhat.com>
|
||||
Cc: systemd-devel@lists.freedesktop.org
|
||||
Cc: Cristian Rodríguez <crrodriguez@opensuse.org>
|
||||
Signed-off-by: Tom Gundersen <teg@jklm.no>
|
||||
---
|
||||
|
||||
Thanks to Cristian for testing. The testcase I had been using was entirely flawed,
|
||||
the code did in fact not work at all. Sorry about that!
|
||||
|
||||
This time around it should work :-)
|
||||
|
||||
Makefile.am | 15 ++
|
||||
configure.in | 11 +
|
||||
src/rpcbind.c | 467 +++++++++++++++++++++++++-------------------
|
||||
systemd/.gitignore | 1 +
|
||||
systemd/rpcbind.service.in | 9 +
|
||||
systemd/rpcbind.socket | 12 ++
|
||||
6 files changed, 316 insertions(+), 199 deletions(-)
|
||||
create mode 100644 systemd/.gitignore
|
||||
create mode 100644 systemd/rpcbind.service.in
|
||||
create mode 100644 systemd/rpcbind.socket
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 9fa608e..194b467 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -38,6 +38,21 @@ rpcbind_SOURCES = \
|
||||
src/warmstart.c
|
||||
rpcbind_LDADD = $(TIRPC_LIBS)
|
||||
|
||||
+if SYSTEMD
|
||||
+AM_CPPFLAGS += $(SYSTEMD_CFLAGS) -DSYSTEMD
|
||||
+
|
||||
+rpcbind_LDADD += $(SYSTEMD_LIBS)
|
||||
+
|
||||
+systemd/rpcbind.service: systemd/rpcbind.service.in Makefile
|
||||
+ sed -e 's,@bindir\@,$(bindir),g' \
|
||||
+ < $< > $@ || rm $@
|
||||
+
|
||||
+systemdsystemunit_DATA = \
|
||||
+ systemd/rpcbind.service \
|
||||
+ systemd/rpcbind.socket
|
||||
+
|
||||
+endif
|
||||
+
|
||||
rpcinfo_SOURCES = src/rpcinfo.c
|
||||
rpcinfo_LDADD = $(TIRPC_LIBS)
|
||||
|
||||
diff --git a/configure.in b/configure.in
|
||||
index 2b67720..397d52d 100644
|
||||
--- a/configure.in
|
||||
+++ b/configure.in
|
||||
@@ -29,6 +29,17 @@ AC_SUBST([rpcuser], [$with_rpcuser])
|
||||
|
||||
PKG_CHECK_MODULES([TIRPC], [libtirpc])
|
||||
|
||||
+PKG_PROG_PKG_CONFIG
|
||||
+AC_ARG_WITH([systemdsystemunitdir],
|
||||
+ AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
|
||||
+ [], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
|
||||
+ if test "x$with_systemdsystemunitdir" != xno; then
|
||||
+ AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
|
||||
+ PKG_CHECK_MODULES([SYSTEMD], [libsystemd-daemon])
|
||||
+ fi
|
||||
+AM_CONDITIONAL(SYSTEMD, [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ])
|
||||
+
|
||||
+
|
||||
AS_IF([test x$enable_libwrap = xyes], [
|
||||
AC_CHECK_LIB([wrap], [hosts_access], ,
|
||||
AC_MSG_ERROR([libwrap support requested but unable to find libwrap]))
|
||||
diff --git a/src/rpcbind.c b/src/rpcbind.c
|
||||
index 24e069b..a87ce05 100644
|
||||
--- a/src/rpcbind.c
|
||||
+++ b/src/rpcbind.c
|
||||
@@ -56,6 +56,9 @@
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#include <arpa/inet.h>
|
||||
+#ifdef SYSTEMD
|
||||
+#include <systemd/sd-daemon.h>
|
||||
+#endif
|
||||
#include <fcntl.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
@@ -281,6 +284,7 @@ init_transport(struct netconfig *nconf)
|
||||
u_int32_t host_addr[4]; /* IPv4 or IPv6 */
|
||||
struct sockaddr_un sun;
|
||||
mode_t oldmask;
|
||||
+ int n = 0;
|
||||
res = NULL;
|
||||
|
||||
if ((nconf->nc_semantics != NC_TPI_CLTS) &&
|
||||
@@ -300,141 +304,285 @@ init_transport(struct netconfig *nconf)
|
||||
}
|
||||
#endif
|
||||
|
||||
- /*
|
||||
- * XXX - using RPC library internal functions. For NC_TPI_CLTS
|
||||
- * we call this later, for each socket we like to bind.
|
||||
- */
|
||||
- if (nconf->nc_semantics != NC_TPI_CLTS) {
|
||||
- if ((fd = __rpc_nconf2fd(nconf)) < 0) {
|
||||
- syslog(LOG_ERR, "cannot create socket for %s",
|
||||
- nconf->nc_netid);
|
||||
- return (1);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
if (!__rpc_nconf2sockinfo(nconf, &si)) {
|
||||
syslog(LOG_ERR, "cannot get information for %s",
|
||||
nconf->nc_netid);
|
||||
return (1);
|
||||
}
|
||||
|
||||
- if ((strcmp(nconf->nc_netid, "local") == 0) ||
|
||||
- (strcmp(nconf->nc_netid, "unix") == 0)) {
|
||||
- memset(&sun, 0, sizeof sun);
|
||||
- sun.sun_family = AF_LOCAL;
|
||||
- unlink(_PATH_RPCBINDSOCK);
|
||||
- strcpy(sun.sun_path, _PATH_RPCBINDSOCK);
|
||||
- addrlen = SUN_LEN(&sun);
|
||||
- sa = (struct sockaddr *)&sun;
|
||||
- } else {
|
||||
- /* Get rpcbind's address on this transport */
|
||||
-
|
||||
- memset(&hints, 0, sizeof hints);
|
||||
- hints.ai_flags = AI_PASSIVE;
|
||||
- hints.ai_family = si.si_af;
|
||||
- hints.ai_socktype = si.si_socktype;
|
||||
- hints.ai_protocol = si.si_proto;
|
||||
+#ifdef SYSTEMD
|
||||
+ n = sd_listen_fds(0);
|
||||
+ if (n < 0) {
|
||||
+ syslog(LOG_ERR, "failed to acquire systemd scokets: %s", strerror(-n));
|
||||
+ return 1;
|
||||
}
|
||||
- if (nconf->nc_semantics == NC_TPI_CLTS) {
|
||||
- /*
|
||||
- * If no hosts were specified, just bind to INADDR_ANY. Otherwise
|
||||
- * make sure 127.0.0.1 is added to the list.
|
||||
- */
|
||||
- nhostsbak = nhosts;
|
||||
- nhostsbak++;
|
||||
- hosts = realloc(hosts, nhostsbak * sizeof(char *));
|
||||
- if (nhostsbak == 1)
|
||||
- hosts[0] = "*";
|
||||
- else {
|
||||
- if (hints.ai_family == AF_INET) {
|
||||
- hosts[nhostsbak - 1] = "127.0.0.1";
|
||||
- } else if (hints.ai_family == AF_INET6) {
|
||||
- hosts[nhostsbak - 1] = "::1";
|
||||
- } else
|
||||
- return 1;
|
||||
+
|
||||
+ /* Try to find if one of the systemd sockets we were given match
|
||||
+ * our netconfig structure. */
|
||||
+
|
||||
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
|
||||
+ struct __rpc_sockinfo si_other;
|
||||
+ union {
|
||||
+ struct sockaddr sa;
|
||||
+ struct sockaddr_un un;
|
||||
+ struct sockaddr_in in4;
|
||||
+ struct sockaddr_in6 in6;
|
||||
+ struct sockaddr_storage storage;
|
||||
+ } sa;
|
||||
+ socklen_t addrlen = sizeof(sa);
|
||||
+
|
||||
+ if (!__rpc_fd2sockinfo(fd, &si_other)) {
|
||||
+ syslog(LOG_ERR, "cannot get information for fd %i", fd);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * Bind to specific IPs if asked to
|
||||
- */
|
||||
- checkbind = 0;
|
||||
- while (nhostsbak > 0) {
|
||||
- --nhostsbak;
|
||||
- /*
|
||||
- * XXX - using RPC library internal functions.
|
||||
- */
|
||||
+ if (si.si_af != si_other.si_af ||
|
||||
+ si.si_socktype != si_other.si_socktype ||
|
||||
+ si.si_proto != si_other.si_proto)
|
||||
+ continue;
|
||||
+
|
||||
+ if (getsockname(fd, &sa.sa, &addrlen) < 0) {
|
||||
+ syslog(LOG_ERR, "failed to query socket name: %s",
|
||||
+ strerror(errno));
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
+ /* Copy the address */
|
||||
+ taddr.addr.maxlen = taddr.addr.len = addrlen;
|
||||
+ taddr.addr.buf = malloc(addrlen);
|
||||
+ if (taddr.addr.buf == NULL) {
|
||||
+ syslog(LOG_ERR,
|
||||
+ "cannot allocate memory for %s address",
|
||||
+ nconf->nc_netid);
|
||||
+ goto error;
|
||||
+ }
|
||||
+ memcpy(taddr.addr.buf, &sa, addrlen);
|
||||
+
|
||||
+ my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr,
|
||||
+ RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
||||
+ if (my_xprt == (SVCXPRT *)NULL) {
|
||||
+ syslog(LOG_ERR, "%s: could not create service",
|
||||
+ nconf->nc_netid);
|
||||
+ goto error;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* if none of the systemd sockets matched, we set up the socket in
|
||||
+ * the normal way:
|
||||
+ */
|
||||
+#endif
|
||||
+
|
||||
+ if(my_xprt == (SVCXPRT *)NULL) {
|
||||
+
|
||||
+ /*
|
||||
+ * XXX - using RPC library internal functions. For NC_TPI_CLTS
|
||||
+ * we call this later, for each socket we like to bind.
|
||||
+ */
|
||||
+ if (nconf->nc_semantics != NC_TPI_CLTS) {
|
||||
if ((fd = __rpc_nconf2fd(nconf)) < 0) {
|
||||
syslog(LOG_ERR, "cannot create socket for %s",
|
||||
nconf->nc_netid);
|
||||
return (1);
|
||||
}
|
||||
- switch (hints.ai_family) {
|
||||
- case AF_INET:
|
||||
- if (inet_pton(AF_INET, hosts[nhostsbak],
|
||||
- host_addr) == 1) {
|
||||
- hints.ai_flags &= AI_NUMERICHOST;
|
||||
- } else {
|
||||
- /*
|
||||
- * Skip if we have an AF_INET6 adress.
|
||||
- */
|
||||
- if (inet_pton(AF_INET6,
|
||||
- hosts[nhostsbak], host_addr) == 1)
|
||||
- continue;
|
||||
+ }
|
||||
+
|
||||
+ if ((strcmp(nconf->nc_netid, "local") == 0) ||
|
||||
+ (strcmp(nconf->nc_netid, "unix") == 0)) {
|
||||
+ memset(&sun, 0, sizeof sun);
|
||||
+ sun.sun_family = AF_LOCAL;
|
||||
+ unlink(_PATH_RPCBINDSOCK);
|
||||
+ strcpy(sun.sun_path, _PATH_RPCBINDSOCK);
|
||||
+ addrlen = SUN_LEN(&sun);
|
||||
+ sa = (struct sockaddr *)&sun;
|
||||
+ } else {
|
||||
+ /* Get rpcbind's address on this transport */
|
||||
+
|
||||
+ memset(&hints, 0, sizeof hints);
|
||||
+ hints.ai_flags = AI_PASSIVE;
|
||||
+ hints.ai_family = si.si_af;
|
||||
+ hints.ai_socktype = si.si_socktype;
|
||||
+ hints.ai_protocol = si.si_proto;
|
||||
+ }
|
||||
+ if (nconf->nc_semantics == NC_TPI_CLTS) {
|
||||
+ /*
|
||||
+ * If no hosts were specified, just bind to INADDR_ANY. Otherwise
|
||||
+ * make sure 127.0.0.1 is added to the list.
|
||||
+ */
|
||||
+ nhostsbak = nhosts;
|
||||
+ nhostsbak++;
|
||||
+ hosts = realloc(hosts, nhostsbak * sizeof(char *));
|
||||
+ if (nhostsbak == 1)
|
||||
+ hosts[0] = "*";
|
||||
+ else {
|
||||
+ if (hints.ai_family == AF_INET) {
|
||||
+ hosts[nhostsbak - 1] = "127.0.0.1";
|
||||
+ } else if (hints.ai_family == AF_INET6) {
|
||||
+ hosts[nhostsbak - 1] = "::1";
|
||||
+ } else
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Bind to specific IPs if asked to
|
||||
+ */
|
||||
+ checkbind = 0;
|
||||
+ while (nhostsbak > 0) {
|
||||
+ --nhostsbak;
|
||||
+ /*
|
||||
+ * XXX - using RPC library internal functions.
|
||||
+ */
|
||||
+ if ((fd = __rpc_nconf2fd(nconf)) < 0) {
|
||||
+ syslog(LOG_ERR, "cannot create socket for %s",
|
||||
+ nconf->nc_netid);
|
||||
+ return (1);
|
||||
+ }
|
||||
+ switch (hints.ai_family) {
|
||||
+ case AF_INET:
|
||||
+ if (inet_pton(AF_INET, hosts[nhostsbak],
|
||||
+ host_addr) == 1) {
|
||||
+ hints.ai_flags &= AI_NUMERICHOST;
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * Skip if we have an AF_INET6 adress.
|
||||
+ */
|
||||
+ if (inet_pton(AF_INET6,
|
||||
+ hosts[nhostsbak], host_addr) == 1)
|
||||
+ continue;
|
||||
+ }
|
||||
+ break;
|
||||
+ case AF_INET6:
|
||||
+ if (inet_pton(AF_INET6, hosts[nhostsbak],
|
||||
+ host_addr) == 1) {
|
||||
+ hints.ai_flags &= AI_NUMERICHOST;
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * Skip if we have an AF_INET adress.
|
||||
+ */
|
||||
+ if (inet_pton(AF_INET, hosts[nhostsbak],
|
||||
+ host_addr) == 1)
|
||||
+ continue;
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
}
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- if (inet_pton(AF_INET6, hosts[nhostsbak],
|
||||
- host_addr) == 1) {
|
||||
- hints.ai_flags &= AI_NUMERICHOST;
|
||||
- } else {
|
||||
+
|
||||
+ /*
|
||||
+ * If no hosts were specified, just bind to INADDR_ANY
|
||||
+ */
|
||||
+ if (strcmp("*", hosts[nhostsbak]) == 0)
|
||||
+ hosts[nhostsbak] = NULL;
|
||||
+
|
||||
+ if ((aicode = getaddrinfo(hosts[nhostsbak],
|
||||
+ servname, &hints, &res)) != 0) {
|
||||
+ if ((aicode = getaddrinfo(hosts[nhostsbak],
|
||||
+ "portmapper", &hints, &res)) != 0) {
|
||||
+ syslog(LOG_ERR,
|
||||
+ "cannot get local address for %s: %s",
|
||||
+ nconf->nc_netid, gai_strerror(aicode));
|
||||
+ continue;
|
||||
+ }
|
||||
+ }
|
||||
+ addrlen = res->ai_addrlen;
|
||||
+ sa = (struct sockaddr *)res->ai_addr;
|
||||
+ oldmask = umask(S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
+ if (bind(fd, sa, addrlen) != 0) {
|
||||
+ syslog(LOG_ERR, "cannot bind %s on %s: %m",
|
||||
+ (hosts[nhostsbak] == NULL) ? "*" :
|
||||
+ hosts[nhostsbak], nconf->nc_netid);
|
||||
+ if (res != NULL)
|
||||
+ freeaddrinfo(res);
|
||||
+ continue;
|
||||
+ } else
|
||||
+ checkbind++;
|
||||
+ (void) umask(oldmask);
|
||||
+
|
||||
+ /* Copy the address */
|
||||
+ taddr.addr.maxlen = taddr.addr.len = addrlen;
|
||||
+ taddr.addr.buf = malloc(addrlen);
|
||||
+ if (taddr.addr.buf == NULL) {
|
||||
+ syslog(LOG_ERR,
|
||||
+ "cannot allocate memory for %s address",
|
||||
+ nconf->nc_netid);
|
||||
+ if (res != NULL)
|
||||
+ freeaddrinfo(res);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ memcpy(taddr.addr.buf, sa, addrlen);
|
||||
+#ifdef RPCBIND_DEBUG
|
||||
+ if (debugging) {
|
||||
/*
|
||||
- * Skip if we have an AF_INET adress.
|
||||
+ * for debugging print out our universal
|
||||
+ * address
|
||||
*/
|
||||
- if (inet_pton(AF_INET, hosts[nhostsbak],
|
||||
- host_addr) == 1)
|
||||
- continue;
|
||||
+ char *uaddr;
|
||||
+ struct netbuf nb;
|
||||
+ int sa_size = 0;
|
||||
+
|
||||
+ nb.buf = sa;
|
||||
+ switch( sa->sa_family){
|
||||
+ case AF_INET:
|
||||
+ sa_size = sizeof (struct sockaddr_in);
|
||||
+ break;
|
||||
+ case AF_INET6:
|
||||
+ sa_size = sizeof (struct sockaddr_in6);
|
||||
+ break;
|
||||
+ }
|
||||
+ nb.len = nb.maxlen = sa_size;
|
||||
+ uaddr = taddr2uaddr(nconf, &nb);
|
||||
+ (void) fprintf(stderr,
|
||||
+ "rpcbind : my address is %s\n", uaddr);
|
||||
+ (void) free(uaddr);
|
||||
+ }
|
||||
+#endif
|
||||
+ my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr,
|
||||
+ RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
||||
+ if (my_xprt == (SVCXPRT *)NULL) {
|
||||
+ syslog(LOG_ERR, "%s: could not create service",
|
||||
+ nconf->nc_netid);
|
||||
+ goto error;
|
||||
}
|
||||
- break;
|
||||
- default:
|
||||
- break;
|
||||
}
|
||||
-
|
||||
- /*
|
||||
- * If no hosts were specified, just bind to INADDR_ANY
|
||||
- */
|
||||
- if (strcmp("*", hosts[nhostsbak]) == 0)
|
||||
- hosts[nhostsbak] = NULL;
|
||||
-
|
||||
- if ((aicode = getaddrinfo(hosts[nhostsbak],
|
||||
- servname, &hints, &res)) != 0) {
|
||||
- if ((aicode = getaddrinfo(hosts[nhostsbak],
|
||||
- "portmapper", &hints, &res)) != 0) {
|
||||
- syslog(LOG_ERR,
|
||||
- "cannot get local address for %s: %s",
|
||||
- nconf->nc_netid, gai_strerror(aicode));
|
||||
- continue;
|
||||
- }
|
||||
+ if (!checkbind)
|
||||
+ return 1;
|
||||
+ } else { /* NC_TPI_COTS */
|
||||
+ if ((strcmp(nconf->nc_netid, "local") != 0) &&
|
||||
+ (strcmp(nconf->nc_netid, "unix") != 0)) {
|
||||
+ if ((aicode = getaddrinfo(NULL, servname, &hints, &res))!= 0) {
|
||||
+ if ((aicode = getaddrinfo(NULL, "portmapper", &hints, &res))!= 0) {
|
||||
+ printf("cannot get local address for %s: %s", nconf->nc_netid, gai_strerror(aicode));
|
||||
+ syslog(LOG_ERR,
|
||||
+ "cannot get local address for %s: %s",
|
||||
+ nconf->nc_netid, gai_strerror(aicode));
|
||||
+ return 1;
|
||||
+ }
|
||||
+ }
|
||||
+ addrlen = res->ai_addrlen;
|
||||
+ sa = (struct sockaddr *)res->ai_addr;
|
||||
}
|
||||
- addrlen = res->ai_addrlen;
|
||||
- sa = (struct sockaddr *)res->ai_addr;
|
||||
oldmask = umask(S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
- if (bind(fd, sa, addrlen) != 0) {
|
||||
- syslog(LOG_ERR, "cannot bind %s on %s: %m",
|
||||
- (hosts[nhostsbak] == NULL) ? "*" :
|
||||
- hosts[nhostsbak], nconf->nc_netid);
|
||||
+ __rpc_fd2sockinfo(fd, &si);
|
||||
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on,
|
||||
+ sizeof(on)) != 0) {
|
||||
+ syslog(LOG_ERR, "cannot set SO_REUSEADDR on %s",
|
||||
+ nconf->nc_netid);
|
||||
if (res != NULL)
|
||||
freeaddrinfo(res);
|
||||
- continue;
|
||||
- } else
|
||||
- checkbind++;
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if (bind(fd, sa, addrlen) < 0) {
|
||||
+ syslog(LOG_ERR, "cannot bind %s: %m", nconf->nc_netid);
|
||||
+ if (res != NULL)
|
||||
+ freeaddrinfo(res);
|
||||
+ return 1;
|
||||
+ }
|
||||
(void) umask(oldmask);
|
||||
|
||||
/* Copy the address */
|
||||
- taddr.addr.maxlen = taddr.addr.len = addrlen;
|
||||
+ taddr.addr.len = taddr.addr.maxlen = addrlen;
|
||||
taddr.addr.buf = malloc(addrlen);
|
||||
if (taddr.addr.buf == NULL) {
|
||||
- syslog(LOG_ERR,
|
||||
- "cannot allocate memory for %s address",
|
||||
+ syslog(LOG_ERR, "cannot allocate memory for %s address",
|
||||
nconf->nc_netid);
|
||||
if (res != NULL)
|
||||
freeaddrinfo(res);
|
||||
@@ -443,116 +591,37 @@ init_transport(struct netconfig *nconf)
|
||||
memcpy(taddr.addr.buf, sa, addrlen);
|
||||
#ifdef RPCBIND_DEBUG
|
||||
if (debugging) {
|
||||
- /*
|
||||
- * for debugging print out our universal
|
||||
- * address
|
||||
- */
|
||||
+ /* for debugging print out our universal address */
|
||||
char *uaddr;
|
||||
struct netbuf nb;
|
||||
- int sa_size = 0;
|
||||
+ int sa_size2 = 0;
|
||||
|
||||
nb.buf = sa;
|
||||
switch( sa->sa_family){
|
||||
case AF_INET:
|
||||
- sa_size = sizeof (struct sockaddr_in);
|
||||
+ sa_size2 = sizeof (struct sockaddr_in);
|
||||
break;
|
||||
case AF_INET6:
|
||||
- sa_size = sizeof (struct sockaddr_in6);
|
||||
+ sa_size2 = sizeof (struct sockaddr_in6);
|
||||
break;
|
||||
}
|
||||
- nb.len = nb.maxlen = sa_size;
|
||||
+ nb.len = nb.maxlen = sa_size2;
|
||||
uaddr = taddr2uaddr(nconf, &nb);
|
||||
- (void) fprintf(stderr,
|
||||
- "rpcbind : my address is %s\n", uaddr);
|
||||
+ (void) fprintf(stderr, "rpcbind : my address is %s\n",
|
||||
+ uaddr);
|
||||
(void) free(uaddr);
|
||||
}
|
||||
#endif
|
||||
- my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr,
|
||||
- RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
||||
+
|
||||
+ listen(fd, SOMAXCONN);
|
||||
+
|
||||
+ my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
||||
if (my_xprt == (SVCXPRT *)NULL) {
|
||||
- syslog(LOG_ERR, "%s: could not create service",
|
||||
- nconf->nc_netid);
|
||||
+ syslog(LOG_ERR, "%s: could not create service",
|
||||
+ nconf->nc_netid);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
- if (!checkbind)
|
||||
- return 1;
|
||||
- } else { /* NC_TPI_COTS */
|
||||
- if ((strcmp(nconf->nc_netid, "local") != 0) &&
|
||||
- (strcmp(nconf->nc_netid, "unix") != 0)) {
|
||||
- if ((aicode = getaddrinfo(NULL, servname, &hints, &res))!= 0) {
|
||||
- if ((aicode = getaddrinfo(NULL, "portmapper", &hints, &res))!= 0) {
|
||||
- printf("cannot get local address for %s: %s", nconf->nc_netid, gai_strerror(aicode));
|
||||
- syslog(LOG_ERR,
|
||||
- "cannot get local address for %s: %s",
|
||||
- nconf->nc_netid, gai_strerror(aicode));
|
||||
- return 1;
|
||||
- }
|
||||
- }
|
||||
- addrlen = res->ai_addrlen;
|
||||
- sa = (struct sockaddr *)res->ai_addr;
|
||||
- }
|
||||
- oldmask = umask(S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
- __rpc_fd2sockinfo(fd, &si);
|
||||
- if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on,
|
||||
- sizeof(on)) != 0) {
|
||||
- syslog(LOG_ERR, "cannot set SO_REUSEADDR on %s",
|
||||
- nconf->nc_netid);
|
||||
- if (res != NULL)
|
||||
- freeaddrinfo(res);
|
||||
- return 1;
|
||||
- }
|
||||
- if (bind(fd, sa, addrlen) < 0) {
|
||||
- syslog(LOG_ERR, "cannot bind %s: %m", nconf->nc_netid);
|
||||
- if (res != NULL)
|
||||
- freeaddrinfo(res);
|
||||
- return 1;
|
||||
- }
|
||||
- (void) umask(oldmask);
|
||||
-
|
||||
- /* Copy the address */
|
||||
- taddr.addr.len = taddr.addr.maxlen = addrlen;
|
||||
- taddr.addr.buf = malloc(addrlen);
|
||||
- if (taddr.addr.buf == NULL) {
|
||||
- syslog(LOG_ERR, "cannot allocate memory for %s address",
|
||||
- nconf->nc_netid);
|
||||
- if (res != NULL)
|
||||
- freeaddrinfo(res);
|
||||
- return 1;
|
||||
- }
|
||||
- memcpy(taddr.addr.buf, sa, addrlen);
|
||||
-#ifdef RPCBIND_DEBUG
|
||||
- if (debugging) {
|
||||
- /* for debugging print out our universal address */
|
||||
- char *uaddr;
|
||||
- struct netbuf nb;
|
||||
- int sa_size2 = 0;
|
||||
-
|
||||
- nb.buf = sa;
|
||||
- switch( sa->sa_family){
|
||||
- case AF_INET:
|
||||
- sa_size2 = sizeof (struct sockaddr_in);
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- sa_size2 = sizeof (struct sockaddr_in6);
|
||||
- break;
|
||||
- }
|
||||
- nb.len = nb.maxlen = sa_size2;
|
||||
- uaddr = taddr2uaddr(nconf, &nb);
|
||||
- (void) fprintf(stderr, "rpcbind : my address is %s\n",
|
||||
- uaddr);
|
||||
- (void) free(uaddr);
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
- listen(fd, SOMAXCONN);
|
||||
-
|
||||
- my_xprt = (SVCXPRT *)svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE);
|
||||
- if (my_xprt == (SVCXPRT *)NULL) {
|
||||
- syslog(LOG_ERR, "%s: could not create service",
|
||||
- nconf->nc_netid);
|
||||
- goto error;
|
||||
- }
|
||||
}
|
||||
|
||||
#ifdef PORTMAP
|
||||
diff --git a/systemd/.gitignore b/systemd/.gitignore
|
||||
new file mode 100644
|
||||
index 0000000..b7b4561
|
||||
--- /dev/null
|
||||
+++ b/systemd/.gitignore
|
||||
@@ -0,0 +1 @@
|
||||
+rpcbind.service
|
||||
diff --git a/systemd/rpcbind.service.in b/systemd/rpcbind.service.in
|
||||
new file mode 100644
|
||||
index 0000000..58ae5de
|
||||
--- /dev/null
|
||||
+++ b/systemd/rpcbind.service.in
|
||||
@@ -0,0 +1,9 @@
|
||||
+[Unit]
|
||||
+Description=RPC Bind
|
||||
+
|
||||
+[Service]
|
||||
+ExecStart=@bindir@/rpcbind -w -f
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=multi-user.target
|
||||
+Also=rpcbind.socket
|
||||
diff --git a/systemd/rpcbind.socket b/systemd/rpcbind.socket
|
||||
new file mode 100644
|
||||
index 0000000..ad5fd62
|
||||
--- /dev/null
|
||||
+++ b/systemd/rpcbind.socket
|
||||
@@ -0,0 +1,12 @@
|
||||
+[Unit]
|
||||
+Description=RPCbind Server Activation Socket
|
||||
+Wants=rpcbind.target
|
||||
+Before=rpcbind.target
|
||||
+
|
||||
+[Socket]
|
||||
+ListenStream=/var/run/rpcbind.sock
|
||||
+ListenStream=111
|
||||
+ListenDatagram=111
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=sockets.target
|
||||
--
|
||||
1.7.8
|
||||
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a8fd59e9cffe668a827828c54ed274a4db0d03dbbf87a749f43dbd315ec7aee2
|
||||
size 47040
|
3
rpcbind-0.2.0_git201103171419.tar.bz2
Normal file
3
rpcbind-0.2.0_git201103171419.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:dd1363a8537a5839814d9a013a1b014353752e2d63dcb94c33d662dfae4e94f7
|
||||
size 49419
|
@ -1,3 +1,27 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Dec 19 22:54:46 UTC 2011 - crrodriguez@opensuse.org
|
||||
|
||||
- Update systemd patches
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 7 13:50:49 UTC 2011 - crrodriguez@opensuse.org
|
||||
|
||||
- Add systemd socket activation patch, based on
|
||||
http://www.spinics.net/lists/linux-nfs/msg14371.html
|
||||
but does not bundle sd-daemon.[c|h] it uses libsystemd-daemon
|
||||
instead.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Dec 4 17:14:37 UTC 2011 - crrodriguez@opensuse.org
|
||||
|
||||
- Update to version 0.2.0_git201103171419
|
||||
- Fix rpm source tags to not be conditional.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Nov 29 20:27:38 UTC 2011 - crrodriguez@opensuse.org
|
||||
|
||||
- Add systemd units
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Nov 25 10:43:48 UTC 2011 - coolo@suse.com
|
||||
|
||||
|
43
rpcbind.spec
43
rpcbind.spec
@ -20,11 +20,11 @@
|
||||
Name: rpcbind
|
||||
License: BSD-3-Clause
|
||||
Group: Productivity/Networking/System
|
||||
Version: 0.2.0_git201007131952
|
||||
Version: 0.2.0_git201103171419
|
||||
Release: 1
|
||||
Summary: Transport independent RPC portmapper
|
||||
Url: http://git.infradead.org/users/steved/rpcbind.git
|
||||
Source: %{name}-%{version}.tar.xz
|
||||
Source: %{name}-%{version}.tar.bz2
|
||||
Source1: rpcbind.init
|
||||
Source2: sysconfig.rpcbind
|
||||
Source3: rpcbind.xml
|
||||
@ -32,14 +32,20 @@ Source4: pmap_set.c
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
BuildRequires: libtirpc-devel
|
||||
BuildRequires: tcpd-devel
|
||||
BuildRequires: xz
|
||||
BuildRequires: libtool
|
||||
BuildRequires: pkgconfig
|
||||
Provides: portmap = 6.0+git20070716
|
||||
Obsoletes: portmap <= 6.0+git20070716
|
||||
# hopefully soon we will have this autogenerated from rpm
|
||||
Provides: sysvinit(portmap) sysvinit(rpcbind)
|
||||
PreReq: %insserv_prereq %fillup_prereq /sbin/checkproc sysvinit(network) syslog
|
||||
Patch0: 0001-systemd-add-support-for-system-bus-activation.patch
|
||||
%define statefile /var/lib/portmap.state
|
||||
%if 0%{?suse_version} > 1140
|
||||
BuildRequires: systemd-devel
|
||||
%{?systemd_requires}
|
||||
%define has_systemd 1
|
||||
%endif
|
||||
|
||||
%description
|
||||
Rpcbind is a replacement for portmap. Whereas portmap supports only UDP
|
||||
@ -58,19 +64,20 @@ Authors:
|
||||
%prep
|
||||
%setup -q
|
||||
cp %{SOURCE4} .
|
||||
%patch0 -p1
|
||||
|
||||
%build
|
||||
autoreconf -fi
|
||||
%configure --disable-static --with-pic \
|
||||
autoreconf -fiv
|
||||
export CFLAGS="$RPM_OPT_FLAGS -fpie"
|
||||
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
|
||||
%configure \
|
||||
--bindir=/sbin \
|
||||
--enable-libwrap \
|
||||
--enable-warmstarts \
|
||||
--with-statedir=%{_localstatedir}/lib/rpcbind \
|
||||
--enable-debug \
|
||||
CFLAGS="$RPM_OPT_FLAGS -fpie" \
|
||||
LDFLAGS="-pie -Wl,-z,relro,-z,now"
|
||||
--with-statedir=%{_localstatedir}/lib/rpcbind
|
||||
|
||||
%{__make} %{?jobs:-j%jobs}
|
||||
cc -Wl,-z,relro,-z,now %{optflags} pmap_set.c -o pmap_set
|
||||
%{__cc} -fwhole-program -Wl,-z,relro,-z,now %{optflags} pmap_set.c -o pmap_set
|
||||
|
||||
%install
|
||||
make install DESTDIR=$RPM_BUILD_ROOT
|
||||
@ -100,9 +107,15 @@ fi
|
||||
if test -x /sbin/portmap && /sbin/chkconfig -c portmap 3; then
|
||||
/sbin/insserv -f -r portmap
|
||||
fi
|
||||
%if 0%{?has_systemd}
|
||||
%service_add_pre %{name}.service %{name}.socket
|
||||
%endif
|
||||
|
||||
%preun
|
||||
%stop_on_removal rpcbind
|
||||
%if 0%{?has_systemd}
|
||||
%service_del_preun %{name}.service %{name}.socket
|
||||
%endif
|
||||
|
||||
%post
|
||||
%fillup_and_insserv rpcbind
|
||||
@ -114,10 +127,16 @@ if test -r %statefile; then
|
||||
/sbin/pmap_set2 < %statefile
|
||||
rm -f %statefile
|
||||
fi
|
||||
%if 0%{?has_systemd}
|
||||
%service_add_post %{name}.service %{name}.socket
|
||||
%endif
|
||||
|
||||
%postun
|
||||
%restart_on_update rpcbind
|
||||
%insserv_cleanup
|
||||
%if 0%{?has_systemd}
|
||||
%service_del_postun %{name}.service %{name}.socket
|
||||
%endif
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
@ -131,5 +150,9 @@ fi
|
||||
%{_localstatedir}/lib/rpcbind
|
||||
/var/adm/fillup-templates/sysconfig.rpcbind
|
||||
%{_datadir}/omc/svcinfo.d/rpcbind.xml
|
||||
%if 0%{?has_systemd}
|
||||
%{_unitdir}/%{name}.service
|
||||
%{_unitdir}/%{name}.socket
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
|
Loading…
Reference in New Issue
Block a user