Nmap Development mailing list archives
[PATCH/RFC] add support for systems w/out fork()
From: Mike Frysinger <vapier () gentoo org>
Date: Thu, 16 Jul 2009 18:52:10 -0400
Not sure how people wish to handle the -lpthread in Makefile.in.
Signed-off-by: Mike Frysinger <vapier () gentoo org>
---
main.cc | 3 +++
ncat/Makefile.in | 2 +-
ncat/ncat_posix.c | 6 +++++-
ncat/ncat_proxy.c | 22 +++++++++++++++++++++-
ncat/util.c | 8 ++++++++
ncat/util.h | 5 +++++
6 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/main.cc b/main.cc
index 2db1a72..c2ce38f 100644
--- a/main.cc
+++ b/main.cc
@@ -254,6 +254,9 @@ int main(int argc, char *argv[]) {
} else if (*myargv[0] == 'd') {
o.debugging++;
} else if (strcasecmp(myargv[0], "f") == 0) {
+#ifndef HAVE_FORK
+# define fork() vfork()
+#endif
switch((ret = fork())) {
case 0: /* Child */
/* My job is as follows:
diff --git a/ncat/Makefile.in b/ncat/Makefile.in
index b4f7d7a..c5ae8c1 100644
--- a/ncat/Makefile.in
+++ b/ncat/Makefile.in
@@ -54,7 +54,7 @@ CC = @CC@
CPPFLAGS = @CPPFLAGS@
CFLAGS = @CFLAGS@
LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
+LIBS = @LIBS@ -lpthread
DEFS = @DEFS@ -DNCAT_DATADIR="\"$(pkgdatadir)\""
# With GCC, add extra security checks to source code.
DEFS += -D_FORTIFY_SOURCE=2
diff --git a/ncat/ncat_posix.c b/ncat/ncat_posix.c
index d0c7d7c..57e20cb 100644
--- a/ncat/ncat_posix.c
+++ b/ncat/ncat_posix.c
@@ -6,6 +6,10 @@
static char **cmdline_split(const char *cmdexec);
+#ifndef HAVE_FORK
+# define fork() vfork()
+#endif
+
/* fork and exec a child process with netexec. Close the given file descriptor
in the parent process. Return the child's PID or -1 on error. */
int netrun(int fd, char *cmdexec)
@@ -58,7 +62,7 @@ void netexec(int fd, char *cmdexec)
execv(cmdargs[0], cmdargs);
}
/* exec failed.*/
- die("exec");
+ _die("exec");
}
/* Split a command line into an array suitable for handing to execv. */
diff --git a/ncat/ncat_proxy.c b/ncat/ncat_proxy.c
index cfd943c..b8d483a 100644
--- a/ncat/ncat_proxy.c
+++ b/ncat/ncat_proxy.c
@@ -117,7 +117,7 @@ static void fork_handler(int s, int c)
}
CloseHandle(thread);
}
-#else
+#elif defined(HAVE_FORK)
static void fork_handler(int s, int c)
{
int rc;
@@ -140,6 +140,26 @@ static void fork_handler(int s, int c)
Close(c);
}
}
+#else
+#include <pthread.h>
+static void *handler_thread_func(void *data)
+{
+ http_server_handler((int)data);
+ return 0;
+}
+
+static void fork_handler(int s, int c)
+{
+ int ret;
+ pthread_t tid;
+
+ ret = pthread_create(&tid, NULL, handler_thread_func, (void *)c);
+ if (ret) {
+ if (o.verbose)
+ logdebug("Error in pthread_create: %s\n", strerror(errno));
+ return;
+ }
+}
#endif
/* Is this one of the methods we can handle? */
diff --git a/ncat/util.c b/ncat/util.c
index 8303b37..8713253 100644
--- a/ncat/util.c
+++ b/ncat/util.c
@@ -78,6 +78,14 @@ void logdebug(const char *fmt, ...)
va_end(ap);
}
+#ifndef HAVE_FORK
+void _die(char *err)
+{
+ perror(err);
+ _exit(EXIT_FAILURE);
+}
+#endif
+
void die(char *err)
{
perror(err);
diff --git a/ncat/util.h b/ncat/util.h
index e69701f..a9adf35 100644
--- a/ncat/util.h
+++ b/ncat/util.h
@@ -35,6 +35,11 @@ void loguser(const char *fmt, ...);
void logdebug(const char *fmt, ...);
/* handle errors */
+#ifndef HAVE_FORK
+void _die(char *);
+#else
+#define _die(msg) die(msg)
+#endif
void die(char *);
void bye(const char *, ...);
--
1.6.3.3
_______________________________________________
Sent through the nmap-dev mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-dev
Archived at http://SecLists.Org
Current thread:
- [PATCH/RFC] add support for systems w/out fork() Mike Frysinger (Jul 17)
- Re: [PATCH/RFC] add support for systems w/out fork() David Fifield (Jul 21)
- Re: [PATCH/RFC] add support for systems w/out fork() Mike Frysinger (Jul 25)
- Re: [PATCH/RFC] add support for systems w/out fork() David Fifield (Jul 21)
