diff options
Diffstat (limited to 'net-mgmt/arpwatch-devel/files/patch-ae')
-rw-r--r-- | net-mgmt/arpwatch-devel/files/patch-ae | 336 |
1 files changed, 316 insertions, 20 deletions
diff --git a/net-mgmt/arpwatch-devel/files/patch-ae b/net-mgmt/arpwatch-devel/files/patch-ae index 3fe876affcc2..41828fffe373 100644 --- a/net-mgmt/arpwatch-devel/files/patch-ae +++ b/net-mgmt/arpwatch-devel/files/patch-ae @@ -1,20 +1,316 @@ ---- configure.orig Thu Jun 15 01:37:53 2000 -+++ configure Tue Sep 5 02:57:33 2000 -@@ -649,7 +649,7 @@ - : - fi - -- V_CCOPT="-O" -+# V_CCOPT="-O" - V_INCLS="" - if test "${srcdir}" != "." ; then - V_INCLS="-I\$\(srcdir\)" -@@ -2599,7 +2599,7 @@ - fi - V_CCOPT="$V_CCOPT -Wall" - if test $ac_cv_lbl_gcc_vers -gt 1 ; then -- V_CCOPT="$V_CCOPT -Wmissing-prototypes -Wstrict-prototypes" -+# V_CCOPT="$V_CCOPT -Wmissing-prototypes -Wstrict-prototypes" - fi - fi - else +--- arpwatch.c.orig Sat Oct 14 04:07:35 2000 ++++ arpwatch.c Tue Jan 20 00:22:23 2004 +@@ -36,6 +36,7 @@ + #include <sys/ioctl.h> + #include <sys/socket.h> + #include <sys/time.h> ++#include <pthread.h> + + #if __STDC__ + struct mbuf; +@@ -107,6 +108,8 @@ + + char *prog; + ++char *Watcher = NULL; ++ + int can_checkpoint; + int swapped; + int nobogons; +@@ -123,6 +126,14 @@ + static int nets_ind; + static int nets_size; + ++struct aw_threads { ++ char *interface; ++ pthread_t thread; ++}; ++ ++struct aw_threads *threads = NULL; ++extern pthread_mutex_t mtx_einfo, mtx_ainfo; ++ + extern int optind; + extern int opterr; + extern char *optarg; +@@ -145,14 +156,14 @@ + main(int argc, char **argv) + { + register char *cp; +- register int op, pid, snaplen, timeout, linktype, status; ++ register int op, pid, if_cnt, i; + #ifdef TIOCNOTTY + register int fd; + #endif +- register pcap_t *pd; +- register char *interface, *rfilename; +- struct bpf_program code; ++ register char *rfilename; + char errbuf[PCAP_ERRBUF_SIZE]; ++ pcap_if_t *adp, *alldevsp = NULL; ++ char *interface = NULL; + + if (argv[0] == NULL) + prog = "arpwatch"; +@@ -167,10 +178,8 @@ + } + + opterr = 0; +- interface = NULL; + rfilename = NULL; +- pd = NULL; +- while ((op = getopt(argc, argv, "df:i:n:Nr:")) != EOF) ++ while ((op = getopt(argc, argv, "de:f:i:m:n:Nr:")) != EOF) + switch (op) { + + case 'd': +@@ -181,6 +190,10 @@ + #endif + break; + ++ case 'e': ++ etherfile = optarg; ++ break; ++ + case 'f': + arpfile = optarg; + break; +@@ -202,6 +215,10 @@ + rfilename = optarg; + break; + ++ case 'm': ++ Watcher = optarg; ++ break; ++ + default: + usage(); + } +@@ -213,19 +230,23 @@ + net = 0; + netmask = 0; + } else { +- /* Determine interface if not specified */ +- if (interface == NULL && +- (interface = pcap_lookupdev(errbuf)) == NULL) { +- (void)fprintf(stderr, "%s: lookup_device: %s\n", +- prog, errbuf); +- exit(1); +- } ++ /* if not specified, do all non loopback interfaces */ ++ if (interface == NULL) { + +- /* Determine network and netmask */ +- if (pcap_lookupnet(interface, &net, &netmask, errbuf) < 0) { +- (void)fprintf(stderr, "%s: bad interface %s: %s\n", +- prog, interface, errbuf); +- exit(1); ++ pcap_findalldevs(&alldevsp, errbuf); ++ if (alldevsp == NULL) { ++ (void)fprintf(stderr, "no suitable interfaces\n"); ++ exit(1); ++ } ++ ++ if_cnt = 0; ++ for(adp = alldevsp; adp != NULL; adp = adp->next) { ++ if (adp->flags != PCAP_IF_LOOPBACK) ++ ++if_cnt; ++ } ++ ++ } else { ++ if_cnt = 1; + } + + /* Drop into the background if not debugging */ +@@ -238,7 +259,7 @@ + exit(0); + (void)close(fileno(stdin)); + (void)close(fileno(stdout)); +- (void)close(fileno(stderr)); ++ + #ifdef TIOCNOTTY + fd = open("/dev/tty", O_RDWR); + if (fd >= 0) { +@@ -251,12 +272,82 @@ + } + } + +- openlog(prog, 0, LOG_DAEMON); ++ if (debug) ++ openlog(prog, LOG_PERROR, LOG_DAEMON); ++ else ++ openlog(prog, 0, LOG_DAEMON); + + if (chdir(arpdir) < 0) { + syslog(LOG_ERR, "chdir(%s): %m", arpdir); + syslog(LOG_ERR, "(using current working directory)"); + } ++ /* Read in database */ ++ initializing = 1; ++ if (!readdata()) ++ exit(1); ++ sorteinfo(); ++#ifdef DEBUG ++ if (debug > 2) { ++ debugdump(); ++ exit(0); ++ } ++#endif ++ initializing = 0; ++ ++ (void)setsignal(SIGINT, die); ++ (void)setsignal(SIGTERM, die); ++ (void)setsignal(SIGHUP, die); ++ if (rfilename == NULL) { ++ (void)setsignal(SIGQUIT, checkpoint); ++ (void)setsignal(SIGALRM, checkpoint); ++ (void)alarm(CHECKPOINT); ++ } ++ ++ threads = (struct aw_threads *) malloc(sizeof(struct aw_threads) * (if_cnt + 1)); ++ memset((char *)threads, 0, sizeof(*threads) * (if_cnt + 1)); ++ pthread_mutex_init(&mtx_einfo, NULL); ++ pthread_mutex_init(&mtx_ainfo, NULL); ++ ++ if (interface != NULL) ++ { ++ threads[0].interface = interface; ++ pthread_create(&threads[0].thread, NULL, (void *)pcap_thread, interface); ++ } ++ else ++ { ++ i = 0; ++ ++ for (adp = alldevsp; adp != NULL; adp = adp->next) ++ if (adp->flags != PCAP_IF_LOOPBACK) ++ { ++ threads[i].interface = adp->name; ++ pthread_create(&threads[i++].thread, NULL, (void *)pcap_thread, adp->name); ++ } ++ } ++ ++ for (i=0; i < if_cnt; i++) ++ pthread_join(threads[i].thread, NULL); ++ ++ if (!dump()) ++ exit(1); ++ exit(0); ++} ++ ++int ++pcap_thread(char *interface) ++{ ++ register char *rfilename = NULL; ++ char errbuf[PCAP_ERRBUF_SIZE]; ++ register pcap_t *pd = NULL; ++ register int snaplen, timeout, linktype, status; ++ struct bpf_program code; ++ ++ /* Determine network and netmask */ ++ if (pcap_lookupnet(interface, &net, &netmask, errbuf) < 0) { ++ (void)fprintf(stderr, "%s: bad interface %s: %s\n", ++ prog, interface, errbuf); ++ return(1); ++ } + + if (rfilename != NULL) { + pd = pcap_open_offline(rfilename, errbuf); +@@ -306,27 +397,7 @@ + if (rfilename == NULL) + syslog(LOG_INFO, "listening on %s", interface); + +- /* Read in database */ +- initializing = 1; +- if (!readdata()) +- exit(1); +- sorteinfo(); +-#ifdef DEBUG +- if (debug > 2) { +- debugdump(); +- exit(0); +- } +-#endif +- initializing = 0; + +- (void)setsignal(SIGINT, die); +- (void)setsignal(SIGTERM, die); +- (void)setsignal(SIGHUP, die); +- if (rfilename == NULL) { +- (void)setsignal(SIGQUIT, checkpoint); +- (void)setsignal(SIGALRM, checkpoint); +- (void)alarm(CHECKPOINT); +- } + + switch (linktype) { + +@@ -347,9 +418,7 @@ + exit(1); + } + pcap_close(pd); +- if (!dump()) +- exit(1); +- exit(0); ++ return(0); + } + + /* Process an ethernet arp/rarp packet */ +@@ -362,6 +431,8 @@ + register u_char *sea, *sha; + register time_t t; + u_int32_t sia; ++ register pthread_t thread_self = NULL; ++ register struct aw_threads *atp = threads; + + eh = (struct ether_header *)p; + ea = (struct ether_arp *)(eh + 1); +@@ -400,9 +471,16 @@ + /* Got a live one */ + t = h->ts.tv_sec; + can_checkpoint = 0; +- if (!ent_add(sia, sea, t, NULL)) ++ thread_self = pthread_self(); ++ ++ for (atp = threads; atp != NULL; atp++) ++ if (pthread_equal(atp->thread, thread_self)) ++ break; ++ ++ if (!ent_add(sia, sea, t, NULL, atp->interface)) + syslog(LOG_ERR, "ent_add(%s, %s, %ld) failed", + intoa(sia), e2str(sea), t); ++ + can_checkpoint = 1; + } + +@@ -507,6 +585,8 @@ + register u_char *sea, *sha; + register time_t t; + u_int32_t sia; ++ register pthread_t thread_self = NULL; ++ register struct aw_threads *atp = threads; + + fh = (struct fddi_header *)p; + ea = (struct ether_arp *)(fh + 1); +@@ -549,7 +629,13 @@ + /* Got a live one */ + t = h->ts.tv_sec; + can_checkpoint = 0; +- if (!ent_add(sia, sea, t, NULL)) ++ thread_self = pthread_self(); ++ ++ for (atp = threads; atp != NULL; atp++) ++ if (atp->thread == thread_self) ++ break; ++ ++ if (!ent_add(sia, sea, t, NULL, atp->interface)) + syslog(LOG_ERR, "ent_add(%s, %s, %ld) failed", + intoa(sia), e2str(sea), t); + can_checkpoint = 1; +@@ -750,7 +836,7 @@ + extern char version[]; + + (void)fprintf(stderr, "Version %s\n", version); +- (void)fprintf(stderr, "usage: %s [-dN] [-f datafile] [-i interface]" +- " [-n net[/width]] [-r file]\n", prog); ++ (void)fprintf(stderr, "usage: %s [-dN] [-f arpfile] [-e etherfile] [-i interface]" ++ " [-m email] [-n net[/width]] [-r file]\n", prog); + exit(1); + } |