File rarpd-1.1-libnet.diff of Package rarpd

--- rarpd.c
+++ rarpd.c
@@ -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 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 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 @@
   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 @@
   /* 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 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 @@
     }
   }
 
-  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 @@
   }
 
   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());