diff --git a/Makefile.am b/Makefile.am index d10c906..8715082 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,3 +1,5 @@ +AUTOMAKE_OPTIONS = subdir-objects + AM_CPPFLAGS = \ -DCHECK_LOCAL \ -DPORTMAP \ @@ -6,6 +8,7 @@ AM_CPPFLAGS = \ -DINET6 \ -DRPCBIND_STATEDIR="\"$(statedir)\"" \ -DRPCBIND_USER="\"$(rpcuser)\"" \ + -DNSS_MODULES="\"$(nss_modules)\"" \ -D_GNU_SOURCE \ $(TIRPC_CFLAGS) diff --git a/configure.ac b/configure.ac index 747a8bf..5a88cc7 100644 --- a/configure.ac +++ b/configure.ac @@ -23,10 +23,17 @@ AC_ARG_WITH([statedir], AC_SUBST([statedir], [$with_statedir]) AC_ARG_WITH([rpcuser], - AS_HELP_STRING([--with-rpcuser=ARG], [use ARG for RPC @<:@default=root@:>@]), + AS_HELP_STRING([--with-rpcuser=ARG], [use ARG for RPC @<:@default=root@:>@]) ,, [with_rpcuser=root]) AC_SUBST([rpcuser], [$with_rpcuser]) +AC_ARG_WITH([nss_modules], + AS_HELP_STRING([--with-nss-modules=NSS_MODULES] + , [Sets the nss module search list to the given space-delimited string. + For example --with-nss-modules="files altfiles" @<:@default=files@:>@]) + ,, [with_nss_modules=files]) +AC_SUBST([nss_modules], [$with_nss_modules]) + PKG_CHECK_MODULES([TIRPC], [libtirpc]) AS_IF([test x$enable_libwrap = xyes], [ diff --git a/man/rpcinfo.8 b/man/rpcinfo.8 index 5ece18f..750ffce 100644 --- a/man/rpcinfo.8 +++ b/man/rpcinfo.8 @@ -20,8 +20,7 @@ .Nm "rpcinfo" .Fl l .Op Fl T Ar transport -.Ar host Ar prognum -.Op Ar versnum +.Ar host Ar prognum Ar versnum .Nm "rpcinfo" .Op Fl n Ar portnum .Fl u diff --git a/src/rpcbind.c b/src/rpcbind.c index 83dbe93..e3462e3 100644 --- a/src/rpcbind.c +++ b/src/rpcbind.c @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -90,6 +91,12 @@ char *rpcbinduser = RPCBIND_USER; char *rpcbinduser = NULL; #endif +#ifdef NSS_MODULES +char *nss_modules = NSS_MODULES; +#else +char *nss_modules = "files"; +#endif + /* who to suid to if -s is given */ #define RUN_AS "daemon" @@ -164,7 +171,7 @@ main(int argc, char *argv[]) * Make sure we use the local service file * for service lookkups */ - __nss_configure_lookup("services", "files"); + __nss_configure_lookup("services", nss_modules); nc_handle = setnetconfig(); /* open netconfig file */ if (nc_handle == NULL) { @@ -230,7 +237,7 @@ main(int argc, char *argv[]) * Make sure we use the local password file * for these lookups. */ - __nss_configure_lookup("passwd", "files"); + __nss_configure_lookup("passwd", nss_modules); if((p = getpwnam(id)) == NULL) { syslog(LOG_ERR, "cannot get uid of '%s': %m", id); @@ -726,11 +733,9 @@ terminate(int dummy /*__unused*/) unlink(_PATH_RPCBINDSOCK); unlink(RPCBINDDLOCK); #ifdef WARMSTART - syslog(LOG_ERR, - "rpcbind terminating on signal. Restart with \"rpcbind -w\""); write_warmstart(); /* Dump yourself */ #endif - exit(2); + exit(0); /* exit gracefully */ } void diff --git a/src/util.c b/src/util.c index 9a5fb69..7d56479 100644 --- a/src/util.c +++ b/src/util.c @@ -101,12 +101,14 @@ static void in6_fillscopeid(struct sockaddr_in6 *sin6) { u_int16_t ifindex; + u_int16_t *addr; if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { - ifindex = ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]); + addr = (u_int16_t *)&sin6->sin6_addr.s6_addr[2]; + ifindex = ntohs(*addr); if (sin6->sin6_scope_id == 0 && ifindex != 0) { sin6->sin6_scope_id = ifindex; - *(u_int16_t *)&sin6->sin6_addr.s6_addr[2] = 0; + *addr = 0; } } }