packages/net/arpd/patches/003-pcap_and_arg.patch

77 lines
2.1 KiB
Diff
Raw Normal View History

--- a/arpd.c
+++ b/arpd.c
@@ -70,7 +70,7 @@ static int arpd_sig;
static void
usage(void)
{
- fprintf(stderr, "Usage: arpd [-d] [-i interface] [net]\n");
+ fprintf(stderr, "Usage: arpd [-d] [-i interface] [-a 'pcap_expr'] [{host|net|range} ...]\n");
exit(1);
}
@@ -182,7 +182,7 @@ arpd_expandips(int naddresses, char **ad
}
static void
-arpd_init(char *dev, int naddresses, char **addresses)
+arpd_init(char *dev, char *and_pcap_exp, int naddresses, char **addresses)
{
struct bpf_program fcode;
char filter[1024], ebuf[PCAP_ERRBUF_SIZE], *dst;
@@ -214,9 +214,13 @@ arpd_init(char *dev, int naddresses, cha
errx(1, "bad interface configuration: not IP or Ethernet");
arpd_ifent.intf_addr.addr_bits = IP_ADDR_BITS;
- snprintf(filter, sizeof(filter), "arp %s%s%s and not ether src %s",
+ snprintf(filter, sizeof(filter), "arp %s%s%s and not ether src %s%s%s%s",
dst ? "and (" : "", dst ? dst : "", dst ? ")" : "",
- addr_ntoa(&arpd_ifent.intf_link_addr));
+ addr_ntoa(&arpd_ifent.intf_link_addr),
+ and_pcap_exp ? " and (" : "",
+ and_pcap_exp ? and_pcap_exp : "",
+ and_pcap_exp ? ")" : ""
+ );
if ((arpd_pcap = pcap_open_live(dev, 128, 0, 500, ebuf)) == NULL)
errx(1, "pcap_open_live: %s", ebuf);
@@ -465,14 +469,15 @@ main(int argc, char *argv[])
{
struct event recv_ev;
extern int (*event_sigcb)(void);
- char *dev;
+ char *dev, *and_pcap_exp;
int c, debug;
FILE *fp;
dev = NULL;
+ and_pcap_exp = NULL;
debug = 0;
- while ((c = getopt(argc, argv, "di:h?")) != -1) {
+ while ((c = getopt(argc, argv, "a:di:h?")) != -1) {
switch (c) {
case 'd':
debug = 1;
@@ -480,6 +485,9 @@ main(int argc, char *argv[])
case 'i':
dev = optarg;
break;
+ case 'a':
+ and_pcap_exp = optarg;
+ break;
default:
usage();
break;
@@ -489,9 +497,9 @@ main(int argc, char *argv[])
argv += optind;
if (argc == 0)
- arpd_init(dev, 0, NULL);
+ arpd_init(dev, and_pcap_exp, 0, NULL);
else
- arpd_init(dev, argc, argv);
+ arpd_init(dev, and_pcap_exp, argc, argv);
if ((fp = fopen(PIDFILE, "w")) == NULL)
err(1, "fopen");