[rpcbind] Added xlogging debugging to rpcbind
Steve Dickson
steved at fedoraproject.org
Thu Feb 5 15:31:53 UTC 2015
commit 784f00ed44c112280df30bbc4345246d33fa2258
Author: Steve Dickson <steved at redhat.com>
Date: Thu Feb 5 10:26:19 2015 -0500
Added xlogging debugging to rpcbind
Signed-off-by: Steve Dickson <steved at redhat.com>
rpcbind-0.2.2-xlog-debug.patch | 1213 ++++++++++++++++++++++++++++++++++++++++
rpcbind.spec | 7 +-
2 files changed, 1219 insertions(+), 1 deletions(-)
---
diff --git a/rpcbind-0.2.2-xlog-debug.patch b/rpcbind-0.2.2-xlog-debug.patch
new file mode 100644
index 0000000..cbda4b8
--- /dev/null
+++ b/rpcbind-0.2.2-xlog-debug.patch
@@ -0,0 +1,1213 @@
+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 <rpc/pmap_prot.h>
+ #include <rpc/rpcb_prot.h>
+ #ifdef RPCBIND_DEBUG
++#include <syslog.h>
+ #include <stdlib.h>
+ #endif
+ #include "rpcbind.h"
++#include "xlog.h"
+ #include <rpc/svc_soc.h> /* 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)?: "<invalid>",
+ 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) ?: "<unknown>",
+@@ -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, <becker at super.org>
++ * Rick Sladkey, <jrs at world.std.com>
++ * Fred N. van Kempen, <waltje at uWalt.NL.Mugnet.ORG>
++ * Olaf Kirch, <okir at monad.swb.de>
++ *
++ * 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 <config.h>
++#endif
++
++#include <unistd.h>
++#include <signal.h>
++#include <time.h>
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++#include <stdarg.h>
++#include <syslog.h>
++#include <errno.h>
++#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 <okir at monad.swb.de>
++ */
++
++#ifndef XLOG_H
++#define XLOG_H
++
++#include <stdarg.h>
++
++/* 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.spec b/rpcbind.spec
index 545f065..3eea686 100644
--- a/rpcbind.spec
+++ b/rpcbind.spec
@@ -1,6 +1,6 @@
Name: rpcbind
Version: 0.2.2
-Release: 2.0%{?dist}
+Release: 2.1%{?dist}
Summary: Universal Addresses to RPC Program Number Mapper
Group: System Environment/Daemons
License: BSD
@@ -13,6 +13,7 @@ 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
@@ -35,6 +36,7 @@ RPC calls on a server on that machine.
%setup -q
%patch001 -p1
+%patch002 -p1
%build
%ifarch s390 s390x
@@ -126,6 +128,9 @@ fi
%dir %attr(700,rpc,rpc) /var/lib/rpcbind
%changelog
+* Thu Feb 5 2015 Steve Dickson <steved at redhat.com> - 0.2.2-2.1
+- Added xlogging debugging to rpcbind
+
* Wed Feb 4 2015 Steve Dickson <steved at redhat.com> - 0.2.2-2.0
- Updated to the latest rc release: rpcbind-0_2_3-rc1 (bz 1095021)
More information about the scm-commits
mailing list