sync with udhcp bug fixes
authorRuss Dill <Russ.Dill@asu.edu>
Wed, 12 Feb 2003 22:20:19 +0000 (22:20 -0000)
committerRuss Dill <Russ.Dill@asu.edu>
Wed, 12 Feb 2003 22:20:19 +0000 (22:20 -0000)
networking/udhcp/ChangeLog
networking/udhcp/arpping.c
networking/udhcp/script.c

index 13818953b860d645323e66246d67884d67f5c52e..7409fd0ad15670f7cf2b81780e989204db4ab680 100644 (file)
@@ -1,4 +1,6 @@
 0.9.9 (pending)
++ Fixed a little endian problem in mton (Bastian Blank <waldi@debian.org>)
++ Fixed a arpping alignment problem (Rui He <rhe@3eti.com>)
 + 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
index d71cd10f4f49d093af7df7d31dca16deb323329e..4c0b3d83bd67984a6b1af8f29478c864c4ce687f 100644 (file)
@@ -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);
index 2eb4459dd4102eb92aeeb123e0e6599fe9081317..48ff8e07e6d97cdbf9b2002a55c6e0762c581e78 100644 (file)
@@ -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;
 }