From ecd58e8ed1d5ae8f9e98cfe5224afa69c0b76694cd8c036937143bb0494ba7c6 Mon Sep 17 00:00:00 2001 From: Thorsten Kukuk Date: Thu, 19 Jan 2012 09:20:35 +0000 Subject: [PATCH] Accepting request 98008 from home:elvigia:nfs-systemd This is a working/tested version of the prev request - Update systemd patches - 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. - Update to version 0.2.0_git201103171419 - Fix rpm source tags to not be conditional. - Add systemd units OBS-URL: https://build.opensuse.org/request/show/98008 OBS-URL: https://build.opensuse.org/package/show/network/rpcbind?expand=0&rev=15 --- ...dd-support-for-system-bus-activation.patch | 731 ++++++++++++++++++ rpcbind-0.2.0_git201007131952.tar.xz | 3 - rpcbind-0.2.0_git201103171419.tar.bz2 | 3 + rpcbind.changes | 24 + rpcbind.spec | 43 +- 5 files changed, 791 insertions(+), 13 deletions(-) create mode 100644 0001-systemd-add-support-for-system-bus-activation.patch delete mode 100644 rpcbind-0.2.0_git201007131952.tar.xz create mode 100644 rpcbind-0.2.0_git201103171419.tar.bz2 diff --git a/0001-systemd-add-support-for-system-bus-activation.patch b/0001-systemd-add-support-for-system-bus-activation.patch new file mode 100644 index 0000000..b995884 --- /dev/null +++ b/0001-systemd-add-support-for-system-bus-activation.patch @@ -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: +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 ; Fri, 23 Dec 2011 02:05:46 +0100 (CET) +Received: by laam7 with SMTP id m7so4957545laa.35 + for ; 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 +To: linux-nfs@vger.kernel.org +Cc: Tom Gundersen , Steve Dickson , + systemd-devel@lists.freedesktop.org, + =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= +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: +. + +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 +Cc: Steve Dickson +Cc: systemd-devel@lists.freedesktop.org +Cc: Cristian Rodríguez +Signed-off-by: Tom Gundersen +--- + +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 + #endif + #include ++#ifdef SYSTEMD ++#include ++#endif + #include + #include + #include +@@ -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 + diff --git a/rpcbind-0.2.0_git201007131952.tar.xz b/rpcbind-0.2.0_git201007131952.tar.xz deleted file mode 100644 index f5a8192..0000000 --- a/rpcbind-0.2.0_git201007131952.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8fd59e9cffe668a827828c54ed274a4db0d03dbbf87a749f43dbd315ec7aee2 -size 47040 diff --git a/rpcbind-0.2.0_git201103171419.tar.bz2 b/rpcbind-0.2.0_git201103171419.tar.bz2 new file mode 100644 index 0000000..3724160 --- /dev/null +++ b/rpcbind-0.2.0_git201103171419.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd1363a8537a5839814d9a013a1b014353752e2d63dcb94c33d662dfae4e94f7 +size 49419 diff --git a/rpcbind.changes b/rpcbind.changes index e633d71..01f0067 100644 --- a/rpcbind.changes +++ b/rpcbind.changes @@ -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 diff --git a/rpcbind.spec b/rpcbind.spec index 8105ea1..f477259 100644 --- a/rpcbind.spec +++ b/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