$NetBSD: patch-aa,v 1.1 2008/01/12 22:53:40 christian_gall Exp $

--- softflowd.c.orig	2008-01-12 01:54:37.000000000 +0100
+++ softflowd.c
@@ -1329,7 +1329,7 @@ unix_listener(const char *path)
 
 static void
 setup_packet_capture(struct pcap **pcap, int *linktype, 
-    char *dev, char *capfile, char *bpf_prog, int need_v6)
+    char *dev, int if_promisc, char *capfile, char *bpf_prog, int need_v6)
 {
 	char ebuf[PCAP_ERRBUF_SIZE];
 	struct bpf_program prog_c;
@@ -1339,7 +1339,7 @@ setup_packet_capture(struct pcap **pcap,
 	if (dev != NULL) {
 		if ((*pcap = pcap_open_live(dev, 
 		    need_v6 ? LIBPCAP_SNAPLEN_V6 : LIBPCAP_SNAPLEN_V4, 
-		    1, 0, ebuf)) == NULL) {
+		    if_promisc, 0, ebuf)) == NULL) {
 			fprintf(stderr, "pcap_open_live: %s\n", ebuf);
 			exit(1);
 		}
@@ -1447,6 +1447,7 @@ usage(void)
 	fprintf(stderr, "  -m max_flows     Specify maximum number of flows to track (default %d)\n", DEFAULT_MAX_FLOWS);
 	fprintf(stderr, "  -n host:port     Send Cisco NetFlow(tm)-compatible packets to host:port\n");
 	fprintf(stderr, "  -p pidfile       Record pid in specified file (default: %s)\n", DEFAULT_PIDFILE);
+	fprintf(stderr, "  -P		    don't put interface into promiscuos mode\n");
 	fprintf(stderr, "  -c pidfile       Location of control socket (default: %s)\n", DEFAULT_CTLSOCK);
 	fprintf(stderr, "  -v 1|5|9         NetFlow export packet version\n");
 	fprintf(stderr, "  -L hoplimit      Set TTL/hoplimit for export datagrams\n");
@@ -1635,6 +1636,7 @@ main(int argc, char **argv)
 	extern int optind;
 	int ch, dontfork_flag, linktype, ctlsock, i, r, err, always_v6;
 	int max_flows, stop_collection_flag, exit_request, hoplimit;
+	int if_promisc = 1;
 	pcap_t *pcap = NULL;
 	struct sockaddr_storage dest;
 	struct FLOWTRACK flowtrack;
@@ -1660,7 +1662,7 @@ main(int argc, char **argv)
 	ctlsock_path = DEFAULT_CTLSOCK;
 	dontfork_flag = 0;
 	always_v6 = 0;
-	while ((ch = getopt(argc, argv, "6hdDL:T:i:r:f:t:n:m:p:c:v:")) != -1) {
+	while ((ch = getopt(argc, argv, "6hdDPL:T:i:r:f:t:n:m:p:c:v:")) != -1) {
 		switch (ch) {
 		case '6':
 			always_v6 = 1;
@@ -1731,6 +1733,9 @@ main(int argc, char **argv)
 			parse_hostport(optarg, (struct sockaddr *)&dest,
 			    &dest_len);
 			break;
+		case 'P':
+			if_promisc = 0;
+			break;
 		case 'p':
 			pidfile_path = optarg;
 			break;
@@ -1768,7 +1773,7 @@ main(int argc, char **argv)
 	bpf_prog = argv_join(argc - optind, argv + optind);
 
 	/* Will exit on failure */
-	setup_packet_capture(&pcap, &linktype, dev, capfile, bpf_prog,
+	setup_packet_capture(&pcap, &linktype, dev, if_promisc, capfile, bpf_prog,
 	    target.dialect->v6_capable || always_v6);
 	
 	/* Netflow send socket */
