From 858fad722fa949f057dbc5a5e7dd63eef8954187 Mon Sep 17 00:00:00 2001 From: Russ Dill Date: Wed, 12 Feb 2003 22:20:19 +0000 Subject: [PATCH] sync with udhcp bug fixes --- networking/udhcp/ChangeLog | 2 ++ networking/udhcp/arpping.c | 4 ++-- networking/udhcp/script.c | 9 +++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/networking/udhcp/ChangeLog b/networking/udhcp/ChangeLog index 13818953b..7409fd0ad 100644 --- a/networking/udhcp/ChangeLog +++ b/networking/udhcp/ChangeLog @@ -1,4 +1,6 @@ 0.9.9 (pending) ++ Fixed a little endian problem in mton (Bastian Blank ) ++ Fixed a arpping alignment problem (Rui He ) + Added sanity check for max_leases (udhcp bug #1285) (me) + Finally got rid of the trailing space in enviromental vars (me) + added an new enviromental variable: $mask. It contains the number diff --git a/networking/udhcp/arpping.c b/networking/udhcp/arpping.c index d71cd10f4..4c0b3d83b 100644 --- a/networking/udhcp/arpping.c +++ b/networking/udhcp/arpping.c @@ -67,9 +67,9 @@ int arpping(u_int32_t yiaddr, u_int32_t ip, unsigned char *mac, char *interface) arp.hlen = 6; /* hardware address length */ arp.plen = 4; /* protocol address length */ arp.operation = htons(ARPOP_REQUEST); /* ARP op code */ - *((u_int *) arp.sInaddr) = ip; /* source IP address */ + memcpy(arp.sInaddr, &ip, sizeof(ip)); /* source IP address */ memcpy(arp.sHaddr, mac, 6); /* source hardware address */ - *((u_int *) arp.tInaddr) = yiaddr; /* target IP address */ + memcpy(arp.tInaddr, &yiaddr, sizeof(yiaddr)); /* target IP address */ memset(&addr, 0, sizeof(addr)); strcpy(addr.sa_data, interface); diff --git a/networking/udhcp/script.c b/networking/udhcp/script.c index 2eb4459dd..48ff8e07e 100644 --- a/networking/udhcp/script.c +++ b/networking/udhcp/script.c @@ -68,10 +68,11 @@ static int sprintip(char *dest, char *pre, unsigned char *ip) static int mton(struct in_addr *mask) { int i; - /* note: mask will always be in network byte order, so - * there are no endian issues */ - for (i = 31; i >= 0 && !((mask->s_addr >> i) & 1); i--); - return i + 1; + unsigned long bits = ntohl(mask->s_addr); + /* too bad one can't check the carry bit, etc in c bit + * shifting */ + for (i = 0; i < 32 && !((bits >> i) & 1); i++); + return 32 - i; }