diff --git a/.gitignore b/.gitignore index 1d1304d..5ec4602 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ rpcbind-0.2.0 rpcbind-0.2.1 /rpcbind-0.2.2.tar.bz2 rpcbind-0.2.2 +/rpcbind-0.2.3.tar.bz2 +rpcbind-0.2.3 diff --git a/rpcbind-0.2.1-rpcuser.patch b/rpcbind-0.2.1-rpcuser.patch deleted file mode 100644 index 426f997..0000000 --- a/rpcbind-0.2.1-rpcuser.patch +++ /dev/null @@ -1,26 +0,0 @@ -commit b3b031b07cc5909aaf964f9d4cf46f6097769320 -Author: Steve Dickson -Date: Wed Aug 21 14:40:22 2013 -0400 - - rpcbind: rpcuser not being set in Makefile.am - - Commit 8d7a0708 cause a regression where the rpcuser id was not - being set, which in turn cause rpcbind to immediately exit. - This patch removes the extra ',' that was in the AC_ARG_WITH - statement in the configure.ac file. - - Signed-off-by: Steve Dickson - -diff --git a/configure.ac b/configure.ac -index 2b67720..1cf42d3 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -23,7 +23,7 @@ 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]) - diff --git a/rpcbind-0.2.2-xlog-debug.patch b/rpcbind-0.2.2-xlog-debug.patch deleted file mode 100644 index cbda4b8..0000000 --- a/rpcbind-0.2.2-xlog-debug.patch +++ /dev/null @@ -1,1213 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index ea5725f..3add1e3 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -38,7 +38,8 @@ rpcbind_SOURCES = \ - src/rpcbind.h \ - src/security.c \ - src/util.c \ -- src/warmstart.c -+ src/warmstart.c \ -+ src/xlog.c - rpcbind_LDADD = $(TIRPC_LIBS) - - if SYSTEMD -diff --git a/man/rpcbind.8 b/man/rpcbind.8 -index da32701..af6200f 100644 ---- a/man/rpcbind.8 -+++ b/man/rpcbind.8 -@@ -76,8 +76,8 @@ do an abort on errors. - Run in debug mode. - In this mode, - .Nm --will not fork when it starts, will print additional information --during operation, and will abort on certain errors if -+will log additional information during operation, -+and will abort on certain errors if - .Fl a - is also specified. - With this option, the name-to-address translation consistency -diff --git a/src/pmap_svc.c b/src/pmap_svc.c -index 337e64d..ad28b93 100644 ---- a/src/pmap_svc.c -+++ b/src/pmap_svc.c -@@ -54,9 +54,11 @@ static char sccsid[] = "@(#)pmap_svc.c 1.23 89/04/05 Copyr 1984 Sun Micro"; - #include - #include - #ifdef RPCBIND_DEBUG -+#include - #include - #endif - #include "rpcbind.h" -+#include "xlog.h" - #include /* svc_getcaller routine definition */ - static struct pmaplist *find_service_pmap __P((rpcprog_t, rpcvers_t, - rpcprot_t)); -@@ -78,7 +80,7 @@ pmap_service(struct svc_req *rqstp, SVCXPRT *xprt) - */ - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "PMAPPROC_NULL\n"); -+ xlog(LOG_DEBUG, "PMAPPROC_NULL\n"); - #endif - check_access(xprt, rqstp->rq_proc, 0, PMAPVERS); - if ((!svc_sendreply(xprt, (xdrproc_t) xdr_void, NULL)) && -@@ -117,7 +119,7 @@ pmap_service(struct svc_req *rqstp, SVCXPRT *xprt) - */ - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "PMAPPROC_DUMP\n"); -+ xlog(LOG_DEBUG, "PMAPPROC_DUMP\n"); - #endif - pmapproc_dump(rqstp, xprt); - break; -@@ -196,7 +198,7 @@ pmapproc_change(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt, unsigned long - } - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "%s request for (%lu, %lu) : ", -+ xlog(LOG_DEBUG, "%s request for (%lu, %lu) : ", - op == PMAPPROC_SET ? "PMAP_SET" : "PMAP_UNSET", - reg.pm_prog, reg.pm_vers); - #endif -@@ -243,14 +245,14 @@ pmapproc_change(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt, unsigned long - done_change: - if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t) &ans)) && - debugging) { -- fprintf(stderr, "portmap: svc_sendreply\n"); -+ xlog(L_ERROR, "portmap: svc_sendreply failed!\n"); - if (doabort) { - rpcbind_abort(); - } - } - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed"); -+ xlog(LOG_DEBUG, "%s\n", ans == TRUE ? "succeeded" : "failed"); - #endif - if (op == PMAPPROC_SET) - rpcbs_set(RPCBVERS_2_STAT, ans); -@@ -285,7 +287,7 @@ pmapproc_getport(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - if (debugging) { - uaddr = taddr2uaddr(rpcbind_get_conf(xprt->xp_netid), - svc_getrpccaller(xprt)); -- fprintf(stderr, "PMAP_GETPORT req for (%lu, %lu, %s) from %s :", -+ xlog(LOG_DEBUG, "PMAP_GETPORT req for (%lu, %lu, %s) from %s :", - reg.pm_prog, reg.pm_vers, - pmap_ipprot2netid(reg.pm_prot)?: "", - uaddr); -@@ -315,14 +317,14 @@ pmapproc_getport(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - lport = port; - if ((!svc_sendreply(xprt, (xdrproc_t) xdr_long, (caddr_t)&lport)) && - debugging) { -- (void) fprintf(stderr, "portmap: svc_sendreply\n"); -+ xlog(L_ERROR, "portmap: svc_sendreply failed!\n"); - if (doabort) { - rpcbind_abort(); - } - } - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "port = %d\n", port); -+ xlog(LOG_DEBUG, "port = %d\n", port); - #endif - rpcbs_getaddr(RPCBVERS_2_STAT, reg.pm_prog, reg.pm_vers, - pmap_ipprot2netid(reg.pm_prot) ?: "", -@@ -347,8 +349,7 @@ pmapproc_dump(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - - if ((!svc_sendreply(xprt, (xdrproc_t) xdr_pmaplist_ptr, - (caddr_t)&list_pml)) && debugging) { -- if (debugging) -- (void) fprintf(stderr, "portmap: svc_sendreply\n"); -+ xlog(L_ERROR, "portmap: svc_sendreply failed!\n"); - if (doabort) { - rpcbind_abort(); - } -diff --git a/src/rpcb_svc.c b/src/rpcb_svc.c -index e350f85..92361a2 100644 ---- a/src/rpcb_svc.c -+++ b/src/rpcb_svc.c -@@ -86,7 +86,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - */ - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_NULL\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_NULL"); - #endif - /* This call just logs, no actual checks */ - check_access(transp, rqstp->rq_proc, 0, RPCBVERS); -@@ -114,7 +114,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_DUMP: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_DUMP\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_DUMP"); - #endif - xdr_argument = (xdrproc_t)xdr_void; - xdr_result = (xdrproc_t)xdr_rpcblist_ptr; -@@ -128,7 +128,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_GETTIME: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_GETTIME\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_GETTIME"); - #endif - xdr_argument = (xdrproc_t)xdr_void; - xdr_result = (xdrproc_t)xdr_u_long; -@@ -138,7 +138,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_UADDR2TADDR: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_UADDR2TADDR\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_UADDR2TADDR"); - #endif - xdr_argument = (xdrproc_t)xdr_wrapstring; - xdr_result = (xdrproc_t)xdr_netbuf; -@@ -148,7 +148,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_TADDR2UADDR: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_TADDR2UADDR\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_TADDR2UADDR"); - #endif - xdr_argument = (xdrproc_t)xdr_netbuf; - xdr_result = (xdrproc_t)xdr_wrapstring; -@@ -164,7 +164,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - (char *) &argument)) { - svcerr_decode(transp); - if (debugging) -- (void) fprintf(stderr, "rpcbind: could not decode\n"); -+ (void) xlog(LOG_DEBUG, "rpcbind: could not decode"); - return; - } - -@@ -182,7 +182,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - result)) { - svcerr_systemerr(transp); - if (debugging) { -- (void) fprintf(stderr, "rpcbind: svc_sendreply\n"); -+ (void) xlog(LOG_DEBUG, "rpcbind: svc_sendreply"); - if (doabort) { - rpcbind_abort(); - } -@@ -192,7 +192,7 @@ done: - if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *) - &argument)) { - if (debugging) { -- (void) fprintf(stderr, "unable to free arguments\n"); -+ (void) xlog(LOG_DEBUG, "unable to free arguments"); - if (doabort) { - rpcbind_abort(); - } -@@ -220,7 +220,7 @@ rpcbproc_getaddr_3_local(void *arg, struct svc_req *rqstp /*__unused*/, - - uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid), - svc_getrpccaller(transp)); -- fprintf(stderr, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ", -+ xlog(LOG_DEBUG, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ", - (unsigned long)regp->r_prog, (unsigned long)regp->r_vers, - regp->r_netid, uaddr); - free(uaddr); -diff --git a/src/rpcb_svc_4.c b/src/rpcb_svc_4.c -index 313e6d1..f1a72a6 100644 ---- a/src/rpcb_svc_4.c -+++ b/src/rpcb_svc_4.c -@@ -89,7 +89,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - */ - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_NULL\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_NULL\n"); - #endif - check_access(transp, rqstp->rq_proc, 0, RPCBVERS4); - (void) svc_sendreply(transp, (xdrproc_t) xdr_void, -@@ -125,7 +125,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_GETVERSADDR: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_GETVERSADDR\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_GETVERSADDR\n"); - #endif - xdr_argument = (xdrproc_t)xdr_rpcb; - xdr_result = (xdrproc_t)xdr_wrapstring; -@@ -135,7 +135,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_DUMP: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_DUMP\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_DUMP\n"); - #endif - xdr_argument = (xdrproc_t)xdr_void; - xdr_result = (xdrproc_t)xdr_rpcblist_ptr; -@@ -145,7 +145,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_INDIRECT: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_INDIRECT\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_INDIRECT\n"); - #endif - rpcbproc_callit_com(rqstp, transp, rqstp->rq_proc, RPCBVERS4); - return; -@@ -154,7 +154,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_BCAST: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_BCAST\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_BCAST\n"); - #endif - rpcbproc_callit_com(rqstp, transp, rqstp->rq_proc, RPCBVERS4); - return; -@@ -162,7 +162,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_GETTIME: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_GETTIME\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_GETTIME\n"); - #endif - xdr_argument = (xdrproc_t)xdr_void; - xdr_result = (xdrproc_t)xdr_u_long; -@@ -172,7 +172,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_UADDR2TADDR: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_UADDR2TADDR\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_UADDR2TADDR\n"); - #endif - xdr_argument = (xdrproc_t)xdr_wrapstring; - xdr_result = (xdrproc_t)xdr_netbuf; -@@ -182,7 +182,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_TADDR2UADDR: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_TADDR2UADDR\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_TADDR2UADDR\n"); - #endif - xdr_argument = (xdrproc_t)xdr_netbuf; - xdr_result = (xdrproc_t)xdr_wrapstring; -@@ -192,7 +192,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_GETADDRLIST: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_GETADDRLIST\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_GETADDRLIST\n"); - #endif - xdr_argument = (xdrproc_t)xdr_rpcb; - xdr_result = (xdrproc_t)xdr_rpcb_entry_list_ptr; -@@ -202,7 +202,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - case RPCBPROC_GETSTAT: - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCBPROC_GETSTAT\n"); -+ xlog(LOG_DEBUG, "RPCBPROC_GETSTAT\n"); - #endif - xdr_argument = (xdrproc_t)xdr_void; - xdr_result = (xdrproc_t)xdr_rpcb_stat_byvers; -@@ -218,7 +218,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - (char *)&argument)) { - svcerr_decode(transp); - if (debugging) -- (void) fprintf(stderr, "rpcbind: could not decode\n"); -+ (void) xlog(LOG_DEBUG, "rpcbind: could not decode\n"); - return; - } - -@@ -236,7 +236,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - result)) { - svcerr_systemerr(transp); - if (debugging) { -- (void) fprintf(stderr, "rpcbind: svc_sendreply\n"); -+ (void) xlog(LOG_DEBUG, "rpcbind: svc_sendreply\n"); - if (doabort) { - rpcbind_abort(); - } -@@ -246,7 +246,7 @@ done: - if (!svc_freeargs(transp, (xdrproc_t) xdr_argument, - (char *)&argument)) { - if (debugging) { -- (void) fprintf(stderr, "unable to free arguments\n"); -+ (void) xlog(LOG_DEBUG, "unable to free arguments\n"); - if (doabort) { - rpcbind_abort(); - } -@@ -277,7 +277,7 @@ rpcbproc_getaddr_4_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp, - - uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid), - svc_getrpccaller(transp)); -- fprintf(stderr, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ", -+ xlog(LOG_DEBUG, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ", - (unsigned long)regp->r_prog, (unsigned long)regp->r_vers, - regp->r_netid, uaddr); - free(uaddr); -@@ -307,7 +307,7 @@ rpcbproc_getversaddr_4_local(void *arg, struct svc_req *rqstp, SVCXPRT *transp, - - uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid), - svc_getrpccaller(transp)); -- fprintf(stderr, "RPCB_GETVERSADDR rqst for (%lu, %lu, %s)" -+ xlog(LOG_DEBUG, "RPCB_GETVERSADDR rqst for (%lu, %lu, %s)" - " from %s : ", - (unsigned long)regp->r_prog, (unsigned long)regp->r_vers, - regp->r_netid, uaddr); -@@ -353,7 +353,7 @@ rpcbproc_getaddrlist_4_local(void *arg, struct svc_req *rqstp /*__unused*/, - } - #ifdef RPCBIND_DEBUG - if (debugging) { -- fprintf(stderr, "r_addr: %s r_netid: %s nc_protofmly: %s\n", -+ xlog(LOG_DEBUG, "r_addr: %s r_netid: %s nc_protofmly: %s\n", - regp->r_addr, regp->r_netid, reg_nconf->nc_protofmly); - } - #endif -@@ -369,20 +369,20 @@ rpcbproc_getaddrlist_4_local(void *arg, struct svc_req *rqstp /*__unused*/, - } - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "\tmerge with: %s\n", -+ xlog(LOG_DEBUG, "\tmerge with: %s\n", - rbl->rpcb_map.r_addr); - #endif - if ((maddr = mergeaddr(transp, rbl->rpcb_map.r_netid, - rbl->rpcb_map.r_addr, saddr)) == NULL) { - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, " FAILED\n"); -+ xlog(LOG_DEBUG, " FAILED\n"); - #endif - continue; - } else if (!maddr[0]) { - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, " SUCCEEDED, but port died - maddr: nullstring\n"); -+ xlog(LOG_DEBUG, " SUCCEEDED, but port died - maddr: nullstring\n"); - #endif - /* The server died. Unset this combination */ - delete_prog(regp->r_prog); -@@ -390,7 +390,7 @@ rpcbproc_getaddrlist_4_local(void *arg, struct svc_req *rqstp /*__unused*/, - } - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, " SUCCEEDED maddr: %s\n", maddr); -+ xlog(LOG_DEBUG, " SUCCEEDED maddr: %s\n", maddr); - #endif - /* - * Add it to rlist. -@@ -418,7 +418,7 @@ rpcbproc_getaddrlist_4_local(void *arg, struct svc_req *rqstp /*__unused*/, - #ifdef RPCBIND_DEBUG - if (debugging) { - for (rp = rlist; rp; rp = rp->rpcb_entry_next) { -- fprintf(stderr, "\t%s %s\n", rp->rpcb_entry_map.r_maddr, -+ xlog(LOG_DEBUG, "\t%s %s\n", rp->rpcb_entry_map.r_maddr, - rp->rpcb_entry_map.r_nc_proto); - } - } -diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c -index f6bd6bd..9a094f5 100644 ---- a/src/rpcb_svc_com.c -+++ b/src/rpcb_svc_com.c -@@ -137,14 +137,14 @@ rpcbproc_set_com(void *arg, struct svc_req *rqstp /*__unused*/, SVCXPRT *transp, - - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCB_SET request for (%lu, %lu, %s, %s) : ", -+ xlog(LOG_DEBUG, "RPCB_SET request for (%lu, %lu, %s, %s) : ", - (unsigned long)regp->r_prog, (unsigned long)regp->r_vers, - regp->r_netid, regp->r_addr); - #endif - ans = map_set(regp, getowner(transp, owner, sizeof owner)); - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed"); -+ xlog(LOG_DEBUG, "RPCB_SET: %s", ans == TRUE ? "succeeded" : "failed"); - #endif - /* XXX: should have used some defined constant here */ - rpcbs_set(rpcbversnum - 2, ans); -@@ -225,7 +225,7 @@ rpcbproc_unset_com(void *arg, struct svc_req *rqstp /*__unused*/, SVCXPRT *trans - - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "RPCB_UNSET request for (%lu, %lu, %s) : ", -+ xlog(LOG_DEBUG, "RPCB_UNSET request for (%lu, %lu, %s) : ", - (unsigned long)regp->r_prog, (unsigned long)regp->r_vers, - regp->r_netid); - #endif -@@ -233,7 +233,7 @@ rpcbproc_unset_com(void *arg, struct svc_req *rqstp /*__unused*/, SVCXPRT *trans - ans = map_unset(regp, getowner(transp, owner, sizeof owner)); - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "%s\n", ans == TRUE ? "succeeded" : "failed"); -+ xlog(LOG_DEBUG, "RPCB_UNSET: %s", ans == TRUE ? "succeeded" : "failed"); - #endif - /* XXX: should have used some defined constant here */ - rpcbs_unset(rpcbversnum - 2, ans); -@@ -264,9 +264,9 @@ map_unset(RPCB *regp, char *owner) - * if superuser or the owner itself. - */ - #ifdef RPCBIND_DEBUG -- fprintf(stderr,"Suppression RPC_UNSET(map_unset)\n "); -- fprintf(stderr,"rbl->rpcb_map.r_owner=%s\n ",rbl->rpcb_map.r_owner); -- fprintf(stderr,"owner=%s\n ",owner); -+ xlog(LOG_DEBUG,"Suppression RPC_UNSET(map_unset) "); -+ xlog(LOG_DEBUG,"rbl->rpcb_map.r_owner=%s ",rbl->rpcb_map.r_owner); -+ xlog(LOG_DEBUG,"owner=%s ",owner); - #endif - if (strcmp(owner, "superuser") && - strcmp(rbl->rpcb_map.r_owner, owner)) -@@ -349,7 +349,7 @@ rpcbproc_getaddr_com(RPCB *regp, struct svc_req *rqstp /*__unused*/, - } - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "getaddr: %s\n", uaddr); -+ xlog(LOG_DEBUG, "getaddr: %s", uaddr); - #endif - /* XXX: should have used some defined constant here */ - rpcbs_getaddr(rpcbversnum - 2, regp->r_prog, regp->r_vers, -@@ -506,7 +506,7 @@ create_rmtcall_fd(struct netconfig *nconf) - - if ((fd = __rpc_nconf2fd(nconf)) == -1) { - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "create_rmtcall_fd: couldn't open \"%s\" (errno %d)\n", - nconf->nc_device, errno); - return (-1); -@@ -514,7 +514,7 @@ create_rmtcall_fd(struct netconfig *nconf) - xprt = svc_tli_create(fd, 0, (struct t_bind *) 0, 0, 0); - if (xprt == NULL) { - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "create_rmtcall_fd: svc_tli_create failed\n"); - return (-1); - } -@@ -656,7 +656,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - #endif /* notyet */ - if (buf_alloc == NULL) { - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: No Memory!\n"); - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); -@@ -672,7 +672,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_decode(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: svc_getargs failed\n"); - goto error; - } -@@ -686,7 +686,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - #ifdef RPCBIND_DEBUG - if (debugging) { - uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid), caller); -- fprintf(stderr, "%s %s req for (%lu, %lu, %lu, %s) from %s : ", -+ xlog(LOG_DEBUG, "%s %s req for (%lu, %lu, %lu, %s) from %s : ", - versnum == PMAPVERS ? "pmap_rmtcall" : - versnum == RPCBVERS ? "rpcb_rmtcall" : - versnum == RPCBVERS4 ? "rpcb_indirect" : "unknown", -@@ -707,7 +707,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (rbl == (rpcblist_ptr)NULL) { - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "not found\n"); -+ xlog(LOG_DEBUG, "not found\n"); - #endif - if (reply_type == RPCBPROC_INDIRECT) - svcerr_noprog(transp); -@@ -726,7 +726,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "found at uaddr %s\n", rbl->rpcb_map.r_addr); -+ xlog(LOG_DEBUG, "found at uaddr %s\n", rbl->rpcb_map.r_addr); - #endif - /* - * Check whether this entry is valid and a server is present -@@ -750,14 +750,14 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: rpcbind_get_conf failed\n"); - goto error; - } - localsa = local_sa(((struct sockaddr *)caller->buf)->sa_family); - if (localsa == NULL) { - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: no local address\n"); - goto error; - } -@@ -780,7 +780,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - nconf->nc_netid); - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, "merged uaddr %s\n", m_uaddr); -+ xlog(LOG_DEBUG, "merged uaddr %s\n", m_uaddr); - #endif - if ((fd = find_rmtcallfd_by_netid(nconf->nc_netid)) == -1) { - if (reply_type == RPCBPROC_INDIRECT) -@@ -800,20 +800,20 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - * beat on it any more. - */ - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: duplicate request\n"); - goto error; - case -1: - /* forward_register failed. Perhaps no memory. */ - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: forward_register failed\n"); - goto error; - } - - #ifdef DEBUG_RMTCALL - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: original XID %x, new XID %x\n", - *xidp, call_msg.rm_xid); - #endif -@@ -831,7 +831,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: No memory!\n"); - goto error; - } -@@ -843,7 +843,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: xdr_callhdr failed\n"); - goto error; - } -@@ -851,7 +851,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: xdr_u_long failed\n"); - goto error; - } -@@ -870,7 +870,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - } else { - /* we do not support any other authentication scheme */ - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: oa_flavor != AUTH_NONE and oa_flavor != AUTH_SYS\n"); - if (reply_type == RPCBPROC_INDIRECT) - svcerr_weakauth(transp); /* XXX too strong.. */ -@@ -880,7 +880,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: authwhatever_create returned NULL\n"); - goto error; - } -@@ -889,7 +889,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - svcerr_systemerr(transp); - AUTH_DESTROY(auth); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: AUTH_MARSHALL failed\n"); - goto error; - } -@@ -898,7 +898,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: xdr_opaque_parms failed\n"); - goto error; - } -@@ -918,7 +918,7 @@ rpcbproc_callit_com(struct svc_req *rqstp, SVCXPRT *transp, - if (sendto(fd, outbufp, outlen, 0, (struct sockaddr *)na->buf, na->len) - != outlen) { - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "rpcbproc_callit_com: sendto failed: errno %d\n", errno); - if (reply_type == RPCBPROC_INDIRECT) - svcerr_systemerr(transp); -@@ -1123,15 +1123,7 @@ my_svc_run() - } - nfds = p - pollfds; - poll_ret = 0; --#ifdef SVC_RUN_DEBUG -- if (debugging) { -- fprintf(stderr, "polling for read on fd < "); -- for (i = 0, p = pollfds; i < nfds; i++, p++) -- if (p->events) -- fprintf(stderr, "%d ", p->fd); -- fprintf(stderr, ">\n"); -- } --#endif -+ - switch (poll_ret = poll(pollfds, nfds, 30 * 1000)) { - case -1: - /* -@@ -1144,15 +1136,6 @@ my_svc_run() - __svc_clean_idle(&cleanfds, 30, FALSE); - continue; - default: --#ifdef SVC_RUN_DEBUG -- if (debugging) { -- fprintf(stderr, "poll returned read fds < "); -- for (i = 0, p = pollfds; i < nfds; i++, p++) -- if (p->revents) -- fprintf(stderr, "%d ", p->fd); -- fprintf(stderr, ">\n"); -- } --#endif - /* - * If we found as many replies on callback fds - * as the number of descriptors selectable which -@@ -1165,11 +1148,6 @@ my_svc_run() - continue; - svc_getreq_poll(pollfds, poll_ret-check_ret); - } --#ifdef SVC_RUN_DEBUG -- if (debugging) { -- fprintf(stderr, "svc_maxfd now %u\n", svc_maxfd); -- } --#endif - } - } - -@@ -1189,7 +1167,7 @@ check_rmtcalls(struct pollfd *pfds, int nfds) - ncallbacks_found++; - #ifdef DEBUG_RMTCALL - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "my_svc_run: polled on forwarding fd %d, netid %s - calling handle_reply\n", - pfds[j].fd, xprt->xp_netid); - #endif -@@ -1253,7 +1231,7 @@ handle_reply(int fd, SVCXPRT *xprt) - } while (inlen < 0 && errno == EINTR); - if (inlen < 0) { - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "handle_reply: recvfrom returned %d, errno %d\n", inlen, errno); - goto done; - } -@@ -1265,14 +1243,14 @@ handle_reply(int fd, SVCXPRT *xprt) - xdrmem_create(&reply_xdrs, buffer, (u_int)inlen, XDR_DECODE); - if (!xdr_replymsg(&reply_xdrs, &reply_msg)) { - if (debugging) -- (void) fprintf(stderr, -+ (void) xlog(LOG_DEBUG, - "handle_reply: xdr_replymsg failed\n"); - goto done; - } - fi = forward_find(reply_msg.rm_xid); - #ifdef SVC_RUN_DEBUG - if (debugging) { -- fprintf(stderr, "handle_reply: reply xid: %d fi addr: %p\n", -+ xlog(LOG_DEBUG, "handle_reply: reply xid: %d fi addr: %p\n", - reply_msg.rm_xid, fi); - } - #endif -@@ -1282,7 +1260,7 @@ handle_reply(int fd, SVCXPRT *xprt) - _seterr_reply(&reply_msg, &reply_error); - if (reply_error.re_status != RPC_SUCCESS) { - if (debugging) -- (void) fprintf(stderr, "handle_reply: %s\n", -+ (void) xlog(LOG_DEBUG, "handle_reply: %s\n", - clnt_sperrno(reply_error.re_status)); - send_svcsyserr(xprt, fi); - goto done; -@@ -1306,7 +1284,7 @@ done: - if (reply_msg.rm_xid == 0) { - #ifdef SVC_RUN_DEBUG - if (debugging) { -- fprintf(stderr, "handle_reply: NULL xid on exit!\n"); -+ xlog(LOG_DEBUG, "handle_reply: NULL xid on exit!\n"); - } - #endif - } else -diff --git a/src/rpcbind.c b/src/rpcbind.c -index 35c45f5..6d8bed2 100644 ---- a/src/rpcbind.c -+++ b/src/rpcbind.c -@@ -78,6 +78,7 @@ - static inline void __nss_configure_lookup(const char *db, const char *s) {} - #endif - #include "rpcbind.h" -+#include "xlog.h" - - /*#define RPCBIND_DEBUG*/ - -@@ -165,7 +166,7 @@ main(int argc, char *argv[]) - rl.rlim_cur = 128; - setrlimit(RLIMIT_NOFILE, &rl); - } -- openlog("rpcbind", LOG_CONS, LOG_DAEMON); -+ - if (geteuid()) { /* This command allowed only to root */ - fprintf(stderr, "Sorry. You are not superuser\n"); - exit(1); -@@ -190,7 +191,17 @@ main(int argc, char *argv[]) - syslog(LOG_ERR, "%s: can't find local transport\n", argv[0]); - exit(1); - } -- -+ xlog_open("rpcbind"); -+ if (dofork) { -+ xlog_syslog(TRUE); -+ xlog_stderr(FALSE); -+ } else { -+ xlog_syslog(FALSE); -+ xlog_stderr(TRUE); -+ } -+ if (debugging) -+ xlog_config(D_ALL, 1); -+ - rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrec); - - init_transport(nconf); -@@ -219,18 +230,16 @@ main(int argc, char *argv[]) - (void) signal(SIGUSR1, SIG_IGN); - (void) signal(SIGUSR2, SIG_IGN); - -- if (debugging) { - #ifdef RPCBIND_DEBUG -- printf("rpcbind debugging enabled."); -- if (doabort) { -- printf(" Will abort on errors!\n"); -- } else { -- printf("\n"); -- } -+ if (debugging) { -+ xlog(LOG_DEBUG, "debugging enabled."); -+ if (doabort) -+ xlog(LOG_DEBUG, "Will abort on errors!\n"); -+ } - #endif -- } else if (dofork) { -+ if (dofork) { - if (daemon(0, 0)) -- err(1, "fork failed"); -+ err(1, "fork failed"); - } - - if (runasdaemon || rpcbinduser) { -@@ -344,11 +353,11 @@ init_transport(struct netconfig *nconf) - int i; - char **s; - -- (void) fprintf(stderr, "%s: %ld lookup routines :\n", -+ (void) xlog(LOG_DEBUG, "%s: %ld lookup routines :\n", - nconf->nc_netid, nconf->nc_nlookups); - for (i = 0, s = nconf->nc_lookups; i < nconf->nc_nlookups; - i++, s++) -- fprintf(stderr, "[%d] - %s\n", i, *s); -+ xlog(LOG_DEBUG, "[%d] - %s\n", i, *s); - } - #endif - if (!__rpc_nconf2sockinfo(nconf, &si)) { -@@ -571,7 +580,7 @@ init_transport(struct netconfig *nconf) - } - nb.len = nb.maxlen = sa_size; - uaddr = taddr2uaddr(nconf, &nb); -- (void) fprintf(stderr, -+ (void) xlog(LOG_DEBUG, - "rpcbind : my address is %s\n", uaddr); - (void) free(uaddr); - } -@@ -654,7 +663,7 @@ init_transport(struct netconfig *nconf) - } - nb.len = nb.maxlen = sa_size2; - uaddr = taddr2uaddr(nconf, &nb); -- (void) fprintf(stderr, "rpcbind : my address is %s\n", -+ (void) xlog(LOG_DEBUG, "rpcbind : my address is %s\n", - uaddr); - (void) free(uaddr); - } -@@ -761,13 +770,13 @@ got_socket: - #ifdef RPCBIND_DEBUG - if (debugging) { - if (status < 0) { -- fprintf(stderr, "Error in finding bind status for %s\n", -+ xlog(LOG_DEBUG, "Error in finding bind status for %s\n", - nconf->nc_netid); - } else if (status == 0) { -- fprintf(stderr, "check binding for %s\n", -+ xlog(LOG_DEBUG, "check binding for %s\n", - nconf->nc_netid); - } else if (status > 0) { -- fprintf(stderr, "No check binding for %s\n", -+ xlog(LOG_DEBUG, "No check binding for %s\n", - nconf->nc_netid); - } - } -@@ -781,11 +790,11 @@ got_socket: - #ifdef RPCBIND_DEBUG - if (debugging) { - if (status < 0) { -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "Could not create rmtcall fd for %s\n", - nconf->nc_netid); - } else { -- fprintf(stderr, "rmtcall fd for %s is %d\n", -+ xlog(LOG_DEBUG, "rmtcall fd for %s is %d\n", - nconf->nc_netid, status); - } - } -@@ -810,8 +819,8 @@ rbllist_add(rpcprog_t prog, rpcvers_t vers, struct netconfig *nconf, - } - #ifdef RPCBIND_DEBUG - if (debugging){ -- fprintf(stderr,"FUNCTION rbllist_add"); -- fprintf(stderr,"Add the prog %lu vers %lu to the rpcbind list\n", -+ xlog(LOG_DEBUG,"FUNCTION rbllist_add"); -+ xlog(LOG_DEBUG,"Add the prog %lu vers %lu to the rpcbind list", - (ulong)prog, (ulong)vers); - } - #endif -diff --git a/src/security.c b/src/security.c -index d272f74..70edef4 100644 ---- a/src/security.c -+++ b/src/security.c -@@ -80,7 +80,7 @@ check_access(SVCXPRT *xprt, rpcproc_t proc, rpcprog_t prog, unsigned int rpcbver - if (!insecure && !is_loopback(caller)) { - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, " declined (non-loopback sender) \n"); -+ xlog(LOG_DEBUG, " declined (non-loopback sender) \n"); - #endif - if (verboselog) - logit(log_severity, addr, proc, prog, -@@ -134,7 +134,7 @@ is_loopback(struct netbuf *nbuf) - sin = (struct sockaddr_in *)addr; - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "Checking caller's adress (port = %d)\n", - ntohs(sin->sin_port)); - #endif -@@ -146,7 +146,7 @@ is_loopback(struct netbuf *nbuf) - sin6 = (struct sockaddr_in6 *)addr; - #ifdef RPCBIND_DEBUG - if (debugging) -- fprintf(stderr, -+ xlog(LOG_DEBUG, - "Checking caller's adress (port = %d)\n", - ntohs(sin6->sin6_port)); - #endif -diff --git a/src/xlog.c b/src/xlog.c -new file mode 100644 -index 0000000..ab6c717 ---- /dev/null -+++ b/src/xlog.c -@@ -0,0 +1,234 @@ -+/* -+ * support/nfs/xlog.c -+ * -+ * This module handles the logging of requests. -+ * -+ * TODO: Merge the two "XXX_log() calls. -+ * -+ * Authors: Donald J. Becker, -+ * Rick Sladkey, -+ * Fred N. van Kempen, -+ * Olaf Kirch, -+ * -+ * This software maybe be used for any purpose provided -+ * the above copyright notice is retained. It is supplied -+ * as is, with no warranty expressed or implied. -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "xlog.h" -+ -+#undef VERBOSE_PRINTF -+ -+static int log_stderr = 1; -+static int log_syslog = 1; -+static int logging = 0; /* enable/disable DEBUG logs */ -+static int logmask = 0; /* What will be logged */ -+static char log_name[256]; /* name of this program */ -+static int log_pid = -1; /* PID of this program */ -+ -+int export_errno = 0; -+ -+static void xlog_toggle(int sig); -+static struct xlog_debugfac debugnames[] = { -+ { "general", D_GENERAL, }, -+ { "call", D_CALL, }, -+ { "auth", D_AUTH, }, -+ { "parse", D_PARSE, }, -+ { "all", D_ALL, }, -+ { NULL, 0, }, -+}; -+ -+void -+xlog_open(char *progname) -+{ -+ openlog(progname, LOG_PID, LOG_DAEMON); -+ -+ strncpy(log_name, progname, sizeof (log_name) - 1); -+ log_name [sizeof (log_name) - 1] = '\0'; -+ log_pid = getpid(); -+ -+ signal(SIGUSR1, xlog_toggle); -+ signal(SIGUSR2, xlog_toggle); -+} -+ -+void -+xlog_stderr(int on) -+{ -+ log_stderr = on; -+} -+ -+void -+xlog_syslog(int on) -+{ -+ log_syslog = on; -+} -+ -+static void -+xlog_toggle(int sig) -+{ -+ unsigned int tmp, i; -+ -+ if (sig == SIGUSR1) { -+ if ((logmask & D_ALL) && !logging) { -+ xlog(D_GENERAL, "turned on logging"); -+ logging = 1; -+ return; -+ } -+ tmp = ~logmask; -+ logmask |= ((logmask & D_ALL) << 1) | D_GENERAL; -+ for (i = -1, tmp &= logmask; tmp; tmp >>= 1, i++) -+ if (tmp & 1) -+ xlog(D_GENERAL, -+ "turned on logging level %d", i); -+ } else { -+ xlog(D_GENERAL, "turned off logging"); -+ logging = 0; -+ } -+ signal(sig, xlog_toggle); -+} -+ -+void -+xlog_config(int fac, int on) -+{ -+ if (on) -+ logmask |= fac; -+ else -+ logmask &= ~fac; -+ if (on) -+ logging = 1; -+} -+ -+void -+xlog_sconfig(char *kind, int on) -+{ -+ struct xlog_debugfac *tbl = debugnames; -+ -+ while (tbl->df_name != NULL && strcasecmp(tbl->df_name, kind)) -+ tbl++; -+ if (!tbl->df_name) { -+ xlog (L_WARNING, "Invalid debug facility: %s\n", kind); -+ return; -+ } -+ xlog_config(tbl->df_fac, on); -+} -+ -+int -+xlog_enabled(int fac) -+{ -+ return (logging && (fac & logmask)); -+} -+ -+ -+/* Write something to the system logfile and/or stderr */ -+void -+xlog_backend(int kind, const char *fmt, va_list args) -+{ -+ va_list args2; -+ -+ if (!(kind & (L_ALL)) && !(logging && (kind & logmask))) -+ return; -+ -+ if (log_stderr) -+ va_copy(args2, args); -+ -+ if (log_syslog) { -+ switch (kind) { -+ case L_FATAL: -+ vsyslog(LOG_ERR, fmt, args); -+ break; -+ case L_ERROR: -+ vsyslog(LOG_ERR, fmt, args); -+ break; -+ case L_WARNING: -+ vsyslog(LOG_WARNING, fmt, args); -+ break; -+ case L_NOTICE: -+ vsyslog(LOG_NOTICE, fmt, args); -+ break; -+ default: -+ if (!log_stderr) -+ vsyslog(LOG_INFO, fmt, args); -+ break; -+ } -+ } -+ -+ if (log_stderr) { -+#ifdef VERBOSE_PRINTF -+ time_t now; -+ struct tm *tm; -+ -+ time(&now); -+ tm = localtime(&now); -+ fprintf(stderr, "%s[%d] %04d-%02d-%02d %02d:%02d:%02d ", -+ log_name, log_pid, -+ tm->tm_year+1900, tm->tm_mon + 1, tm->tm_mday, -+ tm->tm_hour, tm->tm_min, tm->tm_sec); -+#else -+ fprintf(stderr, "%s: ", log_name); -+#endif -+ vfprintf(stderr, fmt, args2); -+ fprintf(stderr, "\n"); -+ va_end(args2); -+ } -+ -+ if (kind == L_FATAL) -+ exit(1); -+} -+ -+void -+xlog(int kind, const char* fmt, ...) -+{ -+ va_list args; -+ -+ if (kind & (L_ERROR|D_GENERAL)) -+ export_errno = 1; -+ -+ va_start(args, fmt); -+ xlog_backend(kind, fmt, args); -+ va_end(args); -+} -+ -+void -+xlog_warn(const char* fmt, ...) -+{ -+ va_list args; -+ -+ va_start(args, fmt); -+ xlog_backend(L_WARNING, fmt, args); -+ va_end(args); -+} -+ -+ -+void -+xlog_err(const char* fmt, ...) -+{ -+ va_list args; -+ -+ va_start(args, fmt); -+ xlog_backend(L_FATAL, fmt, args); -+ va_end(args); -+} -+ -+void -+xlog_errno(int err, const char *fmt, ...) -+{ -+ va_list args; -+ -+ errno = err; -+ va_start(args, fmt); -+ xlog_backend(L_FATAL, fmt, args); -+ va_end(args); -+} -diff --git a/src/xlog.h b/src/xlog.h -new file mode 100644 -index 0000000..a57b96c ---- /dev/null -+++ b/src/xlog.h -@@ -0,0 +1,52 @@ -+/* -+ * xlog Logging functionality -+ * -+ * Copyright (C) 1995 Olaf Kirch -+ */ -+ -+#ifndef XLOG_H -+#define XLOG_H -+ -+#include -+ -+/* These are logged always. L_FATAL also does exit(1) */ -+#define L_FATAL 0x0100 -+#define L_ERROR 0x0200 -+#define L_WARNING 0x0400 -+#define L_NOTICE 0x0800 -+#define L_ALL 0xFF00 -+ -+/* These are logged if enabled with xlog_[s]config */ -+/* NB: code does not expect ORing together D_ and L_ */ -+#define D_GENERAL 0x0001 /* general debug info */ -+#define D_CALL 0x0002 -+#define D_AUTH 0x0004 -+#define D_FAC3 0x0008 -+#define D_FAC4 0x0010 -+#define D_FAC5 0x0020 -+#define D_PARSE 0x0040 -+#define D_FAC7 0x0080 -+#define D_ALL 0x00FF -+ -+/* This can be used to define symbolic log names that can be passed to -+ * xlog_config. -+ */ -+struct xlog_debugfac { -+ char *df_name; -+ int df_fac; -+}; -+ -+extern int export_errno; -+void xlog_open(char *progname); -+void xlog_stderr(int on); -+void xlog_syslog(int on); -+void xlog_config(int fac, int on); -+void xlog_sconfig(char *, int on); -+int xlog_enabled(int fac); -+void xlog(int fac, const char *fmt, ...); -+void xlog_warn(const char *fmt, ...); -+void xlog_err(const char *fmt, ...); -+void xlog_errno(int err, const char *fmt, ...); -+void xlog_backend(int fac, const char *fmt, va_list args); -+ -+#endif /* XLOG_H */ diff --git a/rpcbind-0.2.3-rc1.patch b/rpcbind-0.2.3-rc1.patch deleted file mode 100644 index 3fecb51..0000000 --- a/rpcbind-0.2.3-rc1.patch +++ /dev/null @@ -1,113 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index c99566d..ea5725f 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -13,7 +13,7 @@ AM_CPPFLAGS = \ - $(TIRPC_CFLAGS) - - if DEBUG --AM_CPPFLAGS += -DRPCBIND_DEBUG -DSVC_RUN_DEBUG -DDEBUG_RMTCALL -+AM_CPPFLAGS += -DRPCBIND_DEBUG -DDEBUG_RMTCALL - AM_CPPFLAGS += -DND_DEBUG -DBIND_DEBUG - endif - -diff --git a/configure.ac b/configure.ac -index 75e7e71..27496c7 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -55,4 +55,6 @@ AS_IF([test x$enable_libwrap = xyes], [ - - AC_SEARCH_LIBS([pthread_create], [pthread]) - -+AC_CHECK_HEADERS(nss.h) -+ - AC_OUTPUT([Makefile]) -diff --git a/src/rpcbind.c b/src/rpcbind.c -index f7c71ee..0c81e8c 100644 ---- a/src/rpcbind.c -+++ b/src/rpcbind.c -@@ -50,6 +50,7 @@ - #include - #include - #include -+#include - #include - #include - #ifdef PORTMAP -@@ -268,6 +269,13 @@ main(int argc, char *argv[]) - - network_init(); - -+#ifdef SYSTEMD -+ /* Try to notify system of successful startup, regardless of whether we -+ * used systemd socket activation or not. When started from the command -+ * line, this should not hurt either. -+ */ -+ sd_notify(0, "READY=1"); -+#endif - my_svc_run(); - syslog(LOG_ERR, "svc_run returned unexpectedly"); - rpcbind_abort(); -@@ -277,6 +285,31 @@ main(int argc, char *argv[]) - } - - /* -+ * Normally systemd will open sockets in dual ipv4/ipv6 mode. -+ * That won't work with netconfig and we'll only match -+ * the ipv6 socket. Convert it to IPV6_V6ONLY and issue -+ * a warning for the user to fix their systemd config. -+ */ -+static int -+handle_ipv6_socket(int fd) -+{ -+ int opt; -+ socklen_t len = sizeof(opt); -+ -+ if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &opt, &len)) { -+ syslog(LOG_ERR, "failed to get ipv6 socket opts: %m"); -+ return -1; -+ } -+ -+ if (opt) /* socket is already in V6ONLY mode */ -+ return 0; -+ -+ syslog(LOG_ERR, "systemd has passed an IPv4/IPv6 dual-mode socket."); -+ syslog(LOG_ERR, "Please fix your systemd config by specifying IPv4 and IPv6 sockets separately and using BindIPv6Only=ipv6-only."); -+ return -1; -+} -+ -+/* - * Adds the entry into the rpcbind database. - * If PORTMAP, then for UDP and TCP, it adds the entries for version 2 also - * Returns 0 if succeeds, else fails -@@ -361,6 +394,9 @@ init_transport(struct netconfig *nconf) - goto error; - } - -+ if (sa.sa.sa_family == AF_INET6 && handle_ipv6_socket(fd)) -+ goto error; -+ - /* Copy the address */ - taddr.addr.maxlen = taddr.addr.len = addrlen; - taddr.addr.buf = malloc(addrlen); -diff --git a/src/warmstart.c b/src/warmstart.c -index d1bb971..85ecf96 100644 ---- a/src/warmstart.c -+++ b/src/warmstart.c -@@ -101,13 +101,13 @@ read_struct(char *filename, xdrproc_t structproc, void *list) - { - FILE *fp; - XDR xdrs; -- -+ - if (debugging) - fprintf(stderr, "rpcbind: using '%s' startup file\n", filename); - -- if ((fp = fopen(filename, "r")) == NULL) { -+ if (((fp = fopen(filename, "r")) == NULL) && errno != ENOENT) { - syslog(LOG_ERR, -- "Cannot open '%s' file for reading, errno %d (%s)", -+ "Cannot open '%s' file for reading, errno %d (%s)", - filename, errno, strerror(errno)); - goto error; - } diff --git a/rpcbind-0.2.3-rc2.patch b/rpcbind-0.2.3-rc2.patch deleted file mode 100644 index 3027d66..0000000 --- a/rpcbind-0.2.3-rc2.patch +++ /dev/null @@ -1,523 +0,0 @@ -diff --git a/Makefile.am b/Makefile.am -index c99566d..ea5725f 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -13,7 +13,7 @@ AM_CPPFLAGS = \ - $(TIRPC_CFLAGS) - - if DEBUG --AM_CPPFLAGS += -DRPCBIND_DEBUG -DSVC_RUN_DEBUG -DDEBUG_RMTCALL -+AM_CPPFLAGS += -DRPCBIND_DEBUG -DDEBUG_RMTCALL - AM_CPPFLAGS += -DND_DEBUG -DBIND_DEBUG - endif - -diff --git a/configure.ac b/configure.ac -index 75e7e71..27496c7 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -55,4 +55,6 @@ AS_IF([test x$enable_libwrap = xyes], [ - - AC_SEARCH_LIBS([pthread_create], [pthread]) - -+AC_CHECK_HEADERS(nss.h) -+ - AC_OUTPUT([Makefile]) -diff --git a/src/rpcbind.c b/src/rpcbind.c -index f7c71ee..35c45f5 100644 ---- a/src/rpcbind.c -+++ b/src/rpcbind.c -@@ -50,6 +50,7 @@ - #include - #include - #include -+#include - #include - #include - #ifdef PORTMAP -@@ -268,6 +269,13 @@ main(int argc, char *argv[]) - - network_init(); - -+#ifdef SYSTEMD -+ /* Try to notify system of successful startup, regardless of whether we -+ * used systemd socket activation or not. When started from the command -+ * line, this should not hurt either. -+ */ -+ sd_notify(0, "READY=1"); -+#endif - my_svc_run(); - syslog(LOG_ERR, "svc_run returned unexpectedly"); - rpcbind_abort(); -@@ -277,6 +285,31 @@ main(int argc, char *argv[]) - } - - /* -+ * Normally systemd will open sockets in dual ipv4/ipv6 mode. -+ * That won't work with netconfig and we'll only match -+ * the ipv6 socket. Convert it to IPV6_V6ONLY and issue -+ * a warning for the user to fix their systemd config. -+ */ -+static int -+handle_ipv6_socket(int fd) -+{ -+ int opt; -+ socklen_t len = sizeof(opt); -+ -+ if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &opt, &len)) { -+ syslog(LOG_ERR, "failed to get ipv6 socket opts: %m"); -+ return -1; -+ } -+ -+ if (opt) /* socket is already in V6ONLY mode */ -+ return 0; -+ -+ syslog(LOG_ERR, "systemd has passed an IPv4/IPv6 dual-mode socket."); -+ syslog(LOG_ERR, "Please fix your systemd config by specifying IPv4 and IPv6 sockets separately and using BindIPv6Only=ipv6-only."); -+ return -1; -+} -+ -+/* - * Adds the entry into the rpcbind database. - * If PORTMAP, then for UDP and TCP, it adds the entries for version 2 also - * Returns 0 if succeeds, else fails -@@ -361,6 +394,9 @@ init_transport(struct netconfig *nconf) - goto error; - } - -+ if (sa.sa.sa_family == AF_INET6 && handle_ipv6_socket(fd)) -+ goto error; -+ - /* Copy the address */ - taddr.addr.maxlen = taddr.addr.len = addrlen; - taddr.addr.buf = malloc(addrlen); -@@ -389,18 +425,6 @@ init_transport(struct netconfig *nconf) - if (my_xprt != NULL) - goto got_socket; - -- /* -- * 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 ((strcmp(nconf->nc_netid, "local") == 0) || - (strcmp(nconf->nc_netid, "unix") == 0)) { - memset(&sun, 0, sizeof sun); -@@ -451,11 +475,13 @@ init_transport(struct netconfig *nconf) - nconf->nc_netid); - return (1); - } -+ -+ hints.ai_flags &= ~AI_NUMERICHOST; - switch (hints.ai_family) { - case AF_INET: - if (inet_pton(AF_INET, hosts[nhostsbak], - host_addr) == 1) { -- hints.ai_flags &= AI_NUMERICHOST; -+ hints.ai_flags |= AI_NUMERICHOST; - } else { - /* - * Skip if we have an AF_INET6 adress. -@@ -468,7 +494,7 @@ init_transport(struct netconfig *nconf) - case AF_INET6: - if (inet_pton(AF_INET6, hosts[nhostsbak], - host_addr) == 1) { -- hints.ai_flags &= AI_NUMERICHOST; -+ hints.ai_flags |= AI_NUMERICHOST; - } else { - /* - * Skip if we have an AF_INET adress. -@@ -561,6 +587,12 @@ init_transport(struct netconfig *nconf) - if (!checkbind) - return 1; - } else { /* NC_TPI_COTS */ -+ if ((fd = __rpc_nconf2fd(nconf)) < 0) { -+ syslog(LOG_ERR, "cannot create socket for %s", -+ nconf->nc_netid); -+ return (1); -+ } -+ - if ((strcmp(nconf->nc_netid, "local") != 0) && - (strcmp(nconf->nc_netid, "unix") != 0)) { - if ((aicode = getaddrinfo(NULL, servname, &hints, &res))!= 0) { -diff --git a/src/rpcinfo.c b/src/rpcinfo.c -index 747eba3..9b46864 100644 ---- a/src/rpcinfo.c -+++ b/src/rpcinfo.c -@@ -115,10 +115,8 @@ struct rpcbdump_short - - #ifdef PORTMAP - static void ip_ping (u_short, char *, int, char **); --static CLIENT *clnt_com_create (struct sockaddr_in *, u_long, u_long, int *, -- char *); - static void pmapdump (int, char **); --static void get_inet_address (struct sockaddr_in *, char *); -+static CLIENT *ip_getclient(const char *hostname, rpcprog_t prognum, rpcvers_t versnum, const char *proto); - #endif - - static bool_t reply_proc (void *, struct netbuf *, struct netconfig *); -@@ -356,38 +354,17 @@ local_rpcb (rpcprog_t prog, rpcvers_t vers) - } - - #ifdef PORTMAP --static CLIENT * --clnt_com_create (addr, prog, vers, fdp, trans) -- struct sockaddr_in *addr; -- u_long prog; -- u_long vers; -- int *fdp; -- char *trans; -+static enum clnt_stat -+ip_ping_one(client, vers) -+ CLIENT *client; -+ u_int32_t vers; - { -- CLIENT *clnt; -- -- if (strcmp (trans, "tcp") == 0) -- { -- clnt = clnttcp_create (addr, prog, vers, fdp, 0, 0); -- } -- else -- { -- struct timeval to; -+ struct timeval to = { .tv_sec = 10, .tv_usec = 0 }; - -- to.tv_sec = 5; -- to.tv_usec = 0; -- clnt = clntudp_create (addr, prog, vers, to, fdp); -- } -- if (clnt == (CLIENT *) NULL) -- { -- clnt_pcreateerror ("rpcinfo"); -- if (vers == MIN_VERS) -- printf ("program %lu is not available\n", prog); -- else -- printf ("program %lu version %lu is not available\n", prog, vers); -- exit (1); -- } -- return (clnt); -+ (void) CLNT_CONTROL (client, CLSET_VERS, &vers); -+ return CLNT_CALL (client, NULLPROC, (xdrproc_t) xdr_void, -+ (char *) NULL, (xdrproc_t) xdr_void, (char *) NULL, -+ to); - } - - /* -@@ -398,17 +375,15 @@ clnt_com_create (addr, prog, vers, fdp, trans) - * version 0 calls succeeds, it tries for MAXVERS call and repeats the same. - */ - static void --ip_ping (portnum, trans, argc, argv) -+ip_ping (portnum, proto, argc, argv) - u_short portnum; -- char *trans; -+ char *proto; - int argc; - char **argv; - { - CLIENT *client; -- int fd = RPC_ANYFD; -- struct timeval to; -- struct sockaddr_in addr; - enum clnt_stat rpc_stat; -+ const char *hostname; - u_long prognum, vers, minvers, maxvers; - struct rpc_err rpcerr; - int failure = 0; -@@ -418,10 +393,9 @@ ip_ping (portnum, trans, argc, argv) - usage (); - exit (1); - } -- to.tv_sec = 10; -- to.tv_usec = 0; -+ -+ hostname = argv[0]; - prognum = getprognum (argv[1]); -- get_inet_address (&addr, argv[0]); - if (argc == 2) - { /* Version number not known */ - /* -@@ -434,11 +408,10 @@ ip_ping (portnum, trans, argc, argv) - { - vers = getvers (argv[2]); - } -- addr.sin_port = htons (portnum); -- client = clnt_com_create (&addr, prognum, vers, &fd, trans); -- rpc_stat = CLNT_CALL (client, NULLPROC, (xdrproc_t) xdr_void, -- (char *) NULL, (xdrproc_t) xdr_void, (char *) NULL, -- to); -+ -+ client = ip_getclient(hostname, prognum, vers, proto); -+ -+ rpc_stat = ip_ping_one(client, vers); - if (argc != 2) - { - /* Version number was known */ -@@ -447,8 +420,8 @@ ip_ping (portnum, trans, argc, argv) - (void) CLNT_DESTROY (client); - return; - } -+ - /* Version number not known */ -- (void) CLNT_CONTROL (client, CLSET_FD_NCLOSE, (char *) NULL); - if (rpc_stat == RPC_PROGVERSMISMATCH) - { - clnt_geterr (client, &rpcerr); -@@ -461,12 +434,7 @@ ip_ping (portnum, trans, argc, argv) - * Oh dear, it DOES support version 0. - * Let's try version MAX_VERS. - */ -- (void) CLNT_DESTROY (client); -- addr.sin_port = htons (portnum); -- client = clnt_com_create (&addr, prognum, MAX_VERS, &fd, trans); -- rpc_stat = CLNT_CALL (client, NULLPROC, (xdrproc_t) xdr_void, -- (char *) NULL, (xdrproc_t) xdr_void, -- (char *) NULL, to); -+ rpc_stat = ip_ping_one(client, MAX_VERS); - if (rpc_stat == RPC_PROGVERSMISMATCH) - { - clnt_geterr (client, &rpcerr); -@@ -495,21 +463,15 @@ ip_ping (portnum, trans, argc, argv) - (void) pstatus (client, prognum, (u_long) 0); - exit (1); - } -- (void) CLNT_DESTROY (client); - for (vers = minvers; vers <= maxvers; vers++) - { -- addr.sin_port = htons (portnum); -- client = clnt_com_create (&addr, prognum, vers, &fd, trans); -- rpc_stat = CLNT_CALL (client, NULLPROC, (xdrproc_t) xdr_void, -- (char *) NULL, (xdrproc_t) xdr_void, -- (char *) NULL, to); -+ rpc_stat = ip_ping_one(client, vers); - if (pstatus (client, prognum, vers) < 0) - failure = 1; -- (void) CLNT_DESTROY (client); - } - if (failure) - exit (1); -- (void) close (fd); -+ (void) CLNT_DESTROY (client); - return; - } - -@@ -521,9 +483,7 @@ pmapdump (argc, argv) - int argc; - char **argv; - { -- struct sockaddr_in server_addr; - struct pmaplist *head = NULL; -- int socket = RPC_ANYSOCK; - struct timeval minutetimeout; - register CLIENT *client; - struct rpcent *rpc; -@@ -539,10 +499,13 @@ pmapdump (argc, argv) - if (argc == 1) - { - host = argv[0]; -- get_inet_address (&server_addr, host); -- server_addr.sin_port = htons (PMAPPORT); -- client = clnttcp_create (&server_addr, PMAPPROG, PMAPVERS, -- &socket, 50, 500); -+ -+ /* This is a little bit more complicated than it should be. -+ * ip_getclient will do an rpcb_getaddr call to identify the -+ * port of the portmapper - but it works, and it's easier than -+ * creating a copy of ip_getclient that avoids the getaddr call. -+ */ -+ client = ip_getclient(host, PMAPPROG, PMAPVERS, "tcp"); - } - else - client = local_rpcb (PMAPPROG, PMAPVERS); -@@ -609,48 +572,74 @@ pmapdump (argc, argv) - } - } - --static void --get_inet_address (addr, host) -- struct sockaddr_in *addr; -- char *host; -+/* -+ * Try to obtain the address of a given host/program/version, using the -+ * specified protocol (one of udp or tcp). -+ * This loops over all netconfig entries (according to the order given by -+ * netpath and the config file), and tries to resolve the hostname, and obtain -+ * the address using rpcb_getaddr. -+ */ -+CLIENT * -+ip_getclient(hostname, prognum, versnum, proto) -+ const char *hostname; -+ rpcprog_t prognum; -+ rpcvers_t versnum; -+ const char *proto; - { -- struct netconfig *nconf; -- struct addrinfo hints, *res; -- int error; -+ void *handle; -+ enum clnt_stat saved_stat = RPC_SUCCESS; -+ struct netconfig *nconf, *result = NULL; -+ struct netbuf bind_address; -+ struct sockaddr_storage __sa; -+ CLIENT *client; -+ -+ memset(&bind_address, 0, sizeof(bind_address)); -+ bind_address.maxlen = sizeof(__sa); -+ bind_address.buf = &__sa; - -- (void) memset ((char *) addr, 0, sizeof (*addr)); -- addr->sin_addr.s_addr = inet_addr (host); -- if (addr->sin_addr.s_addr == -1 || addr->sin_addr.s_addr == 0) -+ handle = setnetconfig(); -+ while ((nconf = getnetconfig(handle)) != NULL) - { -- if ((nconf = __rpc_getconfip ("udp")) == NULL && -- (nconf = __rpc_getconfip ("tcp")) == NULL) -- { -- fprintf (stderr, "rpcinfo: couldn't find a suitable transport\n"); -- exit (1); -- } -+ if (!strcmp(nconf->nc_proto, proto)) { -+ if (rpcb_getaddr(prognum, versnum, nconf, &bind_address, hostname)) -+ { -+ result = getnetconfigent(nconf->nc_netid); -+ endnetconfig(handle); -+ break; -+ } -+ -+ if (rpc_createerr.cf_stat != RPC_UNKNOWNHOST) -+ { -+ clnt_pcreateerror (hostname); -+ exit (1); -+ } -+ -+ saved_stat = rpc_createerr.cf_stat; -+ } -+ } -+ -+ if (result == NULL) -+ { -+ if (saved_stat != RPC_SUCCESS) -+ { -+ rpc_createerr.cf_stat = saved_stat; -+ clnt_pcreateerror (hostname); -+ } - else -- { -- memset (&hints, 0, sizeof hints); -- hints.ai_family = AF_INET; -- if ((error = getaddrinfo (host, "rpcbind", &hints, &res)) != 0 && -- (error = getaddrinfo (host, "portmapper", &hints, &res)) != 0) -- { -- fprintf (stderr, "rpcinfo: %s: %s\n", -- host, gai_strerror (error)); -- exit (1); -- } -- else -- { -- memcpy (addr, res->ai_addr, res->ai_addrlen); -- freeaddrinfo (res); -- } -- (void) freenetconfigent (nconf); -- } -+ fprintf (stderr, "Cannot find suitable transport for protocol %s\n", proto); -+ -+ exit (1); - } -- else -+ -+ client = clnt_tli_create(RPC_ANYFD, result, &bind_address, prognum, versnum, 0, 0); -+ if (client == NULL) - { -- addr->sin_family = AF_INET; -+ clnt_pcreateerror(hostname); -+ exit (1); - } -+ -+ freenetconfigent(result); -+ return client; - } - #endif /* PORTMAP */ - -diff --git a/src/util.c b/src/util.c -index 7d56479..a6c835b 100644 ---- a/src/util.c -+++ b/src/util.c -@@ -71,9 +71,6 @@ static struct sockaddr_in6 *local_in6; - #endif - - static int bitmaskcmp __P((void *, void *, void *, int)); --#ifdef INET6 --static void in6_fillscopeid __P((struct sockaddr_in6 *)); --#endif - - /* - * For all bits set in "mask", compare the corresponding bits in -@@ -93,28 +90,6 @@ bitmaskcmp(void *dst, void *src, void *mask, int bytelen) - } - - /* -- * Similar to code in ifconfig.c. Fill in the scope ID for link-local -- * addresses returned by getifaddrs(). -- */ --#ifdef INET6 --static void --in6_fillscopeid(struct sockaddr_in6 *sin6) --{ -- u_int16_t ifindex; -- u_int16_t *addr; -- -- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { -- 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; -- *addr = 0; -- } -- } --} --#endif -- --/* - * Find a server address that can be used by `caller' to contact - * the local service specified by `serv_uaddr'. If `clnt_uaddr' is - * non-NULL, it is used instead of `caller' as a hint suggesting -@@ -211,7 +186,6 @@ addrmerge(struct netbuf *caller, char *serv_uaddr, char *clnt_uaddr, - * a link-local address then use the scope id to see - * which one. - */ -- in6_fillscopeid(SA2SIN6(ifsa)); - if (IN6_IS_ADDR_LINKLOCAL(&SA2SIN6ADDR(ifsa)) && - IN6_IS_ADDR_LINKLOCAL(&SA2SIN6ADDR(caller_sa)) && - IN6_IS_ADDR_LINKLOCAL(&SA2SIN6ADDR(hint_sa))) { -diff --git a/src/warmstart.c b/src/warmstart.c -index d1bb971..b6eb73e 100644 ---- a/src/warmstart.c -+++ b/src/warmstart.c -@@ -101,14 +101,15 @@ read_struct(char *filename, xdrproc_t structproc, void *list) - { - FILE *fp; - XDR xdrs; -- -+ - if (debugging) - fprintf(stderr, "rpcbind: using '%s' startup file\n", filename); - - if ((fp = fopen(filename, "r")) == NULL) { -- syslog(LOG_ERR, -- "Cannot open '%s' file for reading, errno %d (%s)", -- filename, errno, strerror(errno)); -+ if (errno != ENOENT) -+ syslog(LOG_ERR, -+ "Cannot open '%s' file for reading, errno %d (%s)", -+ filename, errno, strerror(errno)); - goto error; - } - diff --git a/rpcbind-0_2_1-rc3.patch b/rpcbind-0_2_1-rc3.patch deleted file mode 100644 index ff46f67..0000000 --- a/rpcbind-0_2_1-rc3.patch +++ /dev/null @@ -1,1054 +0,0 @@ -diff --git a/.gitignore b/.gitignore -index 5a7546c..bee4bab 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -1,3 +1,4 @@ -+INSTALL - Makefile - Makefile.in - aclocal.m4 -@@ -13,18 +14,14 @@ depcomp - install-sh - libtool - ltmain.sh --man/Makefile --man/Makefile.in - missing --src/.deps/ --src/Makefile --src/Makefile.in - src/config.h - src/stamp-h2 - stamp-h1 - # file generated during compilation -+.deps - *.o --src/rpcbind --src/rpcinfo -+rpcbind -+rpcinfo - # cscope database files - cscope.* -diff --git a/INSTALL b/INSTALL -index 98e5d87..7d1c323 100644 ---- a/INSTALL -+++ b/INSTALL -@@ -1,32 +1,25 @@ --Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software --Foundation, Inc. -+Installation Instructions -+************************* - -- This file is free documentation; the Free Software Foundation gives --unlimited permission to copy, distribute and modify it. -- -- --rpcbind Quick Installation --========================== -- --$ ./configure --$ make --# make install -- -- The install phase will install the rpcbind and rpcinfo commands --under /usr/bin. If you wish they replace the basic portmap and --rpcinfo commands, you can run: -- --# mv /sbin/portmap /sbin/portmap.sav --# ln -s /usr/bin/rpcbind /sbin/portmap -- --# mv /usr/sbin/rpcinfo /usr/sbin/rpcinfo.sav --# ln -s /usr/bin/rpcinfo /usr/sbin/rpcinfo -+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -+2006, 2007, 2008, 2009 Free Software Foundation, Inc. - -+ Copying and distribution of this file, with or without modification, -+are permitted in any medium without royalty provided the copyright -+notice and this notice are preserved. This file is offered as-is, -+without warranty of any kind. - - Basic Installation - ================== - -- These are generic installation instructions. -+ Briefly, the shell commands `./configure; make; make install' should -+configure, build, and install this package. The following -+more-detailed instructions are generic; see the `README' file for -+instructions specific to this package. Some packages provide this -+`INSTALL' file but do not implement all of the features documented -+below. The lack of an optional feature in a given package is not -+necessarily a bug. More recommendations for GNU packages can be found -+in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for - various system-dependent variables used during compilation. It uses -@@ -39,9 +32,9 @@ debugging `configure'). - - It can also use an optional file (typically called `config.cache' - and enabled with `--cache-file=config.cache' or simply `-C') that saves --the results of its tests to speed up reconfiguring. (Caching is -+the results of its tests to speed up reconfiguring. Caching is - disabled by default to prevent problems with accidental use of stale --cache files.) -+cache files. - - If you need to do unusual things to compile the package, please try - to figure out how `configure' could check whether to do them, and mail -@@ -51,30 +44,37 @@ some point `config.cache' contains results you don't want to keep, you - may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create --`configure' by a program called `autoconf'. You only need --`configure.ac' if you want to change it or regenerate `configure' using --a newer version of `autoconf'. -+`configure' by a program called `autoconf'. You need `configure.ac' if -+you want to change it or regenerate `configure' using a newer version -+of `autoconf'. - --The simplest way to compile this package is: -+ The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type -- `./configure' to configure the package for your system. If you're -- using `csh' on an old version of System V, you might need to type -- `sh ./configure' instead to prevent `csh' from trying to execute -- `configure' itself. -+ `./configure' to configure the package for your system. - -- Running `configure' takes awhile. While running, it prints some -- messages telling which features it is checking for. -+ Running `configure' might take a while. While running, it prints -+ some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with -- the package. -+ the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and -- documentation. -- -- 5. You can remove the program binaries and object files from the -+ documentation. When installing into a prefix owned by root, it is -+ recommended that the package be configured and built as a regular -+ user, and only the `make install' phase executed with root -+ privileges. -+ -+ 5. Optionally, type `make installcheck' to repeat any self-tests, but -+ this time using the binaries in their final installed location. -+ This target does not install anything. Running this target as a -+ regular user, particularly if the prior `make install' required -+ root privileges, verifies that the installation completed -+ correctly. -+ -+ 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is -@@ -83,6 +83,16 @@ The simplest way to compile this package is: - all sorts of other programs in order to regenerate files that came - with the distribution. - -+ 7. Often, you can also type `make uninstall' to remove the installed -+ files again. In practice, not all packages have tested that -+ uninstallation works correctly, even though it is required by the -+ GNU Coding Standards. -+ -+ 8. Some packages, particularly those that use Automake, provide `make -+ distcheck', which can by used by developers to test that all other -+ targets like `make install' and `make uninstall' work correctly. -+ This target is generally not run by end users. -+ - Compilers and Options - ===================== - -@@ -94,7 +104,7 @@ for details on some of the pertinent environment variables. - by setting variables in the command line or in the environment. Here - is an example: - -- ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix -+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -@@ -103,44 +113,89 @@ Compiling For Multiple Architectures - - You can compile the package for more than one kind of computer at the - same time, by placing the object files for each architecture in their --own directory. To do this, you must use a version of `make' that --supports the `VPATH' variable, such as GNU `make'. `cd' to the -+own directory. To do this, you can use GNU `make'. `cd' to the - directory where you want the object files and executables to go and run - the `configure' script. `configure' automatically checks for the --source code in the directory that `configure' is in and in `..'. -+source code in the directory that `configure' is in and in `..'. This -+is known as a "VPATH" build. - -- If you have to use a `make' that does not support the `VPATH' --variable, you have to compile the package for one architecture at a --time in the source code directory. After you have installed the --package for one architecture, use `make distclean' before reconfiguring --for another architecture. -+ With a non-GNU `make', it is safer to compile the package for one -+architecture at a time in the source code directory. After you have -+installed the package for one architecture, use `make distclean' before -+reconfiguring for another architecture. -+ -+ On MacOS X 10.5 and later systems, you can create libraries and -+executables that work on multiple system types--known as "fat" or -+"universal" binaries--by specifying multiple `-arch' options to the -+compiler but only a single `-arch' option to the preprocessor. Like -+this: -+ -+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ -+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ -+ CPP="gcc -E" CXXCPP="g++ -E" -+ -+ This is not guaranteed to produce working output in all cases, you -+may have to build one architecture at a time and combine the results -+using the `lipo' tool if you have problems. - - Installation Names - ================== - -- By default, `make install' will install the package's files in --`/usr/local/bin', `/usr/local/man', etc. You can specify an --installation prefix other than `/usr/local' by giving `configure' the --option `--prefix=PATH'. -+ By default, `make install' installs the package's commands under -+`/usr/local/bin', include files under `/usr/local/include', etc. You -+can specify an installation prefix other than `/usr/local' by giving -+`configure' the option `--prefix=PREFIX', where PREFIX must be an -+absolute file name. - - You can specify separate installation prefixes for - architecture-specific files and architecture-independent files. If you --give `configure' the option `--exec-prefix=PATH', the package will use --PATH as the prefix for installing programs and libraries. --Documentation and other data files will still use the regular prefix. -+pass the option `--exec-prefix=PREFIX' to `configure', the package uses -+PREFIX as the prefix for installing programs and libraries. -+Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give --options like `--bindir=PATH' to specify different values for particular -+options like `--bindir=DIR' to specify different values for particular - kinds of files. Run `configure --help' for a list of the directories --you can set and what kinds of files go in them. -+you can set and what kinds of files go in them. In general, the -+default for these options is expressed in terms of `${prefix}', so that -+specifying just `--prefix' will affect all of the other directory -+specifications that were not explicitly provided. -+ -+ The most portable way to affect installation locations is to pass the -+correct locations to `configure'; however, many packages provide one or -+both of the following shortcuts of passing variable assignments to the -+`make install' command line to change installation locations without -+having to reconfigure or recompile. -+ -+ The first method involves providing an override variable for each -+affected directory. For example, `make install -+prefix=/alternate/directory' will choose an alternate location for all -+directory configuration variables that were expressed in terms of -+`${prefix}'. Any directories that were specified during `configure', -+but not in terms of `${prefix}', must each be overridden at install -+time for the entire installation to be relocated. The approach of -+makefile variable overrides for each directory variable is required by -+the GNU Coding Standards, and ideally causes no recompilation. -+However, some platforms have known limitations with the semantics of -+shared libraries that end up requiring recompilation when using this -+method, particularly noticeable in packages that use GNU Libtool. -+ -+ The second method involves providing the `DESTDIR' variable. For -+example, `make install DESTDIR=/alternate/directory' will prepend -+`/alternate/directory' before all installation names. The approach of -+`DESTDIR' overrides is not required by the GNU Coding Standards, and -+does not work on platforms that have drive letters. On the other hand, -+it does better at avoiding recompilation issues, and works well even -+when some directory options were not specified in terms of `${prefix}' -+at `configure' time. -+ -+Optional Features -+================= - - If the package supports it, you can cause programs to be installed - with an extra prefix or suffix on their names by giving `configure' the - option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - --Optional Features --================= -- - Some packages pay attention to `--enable-FEATURE' options to - `configure', where FEATURE indicates an optional part of the package. - They may also pay attention to `--with-PACKAGE' options, where PACKAGE -@@ -153,6 +208,45 @@ find the X include and library files automatically, but if it doesn't, - you can use the `configure' options `--x-includes=DIR' and - `--x-libraries=DIR' to specify their locations. - -+ Some packages offer the ability to configure how verbose the -+execution of `make' will be. For these packages, running `./configure -+--enable-silent-rules' sets the default to minimal output, which can be -+overridden with `make V=1'; while running `./configure -+--disable-silent-rules' sets the default to verbose, which can be -+overridden with `make V=0'. -+ -+Particular systems -+================== -+ -+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU -+CC is not installed, it is recommended to use the following options in -+order to use an ANSI C compiler: -+ -+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" -+ -+and if that doesn't work, install pre-built binaries of GCC for HP-UX. -+ -+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -+parse its `' header file. The option `-nodtk' can be used as -+a workaround. If GNU CC is not installed, it is therefore recommended -+to try -+ -+ ./configure CC="cc" -+ -+and if that doesn't work, try -+ -+ ./configure CC="cc -nodtk" -+ -+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This -+directory contains several dysfunctional programs; working variants of -+these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -+in your `PATH', put it _after_ `/usr/bin'. -+ -+ On Haiku, software installed for all users goes in `/boot/common', -+not `/usr/local'. It is recommended to use the following options: -+ -+ ./configure --prefix=/boot/common -+ - Specifying the System Type - ========================== - -@@ -168,14 +262,15 @@ type, such as `sun4', or a canonical name which has the form: - - where SYSTEM can have one of these forms: - -- OS KERNEL-OS -+ OS -+ KERNEL-OS - - See the file `config.sub' for the possible values of each field. If - `config.sub' isn't included in this package, then this package doesn't - need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should --use the `--target=TYPE' option to select the type of system they will -+use the option `--target=TYPE' to select the type of system they will - produce code for. - - If you want to _use_ a cross compiler, that generates code for a -@@ -205,9 +300,14 @@ them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - --will cause the specified gcc to be used as the C compiler (unless it is -+causes the specified `gcc' to be used as the C compiler (unless it is - overridden in the site shell script). - -+Unfortunately, this technique does not work for `CONFIG_SHELL' due to -+an Autoconf bug. Until the bug is fixed you can use this workaround: -+ -+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash -+ - `configure' Invocation - ====================== - -@@ -216,7 +316,14 @@ operates. - - `--help' - `-h' -- Print a summary of the options to `configure', and exit. -+ Print a summary of all of the options to `configure', and exit. -+ -+`--help=short' -+`--help=recursive' -+ Print a summary of the options unique to this package's -+ `configure', and exit. The `short' variant lists options used -+ only in the top level, while the `recursive' variant lists options -+ also present in any nested packages. - - `--version' - `-V' -@@ -243,6 +350,16 @@ operates. - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -+`--prefix=DIR' -+ Use DIR as the installation prefix. *note Installation Names:: -+ for more details, including other options available for fine-tuning -+ the installation locations. -+ -+`--no-create' -+`-n' -+ Run the configure checks, but stop before creating any output -+ files. -+ - `configure' also accepts some other, not widely useful, options. Run - `configure --help' for more details. - -diff --git a/Makefile.am b/Makefile.am -index cd56148..9fa608e 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -1,2 +1,44 @@ --SUBDIRS= src man -+AM_CPPFLAGS = \ -+ -DCHECK_LOCAL \ -+ -DPORTMAP \ -+ -DFACILITY=LOG_MAIL \ -+ -DSEVERITY=LOG_INFO \ -+ -DINET6 \ -+ -DRPCBIND_STATEDIR="\"$(statedir)\"" \ -+ -DRPCUSER="\"$(rpcuser)\"" \ -+ -D_GNU_SOURCE \ -+ $(TIRPC_CFLAGS) - -+if DEBUG -+AM_CPPFLAGS += -DRPCBIND_DEBUG -DSVC_RUN_DEBUG -DDEBUG_RMTCALL -+AM_CPPFLAGS += -DND_DEBUG -DBIND_DEBUG -+endif -+ -+if WARMSTART -+AM_CPPFLAGS += -DWARMSTART -+endif -+ -+if LIBWRAP -+AM_CPPFLAGS += -DLIBWRAP -+endif -+ -+bin_PROGRAMS = rpcbind rpcinfo -+ -+rpcbind_SOURCES = \ -+ src/check_bound.c \ -+ src/pmap_svc.c \ -+ src/rpcb_stat.c \ -+ src/rpcb_svc.c \ -+ src/rpcb_svc_4.c \ -+ src/rpcb_svc_com.c \ -+ src/rpcbind.c \ -+ src/rpcbind.h \ -+ src/security.c \ -+ src/util.c \ -+ src/warmstart.c -+rpcbind_LDADD = $(TIRPC_LIBS) -+ -+rpcinfo_SOURCES = src/rpcinfo.c -+rpcinfo_LDADD = $(TIRPC_LIBS) -+ -+dist_man8_MANS = man/rpcbind.8 man/rpcinfo.8 -diff --git a/autogen.sh b/autogen.sh -index 1613b6d..761db90 100755 ---- a/autogen.sh -+++ b/autogen.sh -@@ -36,7 +36,7 @@ if test x"${1}" = x"clean"; then - fi - - aclocal --libtoolize --force --copy --autoheader -+#libtoolize --force --copy -+#autoheader - automake --add-missing --copy --gnu # -Wall - autoconf # -Wall -diff --git a/configure.in b/configure.in -index de1c730..2b67720 100644 ---- a/configure.in -+++ b/configure.in -@@ -1,66 +1,39 @@ -- AC_INIT(rpcbind, 0.2.0) -+AC_INIT(rpcbind, 0.2.0) - -- AM_INIT_AUTOMAKE --# AM_MAINTAINER_MODE -+AM_INIT_AUTOMAKE - AC_CONFIG_SRCDIR([src/rpcbind.c]) -- AC_PROG_CC -- AM_CONFIG_HEADER(config.h) -- AC_HEADER_DIRENT -- AC_PREFIX_DEFAULT(/usr) -- --AC_CONFIG_SRCDIR([src/config.h.in]) --AC_CONFIG_HEADERS([src/config.h]) -- --AC_PROG_LIBTOOL -- --AC_ARG_ENABLE(debug,[ --enable-debug Turns on rpcbind debugging], -- [case "${enableval}" in -- yes) debug=true ;; -- no) debug=no ;; -- *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; -- esac],[debug=false]) --AM_CONDITIONAL(DEBUG, test x$debug = xtrue) -- --AC_ARG_ENABLE(warmstarts,[ --enable-warmstarts Enables Warm Starts], -- [case "${enableval}" in -- yes) warmstarts=true ;; -- no) warmstarts=no ;; -- *) AC_MSG_ERROR(bad value ${enableval} for --enable-warmstarts) ;; -- esac],[warmstarts=false]) --AM_CONDITIONAL(WARMSTART, test x$warmstarts = xtrue) -- --if test "$warmstarts" = "true" ; then -- AC_ARG_WITH(statedir, -- [ --with-statedir=/foo use state dir /foo [/tmp]], -- statedir=$withval, -- statedir=/tmp) -- AC_SUBST(statedir) -- AC_DEFINE_UNQUOTED(RPCBIND_STATEDIR, "$statedir", [This defines the location where the state files will be kept for warm starts]) --fi --AC_ARG_WITH(rpcuser, -- [ --with-rpcuser=user uid to use [root]], -- rpcuser=$withval, -- rpcuser=root) -- AC_SUBST(rpcuser) --AC_DEFINE_UNQUOTED(RPCBIND_USER, "$rpcuser", [This defines the uid to run as]) -+AC_PREFIX_DEFAULT(/usr) -+AC_PROG_CC -+ -+AC_ARG_ENABLE([libwrap], -+ AS_HELP_STRING([--enable-libwrap], [Enables host name checking through tcpd @<:@default=no@:>@])) -+AM_CONDITIONAL(LIBWRAP, test x$enable_libwrap = xyes) -+ -+AC_ARG_ENABLE([debug], -+ AS_HELP_STRING([--enable-debug], [Turns on rpcbind debugging @<:@default=no@:>@])) -+AM_CONDITIONAL(DEBUG, test x$enable_debug = xyes) -+ -+AC_ARG_ENABLE([warmstarts], -+ AS_HELP_STRING([--enable-warmstarts], [Enables Warm Starts @<:@default=no@:>@])) -+AM_CONDITIONAL(WARMSTART, test x$enable_warmstarts = xyes) -+ -+AC_ARG_WITH([statedir], -+ AS_HELP_STRING([--with-statedir=ARG], [use ARG as state dir @<:@default=/tmp@:>@]) -+ ,, [with_statedir=/tmp]) -+AC_SUBST([statedir], [$with_statedir]) -+ -+AC_ARG_WITH([rpcuser], -+ AS_HELP_STRING([--with-rpcuser=ARG], [use ARG for RPC @<:@default=root@:>@]), -+ ,, [with_rpcuser=root]) -+AC_SUBST([rpcuser], [$with_rpcuser]) -+ -+PKG_CHECK_MODULES([TIRPC], [libtirpc]) - --AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h \ -- netinet/in.h stdlib.h string.h \ -- sys/param.h sys/socket.h \ -- sys/time.h syslog.h \ -- unistd.h nss.h]) -+AS_IF([test x$enable_libwrap = xyes], [ -+ AC_CHECK_LIB([wrap], [hosts_access], , -+ AC_MSG_ERROR([libwrap support requested but unable to find libwrap])) -+]) - --AC_CHECK_LIB([pthread], [pthread_create]) --AC_CHECK_LIB([tirpc], [clnt_create]) --AC_ARG_ENABLE(libwrap,[ --enable-libwrap Enables host name checking], -- [case "${enableval}" in -- yes) libwarp=true -- AC_CHECK_LIB([wrap], [hosts_access]) ;; -- no) libwarp=no ;; -- *) AC_MSG_ERROR(bad value ${enableval} for --enable-libwrap) ;; -- esac],[libwarp=false]) --AM_CONDITIONAL(LIBWRAP, test x$libwarp = xtrue) -+AC_SEARCH_LIBS([pthread_create], [pthread]) - --AC_CONFIG_FILES([Makefile src/Makefile man/Makefile]) --AC_OUTPUT() -- -+AC_OUTPUT([Makefile]) -diff --git a/man/Makefile.am b/man/Makefile.am -deleted file mode 100644 -index 84818e9..0000000 ---- a/man/Makefile.am -+++ /dev/null -@@ -1,2 +0,0 @@ --man8_MANS = rpcbind.8 --EXTRA_DIST = $(man8_MANS) -diff --git a/man/rpcbind.8 b/man/rpcbind.8 -index 32806d4..c5b8fb7 100644 ---- a/man/rpcbind.8 -+++ b/man/rpcbind.8 -@@ -82,6 +82,8 @@ during operation, and will abort on certain errors if - is also specified. - With this option, the name-to-address translation consistency - checks are shown in detail. -+.It Fl f -+Do not fork and become a background process. - .It Fl h - Specify specific IP addresses to bind to for UDP requests. - This option -diff --git a/src/Makefile.am b/src/Makefile.am -deleted file mode 100644 -index cc0a85b..0000000 ---- a/src/Makefile.am -+++ /dev/null -@@ -1,34 +0,0 @@ --INCLUDES = -I$(srcdir)/tirpc -DPORTMAP -DINET6 -DVERSION="\"$(VERSION)\"" \ -- -D_GNU_SOURCE -Wall -pipe --if DEBUG --INCLUDES += -DRPCBIND_DEBUG -DSVC_RUN_DEBUG -DDEBUG_RMTCALL --INCLUDES += -DND_DEBUG -DBIND_DEBUG --endif -- --if WARMSTART --INCLUDES += -DWARMSTART --endif -- --if LIBWRAP --INCLUDES += -DLIBWRAP --endif -- -- --bin_PROGRAMS = rpcbind rpcinfo -- --rpcbind_SOURCES = check_bound.c rpcbind.c \ -- rpcb_svc_4.c rpcb_svc_com.c \ -- util.c pmap_svc.c rpcb_stat.c \ -- rpcb_svc.c security.c warmstart.c \ -- rpcbind.h -- --rpcinfo_SOURCES = rpcinfo.c --rpcinfo_LDFLAGS = -lpthread -ltirpc --rpcinfo_LDADD = $(LIB_TIRPC) -- -- --rpcbind_LDFLAGS = -lpthread -ltirpc --rpcbind_LDADD = $(LIB_TIRPC) --AM_CPPFLAGS = -I/usr/include/tirpc -DCHECK_LOCAL -DPORTMAP \ -- -DFACILITY=LOG_MAIL -DSEVERITY=LOG_INFO -- -diff --git a/src/config.h.in b/src/config.h.in -deleted file mode 100644 -index 67a0e39..0000000 ---- a/src/config.h.in -+++ /dev/null -@@ -1,105 +0,0 @@ --/* config.h.in. Generated from configure.in by autoheader. */ -- --/* Define to 1 if you have the header file. */ --#undef HAVE_ARPA_INET_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. -- */ --#undef HAVE_DIRENT_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_FCNTL_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_INTTYPES_H -- --/* Define to 1 if you have the `pthread' library (-lpthread). */ --#undef HAVE_LIBPTHREAD -- --/* Define to 1 if you have the `tirpc' library (-ltirpc). */ --#undef HAVE_LIBTIRPC -- --/* Define to 1 if you have the header file. */ --#undef HAVE_MEMORY_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. */ --#undef HAVE_NDIR_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_NETDB_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_NETINET_IN_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STDINT_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STDLIB_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STRINGS_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STRING_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYSLOG_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. -- */ --#undef HAVE_SYS_DIR_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. -- */ --#undef HAVE_SYS_NDIR_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_PARAM_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_SOCKET_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_STAT_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_TIME_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_TYPES_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_UNISTD_H -- --/* Name of package */ --#undef PACKAGE -- --/* Define to the address where bug reports for this package should be sent. */ --#undef PACKAGE_BUGREPORT -- --/* Define to the full name of this package. */ --#undef PACKAGE_NAME -- --/* Define to the full name and version of this package. */ --#undef PACKAGE_STRING -- --/* Define to the one symbol short name of this package. */ --#undef PACKAGE_TARNAME -- --/* Define to the version of this package. */ --#undef PACKAGE_VERSION -- --/* Define to 1 if you have the ANSI C header files. */ --#undef STDC_HEADERS -- --/* Version number of package */ --#undef VERSION -- --/* This defines the location where the state files will be kept for warm -- starts */ --#undef RPCBIND_STATEDIR -- --/* This defines the uid to run as */ --#undef RPCBIND_USER -- -diff --git a/src/pmap_svc.c b/src/pmap_svc.c -index 4736700..337e64d 100644 ---- a/src/pmap_svc.c -+++ b/src/pmap_svc.c -@@ -80,7 +80,7 @@ pmap_service(struct svc_req *rqstp, SVCXPRT *xprt) - if (debugging) - fprintf(stderr, "PMAPPROC_NULL\n"); - #endif -- check_access(xprt, rqstp->rq_proc, NULL, PMAPVERS); -+ check_access(xprt, rqstp->rq_proc, 0, PMAPVERS); - if ((!svc_sendreply(xprt, (xdrproc_t) xdr_void, NULL)) && - debugging) { - if (doabort) { -@@ -201,11 +201,11 @@ pmapproc_change(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt, unsigned long - reg.pm_prog, reg.pm_vers); - #endif - -- if (!check_access(xprt, op, ®, PMAPVERS)) { -+ if (!check_access(xprt, op, reg.pm_prog, PMAPVERS)) { - svcerr_weakauth(xprt); - return (FALSE); - } -- -+ - rpcbreg.r_prog = reg.pm_prog; - rpcbreg.r_vers = reg.pm_vers; - -@@ -276,7 +276,7 @@ pmapproc_getport(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - return (FALSE); - } - -- if (!check_access(xprt, PMAPPROC_GETPORT, ®, PMAPVERS)) { -+ if (!check_access(xprt, PMAPPROC_GETPORT, reg.pm_prog, PMAPVERS)) { - svcerr_weakauth(xprt); - return FALSE; - } -@@ -340,7 +340,7 @@ pmapproc_dump(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - return (FALSE); - } - -- if (!check_access(xprt, PMAPPROC_DUMP, NULL, PMAPVERS)) { -+ if (!check_access(xprt, PMAPPROC_DUMP, 0, PMAPVERS)) { - svcerr_weakauth(xprt); - return FALSE; - } -diff --git a/src/rpcb_svc.c b/src/rpcb_svc.c -index 0514ba5..e350f85 100644 ---- a/src/rpcb_svc.c -+++ b/src/rpcb_svc.c -@@ -75,6 +75,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - char *result; - xdrproc_t xdr_argument, xdr_result; - void *(*local) __P((void *, struct svc_req *, SVCXPRT *, rpcvers_t)); -+ rpcprog_t setprog = 0; - - rpcbs_procinfo(RPCBVERS_3_STAT, rqstp->rq_proc); - -@@ -88,7 +89,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - fprintf(stderr, "RPCBPROC_NULL\n"); - #endif - /* This call just logs, no actual checks */ -- check_access(transp, rqstp->rq_proc, NULL, RPCBVERS); -+ check_access(transp, rqstp->rq_proc, 0, RPCBVERS); - (void) svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL); - return; - -@@ -166,7 +167,13 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - (void) fprintf(stderr, "rpcbind: could not decode\n"); - return; - } -- if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS)) { -+ -+ if (rqstp->rq_proc == RPCBPROC_SET -+ || rqstp->rq_proc == RPCBPROC_UNSET -+ || rqstp->rq_proc == RPCBPROC_GETADDR) -+ setprog = argument.rpcbproc_set_3_arg.r_prog; -+ -+ if (!check_access(transp, rqstp->rq_proc, setprog, RPCBVERS)) { - svcerr_weakauth(transp); - goto done; - } -diff --git a/src/rpcb_svc_4.c b/src/rpcb_svc_4.c -index 9fd5bef..313e6d1 100644 ---- a/src/rpcb_svc_4.c -+++ b/src/rpcb_svc_4.c -@@ -78,6 +78,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - char *result; - xdrproc_t xdr_argument, xdr_result; - void *(*local) __P((void *, struct svc_req *, SVCXPRT *, rpcvers_t)); -+ rpcprog_t setprog = 0; - - rpcbs_procinfo(RPCBVERS_4_STAT, rqstp->rq_proc); - -@@ -90,7 +91,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - if (debugging) - fprintf(stderr, "RPCBPROC_NULL\n"); - #endif -- check_access(transp, rqstp->rq_proc, NULL, RPCBVERS4); -+ check_access(transp, rqstp->rq_proc, 0, RPCBVERS4); - (void) svc_sendreply(transp, (xdrproc_t) xdr_void, - (char *)NULL); - return; -@@ -220,7 +221,13 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - (void) fprintf(stderr, "rpcbind: could not decode\n"); - return; - } -- if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS4)) { -+ -+ if (rqstp->rq_proc == RPCBPROC_SET -+ || rqstp->rq_proc == RPCBPROC_UNSET -+ || rqstp->rq_proc == RPCBPROC_GETADDR) -+ setprog = argument.rpcbproc_set_4_arg.r_prog; -+ -+ if (!check_access(transp, rqstp->rq_proc, setprog, RPCBVERS4)) { - svcerr_weakauth(transp); - goto done; - } -diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c -index 291421f..5bb9a44 100644 ---- a/src/rpcb_svc_com.c -+++ b/src/rpcb_svc_com.c -@@ -1372,10 +1372,13 @@ static char * - getowner(SVCXPRT *transp, char *owner, size_t ownersize) - { - uid_t uid; -- -- if (__rpc_get_local_uid(transp, &uid) < 0) -- snprintf(owner, ownersize, "unknown"); -- else if (uid == 0) -+ -+ if (__rpc_get_local_uid(transp, &uid) < 0) { -+ if (is_localroot(svc_getrpccaller(transp))) -+ snprintf(owner, ownersize, "superuser"); -+ else -+ snprintf(owner, ownersize, "unknown"); -+ } else if (uid == 0) - snprintf(owner, ownersize, "superuser"); - else - snprintf(owner, ownersize, "%d", uid); -diff --git a/src/rpcbind.c b/src/rpcbind.c -index 525ffba..24e069b 100644 ---- a/src/rpcbind.c -+++ b/src/rpcbind.c -@@ -68,7 +68,6 @@ - #include - #include - #include --#include "config.h" - #include "rpcbind.h" - - /*#define RPCBIND_DEBUG*/ -@@ -77,6 +76,7 @@ - - int debugging = 0; /* Tell me what's going on */ - int doabort = 0; /* When debugging, do an abort on errors */ -+int dofork = 1; /* fork? */ - - rpcblist_ptr list_rbl; /* A list of version 3/4 rpcbind services */ - -@@ -213,8 +213,8 @@ main(int argc, char *argv[]) - printf("\n"); - } - #endif -- } else { -- if (daemon(0, 0)) -+ } else if (dofork) { -+ if (daemon(0, 0)) - err(1, "fork failed"); - } - -@@ -276,6 +276,7 @@ init_transport(struct netconfig *nconf) - int addrlen = 0; - int nhostsbak; - int checkbind; -+ int on = 1; - struct sockaddr *sa = NULL; - u_int32_t host_addr[4]; /* IPv4 or IPv6 */ - struct sockaddr_un sun; -@@ -493,6 +494,14 @@ init_transport(struct netconfig *nconf) - } - 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) -@@ -731,7 +740,7 @@ parseargs(int argc, char *argv[]) - { - int c; - oldstyle_local = 1; -- while ((c = getopt(argc, argv, "dwah:ils")) != -1) { -+ while ((c = getopt(argc, argv, "adh:ilswf")) != -1) { - switch (c) { - case 'a': - doabort = 1; /* when debugging, do an abort on */ -@@ -758,13 +767,16 @@ parseargs(int argc, char *argv[]) - case 's': - runasdaemon = 1; - break; -+ case 'f': -+ dofork = 0; -+ break; - #ifdef WARMSTART - case 'w': - warmstart = 1; - break; - #endif - default: /* error */ -- fprintf(stderr, "usage: rpcbind [-Idwils]\n"); -+ fprintf(stderr, "usage: rpcbind [-adhilswf]\n"); - exit (1); - } - } -diff --git a/src/rpcbind.h b/src/rpcbind.h -index c800577..74f9591 100644 ---- a/src/rpcbind.h -+++ b/src/rpcbind.h -@@ -119,7 +119,7 @@ void rpcbind_abort(void); - void reap(int); - void toggle_verboselog(int); - --int check_access(SVCXPRT *, rpcproc_t, void *, unsigned int); -+int check_access(SVCXPRT *, rpcproc_t, rpcprog_t, unsigned int); - int check_callit(SVCXPRT *, struct r_rmtcall_args *, int); - void logit(int, struct sockaddr *, rpcproc_t, rpcprog_t, const char *); - int is_loopback(struct netbuf *); -diff --git a/src/security.c b/src/security.c -index 0edeac6..d272f74 100644 ---- a/src/security.c -+++ b/src/security.c -@@ -62,34 +62,21 @@ int log_severity = PORTMAP_LOG_FACILITY|PORTMAP_LOG_SEVERITY; - extern int verboselog; - - int --check_access(SVCXPRT *xprt, rpcproc_t proc, void *args, unsigned int rpcbvers) -+check_access(SVCXPRT *xprt, rpcproc_t proc, rpcprog_t prog, unsigned int rpcbvers) - { - struct netbuf *caller = svc_getrpccaller(xprt); - struct sockaddr *addr = (struct sockaddr *)caller->buf; - #ifdef LIBWRAP - struct request_info req; - #endif -- rpcprog_t prog = 0; -- rpcb *rpcbp; -- struct pmap *pmap; - - /* - * The older PMAP_* equivalents have the same numbers, so - * they are accounted for here as well. - */ - switch (proc) { -- case RPCBPROC_GETADDR: - case RPCBPROC_SET: - case RPCBPROC_UNSET: -- if (rpcbvers > PMAPVERS) { -- rpcbp = (rpcb *)args; -- prog = rpcbp->r_prog; -- } else { -- pmap = (struct pmap *)args; -- prog = pmap->pm_prog; -- } -- if (proc == RPCBPROC_GETADDR) -- break; - if (!insecure && !is_loopback(caller)) { - #ifdef RPCBIND_DEBUG - if (debugging) -@@ -101,6 +88,7 @@ check_access(SVCXPRT *xprt, rpcproc_t proc, void *args, unsigned int rpcbvers) - return 0; - } - break; -+ case RPCBPROC_GETADDR: - case RPCBPROC_CALLIT: - case RPCBPROC_INDIRECT: - case RPCBPROC_DUMP: -@@ -150,8 +138,7 @@ is_loopback(struct netbuf *nbuf) - "Checking caller's adress (port = %d)\n", - ntohs(sin->sin_port)); - #endif -- return ((sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) && -- (ntohs(sin->sin_port) < IPPORT_RESERVED)); -+ return (sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)); - #ifdef INET6 - case AF_INET6: - if (!oldstyle_local) -@@ -163,10 +150,9 @@ is_loopback(struct netbuf *nbuf) - "Checking caller's adress (port = %d)\n", - ntohs(sin6->sin6_port)); - #endif -- return ((IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr) || -+ return (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr) || - (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) && -- sin6->sin6_addr.s6_addr32[3] == htonl(INADDR_LOOPBACK))) && -- (ntohs(sin6->sin6_port) < IPV6PORT_RESERVED)); -+ sin6->sin6_addr.s6_addr32[3] == htonl(INADDR_LOOPBACK))); - #endif - case AF_LOCAL: - return 1; -diff --git a/src/warmstart.c b/src/warmstart.c -index 25e5d89..d1bb971 100644 ---- a/src/warmstart.c -+++ b/src/warmstart.c -@@ -46,7 +46,6 @@ - #include - #include - --#include "config.h" - #include "rpcbind.h" - - #ifndef RPCBIND_STATEDIR diff --git a/rpcbind-0_2_1-rc4.patch b/rpcbind-0_2_1-rc4.patch deleted file mode 100644 index 44b8cb9..0000000 --- a/rpcbind-0_2_1-rc4.patch +++ /dev/null @@ -1,1093 +0,0 @@ -diff --git a/.gitignore b/.gitignore -index 5a7546c..bee4bab 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -1,3 +1,4 @@ -+INSTALL - Makefile - Makefile.in - aclocal.m4 -@@ -13,18 +14,14 @@ depcomp - install-sh - libtool - ltmain.sh --man/Makefile --man/Makefile.in - missing --src/.deps/ --src/Makefile --src/Makefile.in - src/config.h - src/stamp-h2 - stamp-h1 - # file generated during compilation -+.deps - *.o --src/rpcbind --src/rpcinfo -+rpcbind -+rpcinfo - # cscope database files - cscope.* -diff --git a/INSTALL b/INSTALL -index 98e5d87..7d1c323 100644 ---- a/INSTALL -+++ b/INSTALL -@@ -1,32 +1,25 @@ --Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software --Foundation, Inc. -+Installation Instructions -+************************* - -- This file is free documentation; the Free Software Foundation gives --unlimited permission to copy, distribute and modify it. -- -- --rpcbind Quick Installation --========================== -- --$ ./configure --$ make --# make install -- -- The install phase will install the rpcbind and rpcinfo commands --under /usr/bin. If you wish they replace the basic portmap and --rpcinfo commands, you can run: -- --# mv /sbin/portmap /sbin/portmap.sav --# ln -s /usr/bin/rpcbind /sbin/portmap -- --# mv /usr/sbin/rpcinfo /usr/sbin/rpcinfo.sav --# ln -s /usr/bin/rpcinfo /usr/sbin/rpcinfo -+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -+2006, 2007, 2008, 2009 Free Software Foundation, Inc. - -+ Copying and distribution of this file, with or without modification, -+are permitted in any medium without royalty provided the copyright -+notice and this notice are preserved. This file is offered as-is, -+without warranty of any kind. - - Basic Installation - ================== - -- These are generic installation instructions. -+ Briefly, the shell commands `./configure; make; make install' should -+configure, build, and install this package. The following -+more-detailed instructions are generic; see the `README' file for -+instructions specific to this package. Some packages provide this -+`INSTALL' file but do not implement all of the features documented -+below. The lack of an optional feature in a given package is not -+necessarily a bug. More recommendations for GNU packages can be found -+in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for - various system-dependent variables used during compilation. It uses -@@ -39,9 +32,9 @@ debugging `configure'). - - It can also use an optional file (typically called `config.cache' - and enabled with `--cache-file=config.cache' or simply `-C') that saves --the results of its tests to speed up reconfiguring. (Caching is -+the results of its tests to speed up reconfiguring. Caching is - disabled by default to prevent problems with accidental use of stale --cache files.) -+cache files. - - If you need to do unusual things to compile the package, please try - to figure out how `configure' could check whether to do them, and mail -@@ -51,30 +44,37 @@ some point `config.cache' contains results you don't want to keep, you - may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create --`configure' by a program called `autoconf'. You only need --`configure.ac' if you want to change it or regenerate `configure' using --a newer version of `autoconf'. -+`configure' by a program called `autoconf'. You need `configure.ac' if -+you want to change it or regenerate `configure' using a newer version -+of `autoconf'. - --The simplest way to compile this package is: -+ The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type -- `./configure' to configure the package for your system. If you're -- using `csh' on an old version of System V, you might need to type -- `sh ./configure' instead to prevent `csh' from trying to execute -- `configure' itself. -+ `./configure' to configure the package for your system. - -- Running `configure' takes awhile. While running, it prints some -- messages telling which features it is checking for. -+ Running `configure' might take a while. While running, it prints -+ some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with -- the package. -+ the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and -- documentation. -- -- 5. You can remove the program binaries and object files from the -+ documentation. When installing into a prefix owned by root, it is -+ recommended that the package be configured and built as a regular -+ user, and only the `make install' phase executed with root -+ privileges. -+ -+ 5. Optionally, type `make installcheck' to repeat any self-tests, but -+ this time using the binaries in their final installed location. -+ This target does not install anything. Running this target as a -+ regular user, particularly if the prior `make install' required -+ root privileges, verifies that the installation completed -+ correctly. -+ -+ 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is -@@ -83,6 +83,16 @@ The simplest way to compile this package is: - all sorts of other programs in order to regenerate files that came - with the distribution. - -+ 7. Often, you can also type `make uninstall' to remove the installed -+ files again. In practice, not all packages have tested that -+ uninstallation works correctly, even though it is required by the -+ GNU Coding Standards. -+ -+ 8. Some packages, particularly those that use Automake, provide `make -+ distcheck', which can by used by developers to test that all other -+ targets like `make install' and `make uninstall' work correctly. -+ This target is generally not run by end users. -+ - Compilers and Options - ===================== - -@@ -94,7 +104,7 @@ for details on some of the pertinent environment variables. - by setting variables in the command line or in the environment. Here - is an example: - -- ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix -+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -@@ -103,44 +113,89 @@ Compiling For Multiple Architectures - - You can compile the package for more than one kind of computer at the - same time, by placing the object files for each architecture in their --own directory. To do this, you must use a version of `make' that --supports the `VPATH' variable, such as GNU `make'. `cd' to the -+own directory. To do this, you can use GNU `make'. `cd' to the - directory where you want the object files and executables to go and run - the `configure' script. `configure' automatically checks for the --source code in the directory that `configure' is in and in `..'. -+source code in the directory that `configure' is in and in `..'. This -+is known as a "VPATH" build. - -- If you have to use a `make' that does not support the `VPATH' --variable, you have to compile the package for one architecture at a --time in the source code directory. After you have installed the --package for one architecture, use `make distclean' before reconfiguring --for another architecture. -+ With a non-GNU `make', it is safer to compile the package for one -+architecture at a time in the source code directory. After you have -+installed the package for one architecture, use `make distclean' before -+reconfiguring for another architecture. -+ -+ On MacOS X 10.5 and later systems, you can create libraries and -+executables that work on multiple system types--known as "fat" or -+"universal" binaries--by specifying multiple `-arch' options to the -+compiler but only a single `-arch' option to the preprocessor. Like -+this: -+ -+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ -+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ -+ CPP="gcc -E" CXXCPP="g++ -E" -+ -+ This is not guaranteed to produce working output in all cases, you -+may have to build one architecture at a time and combine the results -+using the `lipo' tool if you have problems. - - Installation Names - ================== - -- By default, `make install' will install the package's files in --`/usr/local/bin', `/usr/local/man', etc. You can specify an --installation prefix other than `/usr/local' by giving `configure' the --option `--prefix=PATH'. -+ By default, `make install' installs the package's commands under -+`/usr/local/bin', include files under `/usr/local/include', etc. You -+can specify an installation prefix other than `/usr/local' by giving -+`configure' the option `--prefix=PREFIX', where PREFIX must be an -+absolute file name. - - You can specify separate installation prefixes for - architecture-specific files and architecture-independent files. If you --give `configure' the option `--exec-prefix=PATH', the package will use --PATH as the prefix for installing programs and libraries. --Documentation and other data files will still use the regular prefix. -+pass the option `--exec-prefix=PREFIX' to `configure', the package uses -+PREFIX as the prefix for installing programs and libraries. -+Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give --options like `--bindir=PATH' to specify different values for particular -+options like `--bindir=DIR' to specify different values for particular - kinds of files. Run `configure --help' for a list of the directories --you can set and what kinds of files go in them. -+you can set and what kinds of files go in them. In general, the -+default for these options is expressed in terms of `${prefix}', so that -+specifying just `--prefix' will affect all of the other directory -+specifications that were not explicitly provided. -+ -+ The most portable way to affect installation locations is to pass the -+correct locations to `configure'; however, many packages provide one or -+both of the following shortcuts of passing variable assignments to the -+`make install' command line to change installation locations without -+having to reconfigure or recompile. -+ -+ The first method involves providing an override variable for each -+affected directory. For example, `make install -+prefix=/alternate/directory' will choose an alternate location for all -+directory configuration variables that were expressed in terms of -+`${prefix}'. Any directories that were specified during `configure', -+but not in terms of `${prefix}', must each be overridden at install -+time for the entire installation to be relocated. The approach of -+makefile variable overrides for each directory variable is required by -+the GNU Coding Standards, and ideally causes no recompilation. -+However, some platforms have known limitations with the semantics of -+shared libraries that end up requiring recompilation when using this -+method, particularly noticeable in packages that use GNU Libtool. -+ -+ The second method involves providing the `DESTDIR' variable. For -+example, `make install DESTDIR=/alternate/directory' will prepend -+`/alternate/directory' before all installation names. The approach of -+`DESTDIR' overrides is not required by the GNU Coding Standards, and -+does not work on platforms that have drive letters. On the other hand, -+it does better at avoiding recompilation issues, and works well even -+when some directory options were not specified in terms of `${prefix}' -+at `configure' time. -+ -+Optional Features -+================= - - If the package supports it, you can cause programs to be installed - with an extra prefix or suffix on their names by giving `configure' the - option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - --Optional Features --================= -- - Some packages pay attention to `--enable-FEATURE' options to - `configure', where FEATURE indicates an optional part of the package. - They may also pay attention to `--with-PACKAGE' options, where PACKAGE -@@ -153,6 +208,45 @@ find the X include and library files automatically, but if it doesn't, - you can use the `configure' options `--x-includes=DIR' and - `--x-libraries=DIR' to specify their locations. - -+ Some packages offer the ability to configure how verbose the -+execution of `make' will be. For these packages, running `./configure -+--enable-silent-rules' sets the default to minimal output, which can be -+overridden with `make V=1'; while running `./configure -+--disable-silent-rules' sets the default to verbose, which can be -+overridden with `make V=0'. -+ -+Particular systems -+================== -+ -+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU -+CC is not installed, it is recommended to use the following options in -+order to use an ANSI C compiler: -+ -+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" -+ -+and if that doesn't work, install pre-built binaries of GCC for HP-UX. -+ -+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -+parse its `' header file. The option `-nodtk' can be used as -+a workaround. If GNU CC is not installed, it is therefore recommended -+to try -+ -+ ./configure CC="cc" -+ -+and if that doesn't work, try -+ -+ ./configure CC="cc -nodtk" -+ -+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This -+directory contains several dysfunctional programs; working variants of -+these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -+in your `PATH', put it _after_ `/usr/bin'. -+ -+ On Haiku, software installed for all users goes in `/boot/common', -+not `/usr/local'. It is recommended to use the following options: -+ -+ ./configure --prefix=/boot/common -+ - Specifying the System Type - ========================== - -@@ -168,14 +262,15 @@ type, such as `sun4', or a canonical name which has the form: - - where SYSTEM can have one of these forms: - -- OS KERNEL-OS -+ OS -+ KERNEL-OS - - See the file `config.sub' for the possible values of each field. If - `config.sub' isn't included in this package, then this package doesn't - need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should --use the `--target=TYPE' option to select the type of system they will -+use the option `--target=TYPE' to select the type of system they will - produce code for. - - If you want to _use_ a cross compiler, that generates code for a -@@ -205,9 +300,14 @@ them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - --will cause the specified gcc to be used as the C compiler (unless it is -+causes the specified `gcc' to be used as the C compiler (unless it is - overridden in the site shell script). - -+Unfortunately, this technique does not work for `CONFIG_SHELL' due to -+an Autoconf bug. Until the bug is fixed you can use this workaround: -+ -+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash -+ - `configure' Invocation - ====================== - -@@ -216,7 +316,14 @@ operates. - - `--help' - `-h' -- Print a summary of the options to `configure', and exit. -+ Print a summary of all of the options to `configure', and exit. -+ -+`--help=short' -+`--help=recursive' -+ Print a summary of the options unique to this package's -+ `configure', and exit. The `short' variant lists options used -+ only in the top level, while the `recursive' variant lists options -+ also present in any nested packages. - - `--version' - `-V' -@@ -243,6 +350,16 @@ operates. - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -+`--prefix=DIR' -+ Use DIR as the installation prefix. *note Installation Names:: -+ for more details, including other options available for fine-tuning -+ the installation locations. -+ -+`--no-create' -+`-n' -+ Run the configure checks, but stop before creating any output -+ files. -+ - `configure' also accepts some other, not widely useful, options. Run - `configure --help' for more details. - -diff --git a/Makefile.am b/Makefile.am -index cd56148..d10c906 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -1,2 +1,44 @@ --SUBDIRS= src man -+AM_CPPFLAGS = \ -+ -DCHECK_LOCAL \ -+ -DPORTMAP \ -+ -DFACILITY=LOG_MAIL \ -+ -DSEVERITY=LOG_INFO \ -+ -DINET6 \ -+ -DRPCBIND_STATEDIR="\"$(statedir)\"" \ -+ -DRPCBIND_USER="\"$(rpcuser)\"" \ -+ -D_GNU_SOURCE \ -+ $(TIRPC_CFLAGS) - -+if DEBUG -+AM_CPPFLAGS += -DRPCBIND_DEBUG -DSVC_RUN_DEBUG -DDEBUG_RMTCALL -+AM_CPPFLAGS += -DND_DEBUG -DBIND_DEBUG -+endif -+ -+if WARMSTART -+AM_CPPFLAGS += -DWARMSTART -+endif -+ -+if LIBWRAP -+AM_CPPFLAGS += -DLIBWRAP -+endif -+ -+bin_PROGRAMS = rpcbind rpcinfo -+ -+rpcbind_SOURCES = \ -+ src/check_bound.c \ -+ src/pmap_svc.c \ -+ src/rpcb_stat.c \ -+ src/rpcb_svc.c \ -+ src/rpcb_svc_4.c \ -+ src/rpcb_svc_com.c \ -+ src/rpcbind.c \ -+ src/rpcbind.h \ -+ src/security.c \ -+ src/util.c \ -+ src/warmstart.c -+rpcbind_LDADD = $(TIRPC_LIBS) -+ -+rpcinfo_SOURCES = src/rpcinfo.c -+rpcinfo_LDADD = $(TIRPC_LIBS) -+ -+dist_man8_MANS = man/rpcbind.8 man/rpcinfo.8 -diff --git a/autogen.sh b/autogen.sh -index 1613b6d..761db90 100755 ---- a/autogen.sh -+++ b/autogen.sh -@@ -36,7 +36,7 @@ if test x"${1}" = x"clean"; then - fi - - aclocal --libtoolize --force --copy --autoheader -+#libtoolize --force --copy -+#autoheader - automake --add-missing --copy --gnu # -Wall - autoconf # -Wall -diff --git a/configure.in b/configure.in -index de1c730..2b67720 100644 ---- a/configure.in -+++ b/configure.in -@@ -1,66 +1,39 @@ -- AC_INIT(rpcbind, 0.2.0) -+AC_INIT(rpcbind, 0.2.0) - -- AM_INIT_AUTOMAKE --# AM_MAINTAINER_MODE -+AM_INIT_AUTOMAKE - AC_CONFIG_SRCDIR([src/rpcbind.c]) -- AC_PROG_CC -- AM_CONFIG_HEADER(config.h) -- AC_HEADER_DIRENT -- AC_PREFIX_DEFAULT(/usr) -- --AC_CONFIG_SRCDIR([src/config.h.in]) --AC_CONFIG_HEADERS([src/config.h]) -- --AC_PROG_LIBTOOL -- --AC_ARG_ENABLE(debug,[ --enable-debug Turns on rpcbind debugging], -- [case "${enableval}" in -- yes) debug=true ;; -- no) debug=no ;; -- *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; -- esac],[debug=false]) --AM_CONDITIONAL(DEBUG, test x$debug = xtrue) -- --AC_ARG_ENABLE(warmstarts,[ --enable-warmstarts Enables Warm Starts], -- [case "${enableval}" in -- yes) warmstarts=true ;; -- no) warmstarts=no ;; -- *) AC_MSG_ERROR(bad value ${enableval} for --enable-warmstarts) ;; -- esac],[warmstarts=false]) --AM_CONDITIONAL(WARMSTART, test x$warmstarts = xtrue) -- --if test "$warmstarts" = "true" ; then -- AC_ARG_WITH(statedir, -- [ --with-statedir=/foo use state dir /foo [/tmp]], -- statedir=$withval, -- statedir=/tmp) -- AC_SUBST(statedir) -- AC_DEFINE_UNQUOTED(RPCBIND_STATEDIR, "$statedir", [This defines the location where the state files will be kept for warm starts]) --fi --AC_ARG_WITH(rpcuser, -- [ --with-rpcuser=user uid to use [root]], -- rpcuser=$withval, -- rpcuser=root) -- AC_SUBST(rpcuser) --AC_DEFINE_UNQUOTED(RPCBIND_USER, "$rpcuser", [This defines the uid to run as]) -+AC_PREFIX_DEFAULT(/usr) -+AC_PROG_CC -+ -+AC_ARG_ENABLE([libwrap], -+ AS_HELP_STRING([--enable-libwrap], [Enables host name checking through tcpd @<:@default=no@:>@])) -+AM_CONDITIONAL(LIBWRAP, test x$enable_libwrap = xyes) -+ -+AC_ARG_ENABLE([debug], -+ AS_HELP_STRING([--enable-debug], [Turns on rpcbind debugging @<:@default=no@:>@])) -+AM_CONDITIONAL(DEBUG, test x$enable_debug = xyes) -+ -+AC_ARG_ENABLE([warmstarts], -+ AS_HELP_STRING([--enable-warmstarts], [Enables Warm Starts @<:@default=no@:>@])) -+AM_CONDITIONAL(WARMSTART, test x$enable_warmstarts = xyes) -+ -+AC_ARG_WITH([statedir], -+ AS_HELP_STRING([--with-statedir=ARG], [use ARG as state dir @<:@default=/tmp@:>@]) -+ ,, [with_statedir=/tmp]) -+AC_SUBST([statedir], [$with_statedir]) -+ -+AC_ARG_WITH([rpcuser], -+ AS_HELP_STRING([--with-rpcuser=ARG], [use ARG for RPC @<:@default=root@:>@]), -+ ,, [with_rpcuser=root]) -+AC_SUBST([rpcuser], [$with_rpcuser]) -+ -+PKG_CHECK_MODULES([TIRPC], [libtirpc]) - --AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h \ -- netinet/in.h stdlib.h string.h \ -- sys/param.h sys/socket.h \ -- sys/time.h syslog.h \ -- unistd.h nss.h]) -+AS_IF([test x$enable_libwrap = xyes], [ -+ AC_CHECK_LIB([wrap], [hosts_access], , -+ AC_MSG_ERROR([libwrap support requested but unable to find libwrap])) -+]) - --AC_CHECK_LIB([pthread], [pthread_create]) --AC_CHECK_LIB([tirpc], [clnt_create]) --AC_ARG_ENABLE(libwrap,[ --enable-libwrap Enables host name checking], -- [case "${enableval}" in -- yes) libwarp=true -- AC_CHECK_LIB([wrap], [hosts_access]) ;; -- no) libwarp=no ;; -- *) AC_MSG_ERROR(bad value ${enableval} for --enable-libwrap) ;; -- esac],[libwarp=false]) --AM_CONDITIONAL(LIBWRAP, test x$libwarp = xtrue) -+AC_SEARCH_LIBS([pthread_create], [pthread]) - --AC_CONFIG_FILES([Makefile src/Makefile man/Makefile]) --AC_OUTPUT() -- -+AC_OUTPUT([Makefile]) -diff --git a/man/Makefile.am b/man/Makefile.am -deleted file mode 100644 -index 84818e9..0000000 ---- a/man/Makefile.am -+++ /dev/null -@@ -1,2 +0,0 @@ --man8_MANS = rpcbind.8 --EXTRA_DIST = $(man8_MANS) -diff --git a/man/rpcbind.8 b/man/rpcbind.8 -index 32806d4..da32701 100644 ---- a/man/rpcbind.8 -+++ b/man/rpcbind.8 -@@ -82,6 +82,8 @@ during operation, and will abort on certain errors if - is also specified. - With this option, the name-to-address translation consistency - checks are shown in detail. -+.It Fl f -+Do not fork and become a background process. - .It Fl h - Specify specific IP addresses to bind to for UDP requests. - This option -@@ -141,7 +143,6 @@ All RPC servers must be restarted if - .Nm - is restarted. - .Sh SEE ALSO --.Xr rpcbind 3 , - .Xr rpcinfo 8 - .Sh LINUX PORT - .Bl Aurelien Charbon -diff --git a/src/Makefile.am b/src/Makefile.am -deleted file mode 100644 -index cc0a85b..0000000 ---- a/src/Makefile.am -+++ /dev/null -@@ -1,34 +0,0 @@ --INCLUDES = -I$(srcdir)/tirpc -DPORTMAP -DINET6 -DVERSION="\"$(VERSION)\"" \ -- -D_GNU_SOURCE -Wall -pipe --if DEBUG --INCLUDES += -DRPCBIND_DEBUG -DSVC_RUN_DEBUG -DDEBUG_RMTCALL --INCLUDES += -DND_DEBUG -DBIND_DEBUG --endif -- --if WARMSTART --INCLUDES += -DWARMSTART --endif -- --if LIBWRAP --INCLUDES += -DLIBWRAP --endif -- -- --bin_PROGRAMS = rpcbind rpcinfo -- --rpcbind_SOURCES = check_bound.c rpcbind.c \ -- rpcb_svc_4.c rpcb_svc_com.c \ -- util.c pmap_svc.c rpcb_stat.c \ -- rpcb_svc.c security.c warmstart.c \ -- rpcbind.h -- --rpcinfo_SOURCES = rpcinfo.c --rpcinfo_LDFLAGS = -lpthread -ltirpc --rpcinfo_LDADD = $(LIB_TIRPC) -- -- --rpcbind_LDFLAGS = -lpthread -ltirpc --rpcbind_LDADD = $(LIB_TIRPC) --AM_CPPFLAGS = -I/usr/include/tirpc -DCHECK_LOCAL -DPORTMAP \ -- -DFACILITY=LOG_MAIL -DSEVERITY=LOG_INFO -- -diff --git a/src/config.h.in b/src/config.h.in -deleted file mode 100644 -index 67a0e39..0000000 ---- a/src/config.h.in -+++ /dev/null -@@ -1,105 +0,0 @@ --/* config.h.in. Generated from configure.in by autoheader. */ -- --/* Define to 1 if you have the header file. */ --#undef HAVE_ARPA_INET_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. -- */ --#undef HAVE_DIRENT_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_FCNTL_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_INTTYPES_H -- --/* Define to 1 if you have the `pthread' library (-lpthread). */ --#undef HAVE_LIBPTHREAD -- --/* Define to 1 if you have the `tirpc' library (-ltirpc). */ --#undef HAVE_LIBTIRPC -- --/* Define to 1 if you have the header file. */ --#undef HAVE_MEMORY_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. */ --#undef HAVE_NDIR_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_NETDB_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_NETINET_IN_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STDINT_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STDLIB_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STRINGS_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_STRING_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYSLOG_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. -- */ --#undef HAVE_SYS_DIR_H -- --/* Define to 1 if you have the header file, and it defines `DIR'. -- */ --#undef HAVE_SYS_NDIR_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_PARAM_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_SOCKET_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_STAT_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_TIME_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_SYS_TYPES_H -- --/* Define to 1 if you have the header file. */ --#undef HAVE_UNISTD_H -- --/* Name of package */ --#undef PACKAGE -- --/* Define to the address where bug reports for this package should be sent. */ --#undef PACKAGE_BUGREPORT -- --/* Define to the full name of this package. */ --#undef PACKAGE_NAME -- --/* Define to the full name and version of this package. */ --#undef PACKAGE_STRING -- --/* Define to the one symbol short name of this package. */ --#undef PACKAGE_TARNAME -- --/* Define to the version of this package. */ --#undef PACKAGE_VERSION -- --/* Define to 1 if you have the ANSI C header files. */ --#undef STDC_HEADERS -- --/* Version number of package */ --#undef VERSION -- --/* This defines the location where the state files will be kept for warm -- starts */ --#undef RPCBIND_STATEDIR -- --/* This defines the uid to run as */ --#undef RPCBIND_USER -- -diff --git a/src/pmap_svc.c b/src/pmap_svc.c -index 4736700..337e64d 100644 ---- a/src/pmap_svc.c -+++ b/src/pmap_svc.c -@@ -80,7 +80,7 @@ pmap_service(struct svc_req *rqstp, SVCXPRT *xprt) - if (debugging) - fprintf(stderr, "PMAPPROC_NULL\n"); - #endif -- check_access(xprt, rqstp->rq_proc, NULL, PMAPVERS); -+ check_access(xprt, rqstp->rq_proc, 0, PMAPVERS); - if ((!svc_sendreply(xprt, (xdrproc_t) xdr_void, NULL)) && - debugging) { - if (doabort) { -@@ -201,11 +201,11 @@ pmapproc_change(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt, unsigned long - reg.pm_prog, reg.pm_vers); - #endif - -- if (!check_access(xprt, op, ®, PMAPVERS)) { -+ if (!check_access(xprt, op, reg.pm_prog, PMAPVERS)) { - svcerr_weakauth(xprt); - return (FALSE); - } -- -+ - rpcbreg.r_prog = reg.pm_prog; - rpcbreg.r_vers = reg.pm_vers; - -@@ -276,7 +276,7 @@ pmapproc_getport(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - return (FALSE); - } - -- if (!check_access(xprt, PMAPPROC_GETPORT, ®, PMAPVERS)) { -+ if (!check_access(xprt, PMAPPROC_GETPORT, reg.pm_prog, PMAPVERS)) { - svcerr_weakauth(xprt); - return FALSE; - } -@@ -340,7 +340,7 @@ pmapproc_dump(struct svc_req *rqstp /*__unused*/, SVCXPRT *xprt) - return (FALSE); - } - -- if (!check_access(xprt, PMAPPROC_DUMP, NULL, PMAPVERS)) { -+ if (!check_access(xprt, PMAPPROC_DUMP, 0, PMAPVERS)) { - svcerr_weakauth(xprt); - return FALSE; - } -diff --git a/src/rpcb_svc.c b/src/rpcb_svc.c -index 0514ba5..e350f85 100644 ---- a/src/rpcb_svc.c -+++ b/src/rpcb_svc.c -@@ -75,6 +75,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - char *result; - xdrproc_t xdr_argument, xdr_result; - void *(*local) __P((void *, struct svc_req *, SVCXPRT *, rpcvers_t)); -+ rpcprog_t setprog = 0; - - rpcbs_procinfo(RPCBVERS_3_STAT, rqstp->rq_proc); - -@@ -88,7 +89,7 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - fprintf(stderr, "RPCBPROC_NULL\n"); - #endif - /* This call just logs, no actual checks */ -- check_access(transp, rqstp->rq_proc, NULL, RPCBVERS); -+ check_access(transp, rqstp->rq_proc, 0, RPCBVERS); - (void) svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL); - return; - -@@ -166,7 +167,13 @@ rpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) - (void) fprintf(stderr, "rpcbind: could not decode\n"); - return; - } -- if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS)) { -+ -+ if (rqstp->rq_proc == RPCBPROC_SET -+ || rqstp->rq_proc == RPCBPROC_UNSET -+ || rqstp->rq_proc == RPCBPROC_GETADDR) -+ setprog = argument.rpcbproc_set_3_arg.r_prog; -+ -+ if (!check_access(transp, rqstp->rq_proc, setprog, RPCBVERS)) { - svcerr_weakauth(transp); - goto done; - } -diff --git a/src/rpcb_svc_4.c b/src/rpcb_svc_4.c -index 9fd5bef..313e6d1 100644 ---- a/src/rpcb_svc_4.c -+++ b/src/rpcb_svc_4.c -@@ -78,6 +78,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - char *result; - xdrproc_t xdr_argument, xdr_result; - void *(*local) __P((void *, struct svc_req *, SVCXPRT *, rpcvers_t)); -+ rpcprog_t setprog = 0; - - rpcbs_procinfo(RPCBVERS_4_STAT, rqstp->rq_proc); - -@@ -90,7 +91,7 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - if (debugging) - fprintf(stderr, "RPCBPROC_NULL\n"); - #endif -- check_access(transp, rqstp->rq_proc, NULL, RPCBVERS4); -+ check_access(transp, rqstp->rq_proc, 0, RPCBVERS4); - (void) svc_sendreply(transp, (xdrproc_t) xdr_void, - (char *)NULL); - return; -@@ -220,7 +221,13 @@ rpcb_service_4(struct svc_req *rqstp, SVCXPRT *transp) - (void) fprintf(stderr, "rpcbind: could not decode\n"); - return; - } -- if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS4)) { -+ -+ if (rqstp->rq_proc == RPCBPROC_SET -+ || rqstp->rq_proc == RPCBPROC_UNSET -+ || rqstp->rq_proc == RPCBPROC_GETADDR) -+ setprog = argument.rpcbproc_set_4_arg.r_prog; -+ -+ if (!check_access(transp, rqstp->rq_proc, setprog, RPCBVERS4)) { - svcerr_weakauth(transp); - goto done; - } -diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c -index 291421f..f6bd6bd 100644 ---- a/src/rpcb_svc_com.c -+++ b/src/rpcb_svc_com.c -@@ -1227,6 +1227,8 @@ send_svcsyserr(SVCXPRT *xprt, struct finfo *fi) - return; - } - -+extern SVCAUTH svc_auth_none; -+ - static void - handle_reply(int fd, SVCXPRT *xprt) - { -@@ -1293,7 +1295,10 @@ handle_reply(int fd, SVCXPRT *xprt) - a.rmt_localvers = fi->versnum; - - xprt_set_caller(xprt, fi); -+ xprt->xp_auth = &svc_auth_none; - svc_sendreply(xprt, (xdrproc_t) xdr_rmtcall_result, (char *) &a); -+ SVCAUTH_DESTROY(xprt->xp_auth); -+ xprt->xp_auth = NULL; - done: - if (buffer) - free(buffer); -@@ -1372,10 +1377,13 @@ static char * - getowner(SVCXPRT *transp, char *owner, size_t ownersize) - { - uid_t uid; -- -- if (__rpc_get_local_uid(transp, &uid) < 0) -- snprintf(owner, ownersize, "unknown"); -- else if (uid == 0) -+ -+ if (__rpc_get_local_uid(transp, &uid) < 0) { -+ if (is_localroot(svc_getrpccaller(transp))) -+ snprintf(owner, ownersize, "superuser"); -+ else -+ snprintf(owner, ownersize, "unknown"); -+ } else if (uid == 0) - snprintf(owner, ownersize, "superuser"); - else - snprintf(owner, ownersize, "%d", uid); -diff --git a/src/rpcbind.c b/src/rpcbind.c -index 525ffba..9a0504d 100644 ---- a/src/rpcbind.c -+++ b/src/rpcbind.c -@@ -68,7 +68,6 @@ - #include - #include - #include --#include "config.h" - #include "rpcbind.h" - - /*#define RPCBIND_DEBUG*/ -@@ -77,6 +76,7 @@ - - int debugging = 0; /* Tell me what's going on */ - int doabort = 0; /* When debugging, do an abort on errors */ -+int dofork = 1; /* fork? */ - - rpcblist_ptr list_rbl; /* A list of version 3/4 rpcbind services */ - -@@ -213,8 +213,8 @@ main(int argc, char *argv[]) - printf("\n"); - } - #endif -- } else { -- if (daemon(0, 0)) -+ } else if (dofork) { -+ if (daemon(0, 0)) - err(1, "fork failed"); - } - -@@ -236,6 +236,10 @@ main(int argc, char *argv[]) - syslog(LOG_ERR, "setgid to '%s' (%d) failed: %m", id, p->pw_gid); - exit(1); - } -+ if (setgroups(0, NULL) == -1) { -+ syslog(LOG_ERR, "dropping supplemental groups failed: %m"); -+ exit(1); -+ } - if (setuid(p->pw_uid) == -1) { - syslog(LOG_ERR, "setuid to '%s' (%d) failed: %m", id, p->pw_uid); - exit(1); -@@ -276,6 +280,7 @@ init_transport(struct netconfig *nconf) - int addrlen = 0; - int nhostsbak; - int checkbind; -+ int on = 1; - struct sockaddr *sa = NULL; - u_int32_t host_addr[4]; /* IPv4 or IPv6 */ - struct sockaddr_un sun; -@@ -493,6 +498,14 @@ init_transport(struct netconfig *nconf) - } - 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) -@@ -731,7 +744,7 @@ parseargs(int argc, char *argv[]) - { - int c; - oldstyle_local = 1; -- while ((c = getopt(argc, argv, "dwah:ils")) != -1) { -+ while ((c = getopt(argc, argv, "adh:ilswf")) != -1) { - switch (c) { - case 'a': - doabort = 1; /* when debugging, do an abort on */ -@@ -758,13 +771,16 @@ parseargs(int argc, char *argv[]) - case 's': - runasdaemon = 1; - break; -+ case 'f': -+ dofork = 0; -+ break; - #ifdef WARMSTART - case 'w': - warmstart = 1; - break; - #endif - default: /* error */ -- fprintf(stderr, "usage: rpcbind [-Idwils]\n"); -+ fprintf(stderr, "usage: rpcbind [-adhilswf]\n"); - exit (1); - } - } -diff --git a/src/rpcbind.h b/src/rpcbind.h -index c800577..74f9591 100644 ---- a/src/rpcbind.h -+++ b/src/rpcbind.h -@@ -119,7 +119,7 @@ void rpcbind_abort(void); - void reap(int); - void toggle_verboselog(int); - --int check_access(SVCXPRT *, rpcproc_t, void *, unsigned int); -+int check_access(SVCXPRT *, rpcproc_t, rpcprog_t, unsigned int); - int check_callit(SVCXPRT *, struct r_rmtcall_args *, int); - void logit(int, struct sockaddr *, rpcproc_t, rpcprog_t, const char *); - int is_loopback(struct netbuf *); -diff --git a/src/security.c b/src/security.c -index 0edeac6..d272f74 100644 ---- a/src/security.c -+++ b/src/security.c -@@ -62,34 +62,21 @@ int log_severity = PORTMAP_LOG_FACILITY|PORTMAP_LOG_SEVERITY; - extern int verboselog; - - int --check_access(SVCXPRT *xprt, rpcproc_t proc, void *args, unsigned int rpcbvers) -+check_access(SVCXPRT *xprt, rpcproc_t proc, rpcprog_t prog, unsigned int rpcbvers) - { - struct netbuf *caller = svc_getrpccaller(xprt); - struct sockaddr *addr = (struct sockaddr *)caller->buf; - #ifdef LIBWRAP - struct request_info req; - #endif -- rpcprog_t prog = 0; -- rpcb *rpcbp; -- struct pmap *pmap; - - /* - * The older PMAP_* equivalents have the same numbers, so - * they are accounted for here as well. - */ - switch (proc) { -- case RPCBPROC_GETADDR: - case RPCBPROC_SET: - case RPCBPROC_UNSET: -- if (rpcbvers > PMAPVERS) { -- rpcbp = (rpcb *)args; -- prog = rpcbp->r_prog; -- } else { -- pmap = (struct pmap *)args; -- prog = pmap->pm_prog; -- } -- if (proc == RPCBPROC_GETADDR) -- break; - if (!insecure && !is_loopback(caller)) { - #ifdef RPCBIND_DEBUG - if (debugging) -@@ -101,6 +88,7 @@ check_access(SVCXPRT *xprt, rpcproc_t proc, void *args, unsigned int rpcbvers) - return 0; - } - break; -+ case RPCBPROC_GETADDR: - case RPCBPROC_CALLIT: - case RPCBPROC_INDIRECT: - case RPCBPROC_DUMP: -@@ -150,8 +138,7 @@ is_loopback(struct netbuf *nbuf) - "Checking caller's adress (port = %d)\n", - ntohs(sin->sin_port)); - #endif -- return ((sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) && -- (ntohs(sin->sin_port) < IPPORT_RESERVED)); -+ return (sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)); - #ifdef INET6 - case AF_INET6: - if (!oldstyle_local) -@@ -163,10 +150,9 @@ is_loopback(struct netbuf *nbuf) - "Checking caller's adress (port = %d)\n", - ntohs(sin6->sin6_port)); - #endif -- return ((IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr) || -+ return (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr) || - (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) && -- sin6->sin6_addr.s6_addr32[3] == htonl(INADDR_LOOPBACK))) && -- (ntohs(sin6->sin6_port) < IPV6PORT_RESERVED)); -+ sin6->sin6_addr.s6_addr32[3] == htonl(INADDR_LOOPBACK))); - #endif - case AF_LOCAL: - return 1; -diff --git a/src/warmstart.c b/src/warmstart.c -index 25e5d89..d1bb971 100644 ---- a/src/warmstart.c -+++ b/src/warmstart.c -@@ -46,7 +46,6 @@ - #include - #include - --#include "config.h" - #include "rpcbind.h" - - #ifndef RPCBIND_STATEDIR diff --git a/rpcbind.spec b/rpcbind.spec index e4ac13e..1280b5d 100644 --- a/rpcbind.spec +++ b/rpcbind.spec @@ -1,6 +1,6 @@ Name: rpcbind -Version: 0.2.2 -Release: 2.2%{?dist} +Version: 0.2.3 +Release: 0.0%{?dist} Summary: Universal Addresses to RPC Program Number Mapper Group: System Environment/Daemons License: BSD @@ -12,9 +12,6 @@ Source1: rpcbind.service Source2: rpcbind.socket Source3: rpcbind.sysconfig -Patch001: rpcbind-0.2.3-rc2.patch -Patch002: rpcbind-0.2.2-xlog-debug.patch - Requires: glibc-common setup Conflicts: man-pages < 2.43-12 BuildRequires: automake, autoconf, libtool, systemd, systemd-devel @@ -35,9 +32,6 @@ RPC calls on a server on that machine. %prep %setup -q -%patch001 -p1 -%patch002 -p1 - %build %ifarch s390 s390x PIE="-fPIE" @@ -135,6 +129,9 @@ fi %dir %attr(700,rpc,rpc) /var/run/rpcbind %changelog +* Tue Apr 28 2015 Steve Dickson - 0.2.3-0.0 +- Updated to latest upstream release: 0.2.3 + * Thu Mar 19 2015 Steve Dickson - 0.2.2-2.2 - Changed RPCBDIR to be /var/run so bindings are perserved during upgrades but not reboots. diff --git a/sources b/sources index 87b1391..e77f0b2 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -8acf839bfef2364a05fbd6be5f8edf9a rpcbind-0.2.2.tar.bz2 +c8875246b2688a1adfbd6ad43480278d rpcbind-0.2.3.tar.bz2