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 +