Jan Synacek 66cd05
--- a/arpwatch.8	2016-01-26 10:13:58.344326599 +0100
Jan Synacek 66cd05
+++ b/arpwatch.8	2016-01-26 09:59:46.620048949 +0100
Jan Synacek 66cd05
@@ -27,7 +27,7 @@ arpwatch - keep track of ethernet/ip add
Jan Synacek 66cd05
 .na
Jan Synacek 66cd05
 .B arpwatch
Jan Synacek 66cd05
 [
Jan Synacek 66cd05
-.B -dN
Jan Synacek 66cd05
+.B -dNp
Jan Synacek 66cd05
 ] [
Jan Synacek 66cd05
 .B -f
Jan Synacek 66cd05
 .I datafile
Jan Synacek 66cd05
@@ -70,6 +70,10 @@ background and emailing the reports. Ins
Jan Synacek 66cd05
 .IR stderr .
Jan Synacek 66cd05
 .LP
Jan Synacek 66cd05
 The
Jan Synacek 66cd05
+.B -p
Jan Synacek 66cd05
+flag disables promiscous mode.
Jan Synacek 66cd05
+.LP
Jan Synacek 66cd05
+The
Jan Synacek 66cd05
 .B -f
Jan Synacek 66cd05
 flag is used to set the ethernet/ip address database filename.
Jan Synacek 66cd05
 The default is
Jan Synacek 66cd05
diff -rup arpwatch-2.1a15/arpwatch.c arpwatch-2.1a15-new/arpwatch.c
Jan Synacek 66cd05
--- a/arpwatch.c	2016-01-26 10:13:58.356326563 +0100
Jan Synacek 66cd05
+++ b/arpwatch.c	2016-01-26 10:13:37.273390029 +0100
Jan Synacek 66cd05
@@ -162,7 +162,7 @@ void dropprivileges(const char* user)
Jan Synacek 66cd05
 }
Jan Synacek 66cd05
 
Jan Synacek 66cd05
 char *
