From 76f8598fd20727908e760cbb497dd6a17eda4af5 Mon Sep 17 00:00:00 2001 From: Roy Li Date: Wed, 17 Sep 2014 13:22:14 +0800 Subject: [PATCH] add option to make users able to use fixed port number Upstream-Status: Submitted [https://sourceforge.net/p/rpcbind/discussion/716839/thread/32af721d/] Signed-off-by: Li Wang Signed-off-by: Roy Li Signed-off-by: Yi Zhao --- man/rpcbind.8 | 4 +++- src/rpcb_svc_com.c | 17 +++++++++++++++++ src/rpcbind.c | 8 ++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/man/rpcbind.8 b/man/rpcbind.8 index fbf0ace..66f7c08 100644 --- a/man/rpcbind.8 +++ b/man/rpcbind.8 @@ -11,7 +11,7 @@ .Nd universal addresses to RPC program number mapper .Sh SYNOPSIS .Nm -.Op Fl adhiLls +.Op Fl adhpiLls .Sh DESCRIPTION The .Nm @@ -96,6 +96,8 @@ will automatically add and if IPv6 is enabled, .Li ::1 to the list. +.It Fl p +Bind for fixed UDP port number If no .Fl h option is specified, diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c index 1743dad..07a1c75 100644 --- a/src/rpcb_svc_com.c +++ b/src/rpcb_svc_com.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -497,6 +498,7 @@ xdr_opaque_parms(XDR *xdrs, struct r_rmtcall_args *cap) static struct rmtcallfd_list *rmthead; static struct rmtcallfd_list *rmttail; +extern unsigned short fixed_port; int create_rmtcall_fd(struct netconfig *nconf) @@ -504,6 +506,8 @@ create_rmtcall_fd(struct netconfig *nconf) int fd; struct rmtcallfd_list *rmt; SVCXPRT *xprt; + struct __rpc_sockinfo si; + struct t_bind taddr; if ((fd = __rpc_nconf2fd(nconf)) == -1) { if (debugging) @@ -512,6 +516,19 @@ create_rmtcall_fd(struct netconfig *nconf) nconf->nc_device, errno); return (-1); } + + if (fixed_port) { + __rpc_fd2sockinfo(fd, &si); + memset(&taddr, 0, sizeof(taddr)); + taddr.addr.maxlen = taddr.addr.len = si.si_alen; + taddr.addr.buf = malloc(si.si_alen); + if (taddr.addr.buf == NULL) { + return -1; + } + *(unsigned short *)(&(taddr.addr.buf[0])) = si.si_af; + *(unsigned short *)(&(taddr.addr.buf[2])) = htons(fixed_port); + xprt = svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE); + } else xprt = svc_tli_create(fd, 0, (struct t_bind *) 0, 0, 0); if (xprt == NULL) { if (debugging) diff --git a/src/rpcbind.c b/src/rpcbind.c index 25d8a90..36a95b9 100644 --- a/src/rpcbind.c +++ b/src/rpcbind.c @@ -111,6 +111,7 @@ int runasdaemon = 0; int insecure = 0; int oldstyle_local = 0; int verboselog = 0; +unsigned short fixed_port = 0; char **hosts = NULL; int nhosts = 0; @@ -884,7 +885,7 @@ parseargs(int argc, char *argv[]) { int c; oldstyle_local = 1; - while ((c = getopt(argc, argv, "adh:ilswf")) != -1) { + while ((c = getopt(argc, argv, "adh:p:ilswf")) != -1) { switch (c) { case 'a': doabort = 1; /* when debugging, do an abort on */ @@ -902,6 +903,9 @@ parseargs(int argc, char *argv[]) if (hosts[nhosts - 1] == NULL) errx(1, "Out of memory"); break; + case 'p': + fixed_port = atoi(optarg); + break; case 'i': insecure = 1; break; @@ -920,7 +924,7 @@ parseargs(int argc, char *argv[]) break; #endif default: /* error */ - fprintf(stderr, "usage: rpcbind [-adhilswf]\n"); + fprintf(stderr, "usage: rpcbind [-adhpilswf]\n"); exit (1); } } -- 2.25.1