| https://sourceforge.net/tracker/?func=detail&aid=3120897&group_id=53066&atid=469575 |
| |
| From 6f8927c609d1f986a45010b7acae0eb570668642 Mon Sep 17 00:00:00 2001 |
| From: Mike Frysinger <vapier@gentoo.org> |
| Date: Sat, 27 Nov 2010 17:18:05 -0500 |
| Subject: [PATCH] add support for nommu systems |
| |
| Rather than hardcode the WIN32 define, add proper fork checks to the |
| configure script and check those. This fixes building for nommu systems |
| which lack the fork function. |
| |
| While we're here though, add support for this functionality via vfork |
| so that it does work on nommu systems. And fix an old bug where we |
| exit properly in the forked child when the exec failed instead of just |
| returning to the calling code (which isn't expecting it). |
| |
| Signed-off-by: Mike Frysinger <vapier@gentoo.org> |
| --- |
| |
| --- tcpdump-4.0.0/config.h.in |
| +++ tcpdump-4.0.0/config.h.in |
| @@ -151,6 +151,9 @@ |
| /* Define to 1 if you have the <fcntl.h> header file. */ |
| #undef HAVE_FCNTL_H |
| |
| +/* Define to 1 if you have the `fork' function. */ |
| +#undef HAVE_FORK |
| + |
| /* Define to 1 if you have the `getnameinfo' function. */ |
| #undef HAVE_GETNAMEINFO |
| |
| @@ -274,6 +277,9 @@ |
| /* Define to 1 if you have the <unistd.h> header file. */ |
| #undef HAVE_UNISTD_H |
| |
| +/* Define to 1 if you have the `vfork' function. */ |
| +#undef HAVE_VFORK |
| + |
| /* Define to 1 if you have the `vfprintf' function. */ |
| #undef HAVE_VFPRINTF |
| |
| --- tcpdump-4.0.0/configure |
| +++ tcpdump-4.0.0/configure |
| @@ -7976,7 +7976,7 @@ done |
| |
| |
| |
| -for ac_func in strftime |
| +for ac_func in fork vfork strftime |
| do |
| as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` |
| { echo "$as_me:$LINENO: checking for $ac_func" >&5 |
| diff --git a/tcpdump.c b/tcpdump.c |
| index c8da36b..abf3e69 100644 |
| --- a/tcpdump.c |
| +++ b/tcpdump.c |
| @@ -1250,8 +1250,10 @@ main(int argc, char **argv) |
| (void)setsignal(SIGPIPE, cleanup); |
| (void)setsignal(SIGTERM, cleanup); |
| (void)setsignal(SIGINT, cleanup); |
| - (void)setsignal(SIGCHLD, child_cleanup); |
| #endif /* WIN32 */ |
| +#if defined(HAVE_FORK) || defined(HAVE_VFORK) |
| + (void)setsignal(SIGCHLD, child_cleanup); |
| +#endif |
| /* Cooperate with nohup(1) */ |
| #ifndef WIN32 |
| if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL) |
| @@ -1464,13 +1466,13 @@ cleanup(int signo _U_) |
| On windows, we do not use a fork, so we do not care less about |
| waiting a child processes to die |
| */ |
| -#ifndef WIN32 |
| +#if defined(HAVE_FORK) || defined(HAVE_VFORK) |
| static RETSIGTYPE |
| child_cleanup(int signo _U_) |
| { |
| wait(NULL); |
| } |
| -#endif /* WIN32 */ |
| +#endif /* HAVE_FORK || HAVE_VFORK */ |
| |
| static void |
| info(register int verbose) |
| @@ -1514,11 +1516,15 @@ info(register int verbose) |
| infoprint = 0; |
| } |
| |
| -#ifndef WIN32 |
| +#if defined(HAVE_FORK) || defined(HAVE_VFORK) |
| static void |
| compress_savefile(const char *filename) |
| { |
| +# ifdef HAVE_FORK |
| if (fork()) |
| +# else |
| + if (vfork()) |
| +# endif |
| return; |
| /* |
| * Set to lowest priority so that this doesn't disturb the capture |
| @@ -1534,15 +1540,20 @@ compress_savefile(const char *filename) |
| zflag, |
| filename, |
| strerror(errno)); |
| +# ifdef HAVE_FORK |
| + exit(1); |
| +# else |
| + _exit(1); |
| +# endif |
| } |
| -#else /* WIN32 */ |
| +#else /* HAVE_FORK || HAVE_VFORK */ |
| static void |
| compress_savefile(const char *filename) |
| { |
| fprintf(stderr, |
| - "compress_savefile failed. Functionality not implemented under windows\n"); |
| + "compress_savefile failed. Functionality not implemented under your system\n"); |
| } |
| -#endif /* WIN32 */ |
| +#endif /* HAVE_FORK || HAVE_VFORK */ |
| |
| static void |
| dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) |
| -- |
| 1.7.3.1 |