Jan Synacek 66cd05
-try_dev(char *interface, pcap_t **pd, int *linktype, char *errbuf)
Jan Synacek 66cd05
+try_dev(char *interface, pcap_t **pd, int *linktype, int promisc, char *errbuf)
Jan Synacek 66cd05
 {
Jan Synacek 66cd05
 	register int snaplen, timeout;
Jan Synacek 66cd05
 
Jan Synacek 66cd05
@@ -170,7 +170,7 @@ try_dev(char *interface, pcap_t **pd, in
Jan Synacek 66cd05
 				  sizeof(struct fddi_header)) + sizeof(struct ether_arp);
Jan Synacek 66cd05
 	timeout = 1000;
Jan Synacek 66cd05
 
Jan Synacek 66cd05
-	*pd = pcap_open_live(interface, snaplen, 1, timeout, errbuf);
Jan Synacek 66cd05
+	*pd = pcap_open_live(interface, snaplen, promisc, timeout, errbuf);
Jan Synacek 66cd05
 	if (NULL == *pd) {
Jan Synacek 66cd05
 		syslog(LOG_ERR, "pcap open %s: %s", interface,  errbuf);
Jan Synacek 66cd05
 		return NULL;
Jan Synacek 66cd05
@@ -187,14 +187,14 @@ try_dev(char *interface, pcap_t **pd, in
Jan Synacek 66cd05
 }
Jan Synacek 66cd05
 
Jan Synacek 66cd05
 char *
Jan Synacek 66cd05
-iterate_dev(char *arginterface, pcap_t **pd, int *linktype, char *errbuf)
Jan Synacek 66cd05
+iterate_dev(char *arginterface, pcap_t **pd, int *linktype, int promisc, char *errbuf)
Jan Synacek 66cd05
 {
Jan Synacek 66cd05
 	static char interface[64 + 1];
Jan Synacek 66cd05
 	pcap_if_t *alldevs;
Jan Synacek 66cd05
 	pcap_if_t *dev;
Jan Synacek 66cd05
 
Jan Synacek 66cd05
 	if (NULL != arginterface) {
Jan Synacek 66cd05
-		return try_dev(arginterface, pd, linktype, errbuf);
Jan Synacek 66cd05
+		return try_dev(arginterface, pd, linktype, promisc, errbuf);
Jan Synacek 66cd05
 	} else {
Jan Synacek 66cd05
 		if (pcap_findalldevs(&alldevs, errbuf) == -1) {
Jan Synacek 66cd05
 			(void)fprintf(stderr, "%s: lookup_device: %s\n",
Jan Synacek 66cd05
@@ -203,7 +203,7 @@ iterate_dev(char *arginterface, pcap_t *
Jan Synacek 66cd05
 		}
Jan Synacek 66cd05
 		for (dev = alldevs; dev && (arginterface == NULL); dev = dev->next) {
Jan Synacek 66cd05
 			strncpy(interface, dev->name, strlen(dev->name)+1);
Jan Synacek 66cd05
-			arginterface = try_dev(interface, pd, linktype, errbuf);
Jan Synacek 66cd05
+			arginterface = try_dev(interface, pd, linktype, promisc, errbuf);
Jan Synacek 66cd05
 		}
Jan Synacek 66cd05
 		pcap_freealldevs(alldevs);
Jan Synacek 66cd05
 		return arginterface;
Jan Synacek 66cd05
@@ -224,6 +224,7 @@ main(int argc, char **argv)
Jan Synacek 66cd05
 	struct bpf_program code;
Jan Synacek 66cd05
 	char errbuf[PCAP_ERRBUF_SIZE];
Jan Synacek 66cd05
 	char* serveruser = NULL;
Jan Synacek 66cd05
+	int promisc = 1;
Jan Synacek 66cd05
 
Jan Synacek 66cd05
 	if (argv[0] == NULL)
Jan Synacek 66cd05
 		prog = "arpwatch";
Jan Synacek 66cd05
@@ -242,7 +243,7 @@ main(int argc, char **argv)
Jan Synacek 66cd05
 	linktype = -1;
Jan Synacek 66cd05
 	rfilename = NULL;
Jan Synacek 66cd05
 	pd = NULL;
Jan Synacek 66cd05
-	while ((op = getopt(argc, argv, "df:i:n:Nr:u:e:s:")) != EOF)
Jan Synacek 66cd05
+	while ((op = getopt(argc, argv, "df:i:n:Nr:u:e:s:p")) != EOF)
Jan Synacek 66cd05
 		switch (op) {
Jan Synacek 66cd05
 
Jan Synacek 66cd05
 		case 'd':
Jan Synacek 66cd05
@@ -304,6 +305,10 @@ main(int argc, char **argv)
Jan Synacek 66cd05
 			}
Jan Synacek 66cd05
 			break;
Jan Synacek 66cd05
 
Jan Synacek 66cd05
+		case 'p':
Jan Synacek 66cd05
+			promisc = 0;
Jan Synacek 66cd05
+			break;
Jan Synacek 66cd05
+
Jan Synacek 66cd05
 		default:
Jan Synacek 66cd05
 			usage();
Jan Synacek 66cd05
 		}
Jan Synacek 66cd05
@@ -317,7 +322,7 @@ main(int argc, char **argv)
Jan Synacek 66cd05
 	} else {
Jan Synacek 66cd05
 
Jan Synacek 66cd05
 		/* Determine interface if not specified */
Jan Synacek 66cd05
-		interface = iterate_dev(interface, &pd, &linktype, errbuf);
Jan Synacek 66cd05
+		interface = iterate_dev(interface, &pd, &linktype, promisc, errbuf);
Jan Synacek 66cd05
 		if (interface == NULL) {
Jan Synacek 66cd05
 			(void)fprintf(stderr, "%s: lookup_device: no suitable interface found\n",
Jan Synacek 66cd05
 						  prog);