diff options
Diffstat (limited to 'package/rarpd/patches/patch-rarpd_c')
-rw-r--r-- | package/rarpd/patches/patch-rarpd_c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/package/rarpd/patches/patch-rarpd_c b/package/rarpd/patches/patch-rarpd_c new file mode 100644 index 000000000..92d50bff2 --- /dev/null +++ b/package/rarpd/patches/patch-rarpd_c @@ -0,0 +1,142 @@ +--- rarpd-1.1.orig/rarpd.c 1999-11-17 01:51:22.000000000 +0100 ++++ rarpd-1.1/rarpd.c 2009-12-11 14:28:32.000000000 +0100 +@@ -65,18 +65,12 @@ + #define ETHERSTRLEN sizeof("00:00:00:00:00:00") + #define IPSTRLEN sizeof(".xxx.xxx.xxx.xxx") + +-#ifdef NEW_LIBNET_INTERFACE +-#define open_link_interface libnet_open_link_interface +-#define link_int libnet_link_int +-#define build_arp libnet_build_arp +-#define get_ipaddr libnet_get_ipaddr +-#define get_hwaddr libnet_get_hwaddr +-#define build_ethernet libnet_build_ethernet +-#define write_link_layer libnet_write_link_layer +- +-/* Temporary workaround */ +-#define ARP_H LIBNET_ARP_H +-#endif ++struct _ipv4_arp_data_ { ++ u_char ar_sha[6]; /* sender hardware address */ ++ u_char ar_spa[4]; /* sender protocol address */ ++ u_char ar_tha[6]; /* target hardware address */ ++ u_char ar_tpa[4]; /* target protocol address */ ++}; + + extern char pcap_version[]; + extern int optind; +@@ -88,7 +82,7 @@ static int vflag; / + static char *program_name; + + static pcap_t *pd; +-static struct link_int *ln; ++static libnet_t *ld; + static char *device, *ethers; + struct in_addr my_ipaddr; + static u_char my_hwaddr[ETHERADDRLEN]; +@@ -285,23 +279,34 @@ void set_arp(struct in_addr *herip, unsi + void send_rarpreply(unsigned char *dest_hwaddr, + unsigned char *her_hwaddr, struct in_addr *her_ipaddr) + { +- char ebuf[PCAP_ERRBUF_SIZE]; +- u_char buf[ARP_H+ETH_H]; +- +- memset(buf, 0, ARP_H + ETH_H); +- +- /* Ethernet header */ +- build_ethernet(dest_hwaddr, my_hwaddr, ETHERTYPE_REVARP, NULL, 0, buf); ++ int c; ++ libnet_ptag_t t; + + /* ARP header */ +- build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ++ t = libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, + ETHERADDRLEN, IPADDRLEN, + ARPOP_REVREPLY, + my_hwaddr, (u_char *)&(my_ipaddr.s_addr), + her_hwaddr, (u_char *)&(her_ipaddr->s_addr), +- NULL, 0, buf + ETH_H); ++ NULL, 0, ld, 0); ++ if (t == -1) { ++ syslog(LOG_ERR, "%s: Can't build ARP header: %s", program_name, libnet_geterror(ld)); ++ exit(1); ++ } + +- write_link_layer(ln, (const u_char *)device, buf, ARP_H + ETH_H); ++ /* Ethernet header */ ++ t = libnet_build_ethernet(dest_hwaddr, my_hwaddr, ETHERTYPE_REVARP, NULL, 0, ld, 0); ++ if (t == -1) { ++ syslog(LOG_ERR, "%s: Can't build ethernet header: %s", program_name, ++ libnet_geterror(ld)); ++ exit(1); ++ } ++ ++ c = libnet_write(ld); ++ if (c == -1) { ++ syslog(LOG_ERR, "%s: Write error: %s", program_name, libnet_geterror(ld)); ++ exit(1); ++ } + } + + +@@ -314,11 +319,13 @@ void process_arp(u_char *user, const str + unsigned short pro, hrd, op; + struct in_addr her_ipaddr; + struct libnet_arp_hdr *ap; ++ struct _ipv4_arp_data_ *ad; + struct hostent *hp; + char *ipp; + + bp += sizeof(struct libnet_ethernet_hdr); + ap = (struct libnet_arp_hdr *)bp; ++ ad = (struct _ipv4_arp_data_ *)(bp + sizeof(*ap)); + + pro = EXTRACT_16BITS (&ap->ar_pro); + hrd = EXTRACT_16BITS (&ap->ar_hrd); +@@ -331,10 +338,10 @@ void process_arp(u_char *user, const str + /* We only answer RARP requests */ + if (op != ARPOP_REVREQUEST) return; + +- sha = ap->ar_sha; +- spa = ap->ar_spa; +- tha = ap->ar_tha; +- tpa = ap->ar_tpa; ++ sha = ad->ar_sha; ++ spa = ad->ar_spa; ++ tha = ad->ar_tha; ++ tpa = ad->ar_tpa; + + if (my_ether_ntohost(toret, tha)) { + if (vflag) { +@@ -399,6 +406,7 @@ int main(int argc, char **argv) + int nofork, op, pid, syslogflags; + bpf_u_int32 localnet, netmask; + char ebuf[PCAP_ERRBUF_SIZE]; ++ char errbuf[LIBNET_ERRBUF_SIZE]; + char *cmdbuf; + struct bpf_program fcode; + +@@ -446,9 +454,9 @@ int main(int argc, char **argv) + } + } + +- ln = open_link_interface(device, ebuf); +- if (ln == NULL) { +- syslog(LOG_ERR, "%s: %s", program_name, ebuf); ++ ld = libnet_init(LIBNET_LINK, device, errbuf); ++ if (ld == NULL) { ++ syslog(LOG_ERR, "%s: %s", program_name, errbuf); + exit(1); + } + +@@ -465,8 +473,8 @@ int main(int argc, char **argv) + } + + memset(&my_ipaddr, 0, sizeof(my_ipaddr)); +- my_ipaddr.s_addr = htonl(get_ipaddr(ln, device, ebuf)); +- memcpy(my_hwaddr, (char *)get_hwaddr(ln, device, ebuf), ETHERADDRLEN); ++ my_ipaddr.s_addr = libnet_get_ipaddr4(ld); ++ memcpy(my_hwaddr, (char *) libnet_get_hwaddr(ld), ETHERADDRLEN); + + setuid(getuid()); + |