Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame^] | 1 | From 76f8598fd20727908e760cbb497dd6a17eda4af5 Mon Sep 17 00:00:00 2001 |
| 2 | From: Roy Li <rongqing.li@windriver.com> |
| 3 | Date: Wed, 17 Sep 2014 13:22:14 +0800 |
| 4 | Subject: [PATCH] add option to make users able to use fixed port number |
| 5 | |
| 6 | Upstream-Status: Submitted [https://sourceforge.net/p/rpcbind/discussion/716839/thread/32af721d/] |
| 7 | |
| 8 | Signed-off-by: Li Wang <li.wang@windriver.com> |
| 9 | Signed-off-by: Roy Li <rongqing.li@windriver.com> |
| 10 | Signed-off-by: Yi Zhao <yi.zhao@windriver.com> |
| 11 | --- |
| 12 | man/rpcbind.8 | 4 +++- |
| 13 | src/rpcb_svc_com.c | 17 +++++++++++++++++ |
| 14 | src/rpcbind.c | 8 ++++++-- |
| 15 | 3 files changed, 26 insertions(+), 3 deletions(-) |
| 16 | |
| 17 | diff --git a/man/rpcbind.8 b/man/rpcbind.8 |
| 18 | index af6200f..2e6146b 100644 |
| 19 | --- a/man/rpcbind.8 |
| 20 | +++ b/man/rpcbind.8 |
| 21 | @@ -11,7 +11,7 @@ |
| 22 | .Nd universal addresses to RPC program number mapper |
| 23 | .Sh SYNOPSIS |
| 24 | .Nm |
| 25 | -.Op Fl adhiLls |
| 26 | +.Op Fl adhpiLls |
| 27 | .Sh DESCRIPTION |
| 28 | The |
| 29 | .Nm |
| 30 | @@ -107,6 +107,8 @@ will automatically add |
| 31 | and if IPv6 is enabled, |
| 32 | .Li ::1 |
| 33 | to the list. |
| 34 | +.It Fl p |
| 35 | +Bind for fixed UDP port number |
| 36 | .It Fl i |
| 37 | .Dq Insecure |
| 38 | mode. |
| 39 | diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c |
| 40 | index 8aef9e5..c2632a4 100644 |
| 41 | --- a/src/rpcb_svc_com.c |
| 42 | +++ b/src/rpcb_svc_com.c |
| 43 | @@ -48,6 +48,7 @@ |
| 44 | #include <rpc/rpc.h> |
| 45 | #include <rpc/rpcb_prot.h> |
| 46 | #include <rpc/svc_dg.h> |
| 47 | +#include <rpc/rpc_com.h> |
| 48 | #include <netconfig.h> |
| 49 | #include <errno.h> |
| 50 | #include <syslog.h> |
| 51 | @@ -497,6 +498,7 @@ xdr_opaque_parms(XDR *xdrs, struct r_rmtcall_args *cap) |
| 52 | |
| 53 | static struct rmtcallfd_list *rmthead; |
| 54 | static struct rmtcallfd_list *rmttail; |
| 55 | +extern unsigned short fixed_port; |
| 56 | |
| 57 | int |
| 58 | create_rmtcall_fd(struct netconfig *nconf) |
| 59 | @@ -504,6 +506,8 @@ create_rmtcall_fd(struct netconfig *nconf) |
| 60 | int fd; |
| 61 | struct rmtcallfd_list *rmt; |
| 62 | SVCXPRT *xprt; |
| 63 | + struct __rpc_sockinfo si; |
| 64 | + struct t_bind taddr; |
| 65 | |
| 66 | if ((fd = __rpc_nconf2fd(nconf)) == -1) { |
| 67 | if (debugging) |
| 68 | @@ -512,6 +516,19 @@ create_rmtcall_fd(struct netconfig *nconf) |
| 69 | nconf->nc_device, errno); |
| 70 | return (-1); |
| 71 | } |
| 72 | + |
| 73 | + if (fixed_port) { |
| 74 | + __rpc_fd2sockinfo(fd, &si); |
| 75 | + memset(&taddr, 0, sizeof(taddr)); |
| 76 | + taddr.addr.maxlen = taddr.addr.len = si.si_alen; |
| 77 | + taddr.addr.buf = malloc(si.si_alen); |
| 78 | + if (taddr.addr.buf == NULL) { |
| 79 | + return -1; |
| 80 | + } |
| 81 | + *(unsigned short *)(&(taddr.addr.buf[0])) = si.si_af; |
| 82 | + *(unsigned short *)(&(taddr.addr.buf[2])) = htons(fixed_port); |
| 83 | + xprt = svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE); |
| 84 | + } else |
| 85 | xprt = svc_tli_create(fd, 0, (struct t_bind *) 0, 0, 0); |
| 86 | if (xprt == NULL) { |
| 87 | if (debugging) |
| 88 | diff --git a/src/rpcbind.c b/src/rpcbind.c |
| 89 | index 137011b..dc3d2d6 100644 |
| 90 | --- a/src/rpcbind.c |
| 91 | +++ b/src/rpcbind.c |
| 92 | @@ -111,6 +111,7 @@ int runasdaemon = 0; |
| 93 | int insecure = 0; |
| 94 | int oldstyle_local = 0; |
| 95 | int verboselog = 0; |
| 96 | +unsigned short fixed_port = 0; |
| 97 | |
| 98 | char **hosts = NULL; |
| 99 | int nhosts = 0; |
| 100 | @@ -869,7 +870,7 @@ parseargs(int argc, char *argv[]) |
| 101 | { |
| 102 | int c; |
| 103 | oldstyle_local = 1; |
| 104 | - while ((c = getopt(argc, argv, "adh:ilswf")) != -1) { |
| 105 | + while ((c = getopt(argc, argv, "adh:p:ilswf")) != -1) { |
| 106 | switch (c) { |
| 107 | case 'a': |
| 108 | doabort = 1; /* when debugging, do an abort on */ |
| 109 | @@ -887,6 +888,9 @@ parseargs(int argc, char *argv[]) |
| 110 | if (hosts[nhosts - 1] == NULL) |
| 111 | errx(1, "Out of memory"); |
| 112 | break; |
| 113 | + case 'p': |
| 114 | + fixed_port = atoi(optarg); |
| 115 | + break; |
| 116 | case 'i': |
| 117 | insecure = 1; |
| 118 | break; |
| 119 | @@ -905,7 +909,7 @@ parseargs(int argc, char *argv[]) |
| 120 | break; |
| 121 | #endif |
| 122 | default: /* error */ |
| 123 | - fprintf(stderr, "usage: rpcbind [-adhilswf]\n"); |
| 124 | + fprintf(stderr, "usage: rpcbind [-adhpilswf]\n"); |
| 125 | exit (1); |
| 126 | } |
| 127 | } |
| 128 | -- |
| 129 | 1.9.1 |
| 130 | |