|
@@ -0,0 +1,95 @@
|
|
|
+From b3afea5757af1a7356ba30d2e0a7d5909ca18121 Mon Sep 17 00:00:00 2001
|
|
|
+From: Mike Frysinger <vapier@gentoo.org>
|
|
|
+Date: Fri, 19 Nov 2010 23:48:20 -0500
|
|
|
+Subject: [PATCH 3/4] NO_FORK: control usage of fork() for nommu systems
|
|
|
+
|
|
|
+nommu systems lack a fork() function, so add a NO_FORK flag to control
|
|
|
+its usage. We don't lose a ton of functionality in doing so, and on an
|
|
|
+embedded system, this is OK.
|
|
|
+
|
|
|
+Signed-off-by: Mike Frysinger <vapier@gentoo.org>
|
|
|
+---
|
|
|
+ Makefile | 5 +++++
|
|
|
+ README | 1 +
|
|
|
+ pmap_check.c | 6 ++++--
|
|
|
+ portmap.c | 6 ++++++
|
|
|
+ 4 files changed, 16 insertions(+), 2 deletions(-)
|
|
|
+
|
|
|
+diff --git a/Makefile b/Makefile
|
|
|
+index cfcfdbb..9df5574 100644
|
|
|
+--- a/Makefile
|
|
|
++++ b/Makefile
|
|
|
+@@ -27,6 +27,11 @@ MAN_SED += -e 's/USE_DNS/yes/'
|
|
|
+ endif
|
|
|
+ endif
|
|
|
+
|
|
|
++# For no-mmu systems, we have to disable the fork() functions.
|
|
|
++ifneq ($(NO_FORK),)
|
|
|
++CPPFLAGS += -DNO_FORK
|
|
|
++endif
|
|
|
++
|
|
|
+ # Comment out if your RPC library does not allocate privileged ports for
|
|
|
+ # requests from processes with root privilege, or the new portmap will
|
|
|
+ # always reject requests to register/unregister services on privileged
|
|
|
+diff --git a/README b/README
|
|
|
+index e0b561a..bda1707 100644
|
|
|
+--- a/README
|
|
|
++++ b/README
|
|
|
+@@ -18,6 +18,7 @@ There is no "./configure", just use "make".
|
|
|
+
|
|
|
+ Some make variable can be used to control compilation.
|
|
|
+
|
|
|
++ NO_FORK= if non-empty, don't use fork (good for nommu systems)
|
|
|
+ NO_PIE= if non-empty, don't build portmap as a PIE
|
|
|
+ NO_TCP_WRAPPER= if non-empty, don't use tcp_wrappers
|
|
|
+ USE_DNS= if set, tcp_wrappers can check peers based on hostname
|
|
|
+diff --git a/pmap_check.c b/pmap_check.c
|
|
|
+index 6b3e490..983414e 100644
|
|
|
+--- a/pmap_check.c
|
|
|
++++ b/pmap_check.c
|
|
|
+@@ -302,8 +302,10 @@ static void logit(int severity, struct sockaddr_in *addr,
|
|
|
+ * getrpcbynumber() or syslog() does its thing.
|
|
|
+ */
|
|
|
+
|
|
|
+- if (fork() == 0) {
|
|
|
+-
|
|
|
++#ifndef NO_FORK
|
|
|
++ if (fork() == 0)
|
|
|
++#endif
|
|
|
++ {
|
|
|
+ /* Try to map program number to name. */
|
|
|
+
|
|
|
+ if (prognum == 0) {
|
|
|
+diff --git a/portmap.c b/portmap.c
|
|
|
+index 2a98881..94abc64 100644
|
|
|
+--- a/portmap.c
|
|
|
++++ b/portmap.c
|
|
|
+@@ -753,6 +755,7 @@ static void callit(struct svc_req *rqstp, SVCXPRT *xprt)
|
|
|
+ if ((pml = find_service(a.rmt_prog, a.rmt_vers,
|
|
|
+ (u_long)IPPROTO_UDP)) == NULL)
|
|
|
+ return;
|
|
|
++#ifndef NO_FORK
|
|
|
+ /*
|
|
|
+ * fork a child to do the work. Parent immediately returns.
|
|
|
+ * Child exits upon completion.
|
|
|
+@@ -763,6 +766,7 @@ static void callit(struct svc_req *rqstp, SVCXPRT *xprt)
|
|
|
+ a.rmt_prog);
|
|
|
+ return;
|
|
|
+ }
|
|
|
++#endif
|
|
|
+ port = pml->pml_map.pm_port;
|
|
|
+ get_myaddress(&me);
|
|
|
+ me.sin_port = htons(port);
|
|
|
+@@ -783,7 +787,9 @@ static void callit(struct svc_req *rqstp, SVCXPRT *xprt)
|
|
|
+ clnt_destroy(client);
|
|
|
+ }
|
|
|
+ (void)close(so);
|
|
|
++#ifndef NO_FORK
|
|
|
+ exit(0);
|
|
|
++#endif
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifndef IGNORE_SIGCHLD /* Lionel Cons <cons@dxcern.cern.ch> */
|
|
|
+--
|
|
|
+1.7.3.1
|
|
|
+
|