arpd/arpd.patch

changeset 715
c10fb90893b9
parent 714
119553d296d2
     1.1 --- a/arpd/arpd.patch	Thu Oct 04 20:26:02 2012 +0200
     1.2 +++ b/arpd/arpd.patch	Thu Oct 04 20:30:05 2012 +0200
     1.3 @@ -1,5 +1,15 @@
     1.4 +Index: arpd.c
     1.5  --- arpd.c.dist	2003-07-02 16:49:31.000000000 +0200
     1.6  +++ arpd.c	2003-07-02 16:53:25.000000000 +0200
     1.7 +@@ -33,7 +33,7 @@
     1.8 + #define ARPD_MAX_ACTIVE		600
     1.9 + #define ARPD_MAX_INACTIVE	300
    1.10 + 
    1.11 +-#define PIDFILE			"/var/run/arpd.pid"
    1.12 ++#define PIDFILE			"/opsw/var/arpd/arpd.pid"
    1.13 + 
    1.14 + struct arp_req {
    1.15 + 	struct addr		pa;
    1.16  @@ -111,9 +111,11 @@
    1.17   			struct in_addr in;
    1.18   			ip_addr_t istart, iend;
    1.19 @@ -14,7 +24,43 @@
    1.20   			if (second == NULL)
    1.21   				errx(1, "%s: Invalid network range: %s",
    1.22   				    __func__, p);
    1.23 -@@ -267,7 +267,7 @@
    1.24 +@@ -185,7 +187,7 @@
    1.25 + arpd_init(char *dev, int naddresses, char **addresses)
    1.26 + {
    1.27 + 	struct bpf_program fcode;
    1.28 +-	char filter[1024], ebuf[PCAP_ERRBUF_SIZE], *dst;
    1.29 ++	char filter[1024], ebuf[PCAP_ERRBUF_SIZE], *dst, *iface;
    1.30 + 	intf_t *intf;
    1.31 + 	
    1.32 + 	dst = arpd_expandips(naddresses, addresses);
    1.33 +@@ -203,7 +205,16 @@
    1.34 + 			errx(1, "pcap_lookupdev: %s", ebuf);
    1.35 + 	}
    1.36 + 	arpd_ifent.intf_len = sizeof(arpd_ifent);
    1.37 +-	strncpy(arpd_ifent.intf_name, dev, sizeof(arpd_ifent.intf_name) - 1);
    1.38 ++
    1.39 ++	/* mitigate slash paths in OS that provide   */
    1.40 ++	/* network devices in subdirectories of /dev */
    1.41 ++	iface = strrchr(dev, '/');
    1.42 ++	if (iface)
    1.43 ++		iface += sizeof(char);
    1.44 ++	else
    1.45 ++		iface = dev;
    1.46 ++
    1.47 ++	strncpy(arpd_ifent.intf_name, iface, sizeof(arpd_ifent.intf_name) - 1);
    1.48 + 	arpd_ifent.intf_name[sizeof(arpd_ifent.intf_name) - 1] = '\0';
    1.49 + 	
    1.50 + 	if (intf_get(intf, &arpd_ifent) < 0)
    1.51 +@@ -218,7 +229,7 @@
    1.52 + 	    dst ? "and (" : "", dst ? dst : "", dst ? ")" : "",
    1.53 + 	    addr_ntoa(&arpd_ifent.intf_link_addr));
    1.54 + 	
    1.55 +-	if ((arpd_pcap = pcap_open_live(dev, 128, 0, 500, ebuf)) == NULL)
    1.56 ++	if ((arpd_pcap = pcap_open_live(iface, 128, 0, 500, ebuf)) == NULL)
    1.57 + 		errx(1, "pcap_open_live: %s", ebuf);
    1.58 + 	
    1.59 + 	if (pcap_compile(arpd_pcap, &fcode, filter, 1, 0) < 0 ||
    1.60 +@@ -265,7 +276,7 @@
    1.61   	    spa->addr_ip, tha->addr_eth, tpa->addr_ip);
    1.62   	
    1.63   	if (op == ARP_OP_REQUEST) {
    1.64 @@ -23,7 +69,7 @@
    1.65   		    addr_ntoa(tpa), addr_ntoa(spa));
    1.66   	} else if (op == ARP_OP_REPLY) {
    1.67   		syslog(LOG_INFO, "arp reply %s is-at %s",
    1.68 -@@ -284,7 +284,7 @@
    1.69 +@@ -282,7 +293,7 @@
    1.70   	int error;
    1.71   
    1.72   	if (addr_cmp(addr, &arpd_ifent.intf_addr) == 0) {
    1.73 @@ -32,7 +78,7 @@
    1.74   		    addr_ntoa(addr), addr_ntoa(&arpd_ifent.intf_link_addr));
    1.75   		return (0);
    1.76   	}
    1.77 -@@ -293,10 +293,10 @@
    1.78 +@@ -291,10 +302,10 @@
    1.79   	error = arp_get(arpd_arp, &arpent);
    1.80   	
    1.81   	if (error == -1) {
    1.82 @@ -45,7 +91,7 @@
    1.83   		    addr_ntoa(addr), addr_ntoa(&arpent.arp_ha));
    1.84   	}
    1.85   	return (error);
    1.86 -@@ -425,7 +425,7 @@
    1.87 +@@ -423,7 +434,7 @@
    1.88   		if ((req = SPLAY_FIND(tree, &arpd_reqs, &tmp)) != NULL) {
    1.89   			addr_pack(&src.arp_ha, ADDR_TYPE_ETH, ETH_ADDR_BITS,
    1.90   			    ethip->ar_sha, ETH_ADDR_LEN);
    1.91 @@ -54,3 +100,29 @@
    1.92   			    addr_ntoa(&req->pa), addr_ntoa(&src.arp_ha));
    1.93   			
    1.94   			/* This address is claimed */
    1.95 +@@ -445,9 +456,6 @@
    1.96 + void
    1.97 + terminate_handler(int sig)
    1.98 + {
    1.99 +-	extern int event_gotsig;
   1.100 +-
   1.101 +-	event_gotsig = 1;
   1.102 + 	arpd_sig = sig;
   1.103 + }
   1.104 + 
   1.105 +@@ -464,7 +472,6 @@
   1.106 + main(int argc, char *argv[])
   1.107 + {
   1.108 + 	struct event recv_ev;
   1.109 +-	extern int (*event_sigcb)(void);
   1.110 + 	char *dev;
   1.111 + 	int c, debug;
   1.112 + 	FILE *fp;
   1.113 +@@ -524,7 +531,6 @@
   1.114 + 		perror("signal");
   1.115 + 		return (-1);
   1.116 + 	}
   1.117 +-	event_sigcb = arpd_signal;
   1.118 + 	
   1.119 + 	event_dispatch();
   1.120 + 

mercurial