Группа :: Сети/Прочее
Пакет: rarpd
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: rarpd-1.1-libnet.diff
Скачать
Скачать
--- 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());