Thu, 04 Oct 2012 20:30:05 +0200
Correct out of date build configuration, porting to Solaris 11 network
link infrastructure and new libpcap logic. This additionally allows for
device drivers in subdirectories of /dev. Correct packaged nmap
personalities and signatures to work out of the box. Finally, hack
arpd logic to properly close sockets and quit on TERM by repeating
signaling in the run command script. Sadly, all this fails to correct
the run time behaviour of honeyd which fails to bind to the IP layer.
1 Index: arpd.c
2 --- arpd.c.dist 2003-07-02 16:49:31.000000000 +0200
3 +++ arpd.c 2003-07-02 16:53:25.000000000 +0200
4 @@ -33,7 +33,7 @@
5 #define ARPD_MAX_ACTIVE 600
6 #define ARPD_MAX_INACTIVE 300
8 -#define PIDFILE "/var/run/arpd.pid"
9 +#define PIDFILE "/opsw/var/arpd/arpd.pid"
11 struct arp_req {
12 struct addr pa;
13 @@ -111,9 +111,11 @@
14 struct in_addr in;
15 ip_addr_t istart, iend;
17 - second = p;
18 + first = p;
19 + second = strchr(p, '-');
20 + if (second != NULL)
21 + *second++ = '\0';
23 - first = strsep(&second, "-");
24 if (second == NULL)
25 errx(1, "%s: Invalid network range: %s",
26 __func__, p);
27 @@ -185,7 +187,7 @@
28 arpd_init(char *dev, int naddresses, char **addresses)
29 {
30 struct bpf_program fcode;
31 - char filter[1024], ebuf[PCAP_ERRBUF_SIZE], *dst;
32 + char filter[1024], ebuf[PCAP_ERRBUF_SIZE], *dst, *iface;
33 intf_t *intf;
35 dst = arpd_expandips(naddresses, addresses);
36 @@ -203,7 +205,16 @@
37 errx(1, "pcap_lookupdev: %s", ebuf);
38 }
39 arpd_ifent.intf_len = sizeof(arpd_ifent);
40 - strncpy(arpd_ifent.intf_name, dev, sizeof(arpd_ifent.intf_name) - 1);
41 +
42 + /* mitigate slash paths in OS that provide */
43 + /* network devices in subdirectories of /dev */
44 + iface = strrchr(dev, '/');
45 + if (iface)
46 + iface += sizeof(char);
47 + else
48 + iface = dev;
49 +
50 + strncpy(arpd_ifent.intf_name, iface, sizeof(arpd_ifent.intf_name) - 1);
51 arpd_ifent.intf_name[sizeof(arpd_ifent.intf_name) - 1] = '\0';
53 if (intf_get(intf, &arpd_ifent) < 0)
54 @@ -218,7 +229,7 @@
55 dst ? "and (" : "", dst ? dst : "", dst ? ")" : "",
56 addr_ntoa(&arpd_ifent.intf_link_addr));
58 - if ((arpd_pcap = pcap_open_live(dev, 128, 0, 500, ebuf)) == NULL)
59 + if ((arpd_pcap = pcap_open_live(iface, 128, 0, 500, ebuf)) == NULL)
60 errx(1, "pcap_open_live: %s", ebuf);
62 if (pcap_compile(arpd_pcap, &fcode, filter, 1, 0) < 0 ||
63 @@ -265,7 +276,7 @@
64 spa->addr_ip, tha->addr_eth, tpa->addr_ip);
66 if (op == ARP_OP_REQUEST) {
67 - syslog(LOG_DEBUG, __FUNCTION__ ": who-has %s tell %s",
68 + syslog(LOG_DEBUG, "%s: who-has %s tell %s", __FUNCTION__,
69 addr_ntoa(tpa), addr_ntoa(spa));
70 } else if (op == ARP_OP_REPLY) {
71 syslog(LOG_INFO, "arp reply %s is-at %s",
72 @@ -282,7 +293,7 @@
73 int error;
75 if (addr_cmp(addr, &arpd_ifent.intf_addr) == 0) {
76 - syslog(LOG_DEBUG, __FUNCTION__ ": %s at %s",
77 + syslog(LOG_DEBUG, "%s: %s at %s", __FUNCTION__,
78 addr_ntoa(addr), addr_ntoa(&arpd_ifent.intf_link_addr));
79 return (0);
80 }
81 @@ -291,10 +302,10 @@
82 error = arp_get(arpd_arp, &arpent);
84 if (error == -1) {
85 - syslog(LOG_DEBUG, __FUNCTION__ ": no entry for %s",
86 + syslog(LOG_DEBUG, "%s: no entry for %s", __FUNCTION__,
87 addr_ntoa(addr));
88 } else {
89 - syslog(LOG_DEBUG, __FUNCTION__ ": %s at %s",
90 + syslog(LOG_DEBUG, "%s: %s at %s", __FUNCTION__,
91 addr_ntoa(addr), addr_ntoa(&arpent.arp_ha));
92 }
93 return (error);
94 @@ -423,7 +434,7 @@
95 if ((req = SPLAY_FIND(tree, &arpd_reqs, &tmp)) != NULL) {
96 addr_pack(&src.arp_ha, ADDR_TYPE_ETH, ETH_ADDR_BITS,
97 ethip->ar_sha, ETH_ADDR_LEN);
98 - syslog(LOG_DEBUG, __FUNCTION__ ": %s at %s",
99 + syslog(LOG_DEBUG, "%s: %s at %s", __FUNCTION__,
100 addr_ntoa(&req->pa), addr_ntoa(&src.arp_ha));
102 /* This address is claimed */
103 @@ -445,9 +456,6 @@
104 void
105 terminate_handler(int sig)
106 {
107 - extern int event_gotsig;
108 -
109 - event_gotsig = 1;
110 arpd_sig = sig;
111 }
113 @@ -464,7 +472,6 @@
114 main(int argc, char *argv[])
115 {
116 struct event recv_ev;
117 - extern int (*event_sigcb)(void);
118 char *dev;
119 int c, debug;
120 FILE *fp;
121 @@ -524,7 +531,6 @@
122 perror("signal");
123 return (-1);
124 }
125 - event_sigcb = arpd_signal;
127 event_dispatch();