| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | --- 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()); 
 |