summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/rpcbind/rpcbind/rpcbind_add_option_to_fix_port_number.patch
blob: 434b6b1c4cfd8b067c5539050fc68ea3819bfb29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
From 76f8598fd20727908e760cbb497dd6a17eda4af5 Mon Sep 17 00:00:00 2001
From: Roy Li <rongqing.li@windriver.com>
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 <li.wang@windriver.com>
Signed-off-by: Roy Li <rongqing.li@windriver.com>
Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
---
 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 af6200f..2e6146b 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
@@ -107,6 +107,8 @@ will automatically add
 and if IPv6 is enabled,
 .Li ::1
 to the list.
+.It Fl p
+Bind for fixed UDP port number
 .It Fl i
 .Dq Insecure
 mode.
diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c
index 8aef9e5..c2632a4 100644
--- a/src/rpcb_svc_com.c
+++ b/src/rpcb_svc_com.c
@@ -48,6 +48,7 @@
 #include <rpc/rpc.h>
 #include <rpc/rpcb_prot.h>
 #include <rpc/svc_dg.h>
+#include <rpc/rpc_com.h>
 #include <netconfig.h>
 #include <errno.h>
 #include <syslog.h>
@@ -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 137011b..dc3d2d6 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;
@@ -869,7 +870,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 */
@@ -887,6 +888,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;
@@ -905,7 +909,7 @@ parseargs(int argc, char *argv[])
 			break;
 #endif
 		default:	/* error */
-			fprintf(stderr,	"usage: rpcbind [-adhilswf]\n");
+			fprintf(stderr,	"usage: rpcbind [-adhpilswf]\n");
 			exit (1);
 		}
 	}
-- 
1.9.1