]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Change get_option_addr to accept struct in_addr * instead of uint32_t *
authorRoy Marples <roy@marples.name>
Wed, 8 Jul 2009 17:01:38 +0000 (17:01 +0000)
committerRoy Marples <roy@marples.name>
Wed, 8 Jul 2009 17:01:38 +0000 (17:01 +0000)
to fix an alignment issue on SGI MIPS.

configure.c
dhcp.c
dhcp.h
dhcpcd.c

index 641a00f9a0c8b08038b7923afd323137fc32d0f8..3a32e0dae011197d2d99b67bafdbe48c221ab0a7 100644 (file)
@@ -483,7 +483,8 @@ d_route(struct rt *rt, const struct interface *iface, int metric)
 static struct rt *
 get_subnet_route(struct dhcp_message *dhcp)
 {
-       in_addr_t addr, net;
+       in_addr_t addr;
+       struct in_addr net;
        struct rt *rt;
 
        addr = dhcp->yiaddr;
@@ -491,12 +492,12 @@ get_subnet_route(struct dhcp_message *dhcp)
                addr = dhcp->ciaddr;
        /* Ensure we have all the needed values */
        if (get_option_addr(&net, dhcp, DHO_SUBNETMASK) == -1)
-               net = get_netmask(addr);
-       if (net == INADDR_BROADCAST || net == INADDR_ANY)
+               net.s_addr = get_netmask(addr);
+       if (net.s_addr == INADDR_BROADCAST || net.s_addr == INADDR_ANY)
                return NULL;
        rt = malloc(sizeof(*rt));
-       rt->dest.s_addr = addr & net;
-       rt->net.s_addr = net;
+       rt->dest.s_addr = addr & net.s_addr;
+       rt->net.s_addr = net.s_addr;
        rt->gate.s_addr = 0;
        return rt;
 }
diff --git a/dhcp.c b/dhcp.c
index f9fb515c384edb70538eebb2b0874e7b116db610..f347acaa60cf3662728026fd3a3dbeace5d8593c 100644 (file)
--- a/dhcp.c
+++ b/dhcp.c
@@ -370,25 +370,27 @@ exit:
 }
 
 int
-get_option_addr(uint32_t *a, const struct dhcp_message *dhcp, uint8_t option)
+get_option_addr(struct in_addr *a, const struct dhcp_message *dhcp,
+    uint8_t option)
 {
        const uint8_t *p = get_option_raw(dhcp, option);
 
        if (!p)
                return -1;
-       memcpy(a, p, sizeof(*a));
+       memcpy(&a->s_addr, p, sizeof(a->s_addr));
        return 0;
 }
 
 int
 get_option_uint32(uint32_t *i, const struct dhcp_message *dhcp, uint8_t option)
 {
-       uint32_t a;
+       const uint8_t *p = get_option_raw(dhcp, option);
+       uint32_t d;
 
-       if (get_option_addr(&a, dhcp, option) == -1)
+       if (!p)
                return -1;
-
-       *i = ntohl(a);
+       memcpy(&d, p, sizeof(d));
+       *i = ntohl(d);
        return 0;
 }
 
@@ -1303,14 +1305,14 @@ configure_env(char **env, const char *prefix, const struct dhcp_message *dhcp,
                 * message but are not necessarily in the options */
                addr.s_addr = dhcp->yiaddr ? dhcp->yiaddr : dhcp->ciaddr;
                setvar(&ep, prefix, "ip_address", inet_ntoa(addr));
-               if (get_option_addr(&net.s_addr, dhcp, DHO_SUBNETMASK) == -1) {
+               if (get_option_addr(&net, dhcp, DHO_SUBNETMASK) == -1) {
                        net.s_addr = get_netmask(addr.s_addr);
                        setvar(&ep, prefix, "subnet_mask", inet_ntoa(net));
                }
                i = inet_ntocidr(net);
                snprintf(cidr, sizeof(cidr), "%d", inet_ntocidr(net));
                setvar(&ep, prefix, "subnet_cidr", cidr);
-               if (get_option_addr(&brd.s_addr, dhcp, DHO_BROADCAST) == -1) {
+               if (get_option_addr(&brd, dhcp, DHO_BROADCAST) == -1) {
                        brd.s_addr = addr.s_addr | ~net.s_addr;
                        setvar(&ep, prefix, "broadcast_address", inet_ntoa(brd));
                }
@@ -1360,9 +1362,9 @@ get_lease(struct dhcp_lease *lease, const struct dhcp_message *dhcp)
                lease->addr.s_addr = dhcp->yiaddr;
        else
                lease->addr.s_addr = dhcp->ciaddr;
-       if (get_option_addr(&lease->net.s_addr, dhcp, DHO_SUBNETMASK) == -1)
+       if (get_option_addr(&lease->net, dhcp, DHO_SUBNETMASK) == -1)
                lease->net.s_addr = get_netmask(lease->addr.s_addr);
-       if (get_option_addr(&lease->brd.s_addr, dhcp, DHO_BROADCAST) == -1)
+       if (get_option_addr(&lease->brd, dhcp, DHO_BROADCAST) == -1)
                lease->brd.s_addr = lease->addr.s_addr | ~lease->net.s_addr;
        if (get_option_uint32(&lease->leasetime, dhcp, DHO_LEASETIME) == 0) {
                /* Ensure that we can use the lease */
diff --git a/dhcp.h b/dhcp.h
index 38719530140f70d5fd932c185914fa164081bd53..85845f04893938e4a498fa503c43c1b240210620 100644 (file)
--- a/dhcp.h
+++ b/dhcp.h
@@ -175,7 +175,7 @@ struct dhcp_lease {
 int make_option_mask(uint8_t *, const char *, int);
 void print_options(void);
 char *get_option_string(const struct dhcp_message *, uint8_t);
-int get_option_addr(uint32_t *, const struct dhcp_message *, uint8_t);
+int get_option_addr(struct in_addr *, const struct dhcp_message *, uint8_t);
 int get_option_uint32(uint32_t *, const struct dhcp_message *, uint8_t);
 int get_option_uint16(uint16_t *, const struct dhcp_message *, uint8_t);
 int get_option_uint8(uint8_t *, const struct dhcp_message *, uint8_t);
index 950dd16905a4f289969f0696f7d12b0bcc22b270..18031d5d2b9482e7d4296d3878c67baf39f530f3 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -405,7 +405,7 @@ log_dhcp(int lvl, const char *msg,
                a = xstrdup(inet_ntoa(addr));
        } else
                a = NULL;
-       r = get_option_addr(&addr.s_addr, dhcp, DHO_SERVERID);
+       r = get_option_addr(&addr, dhcp, DHO_SERVERID);
        if (dhcp->servername[0] && r == 0)
                syslog(lvl, "%s: %s %s from %s `%s'", iface->name, msg, a,
                    inet_ntoa(addr), dhcp->servername);
@@ -464,7 +464,7 @@ handle_dhcp(struct interface *iface, struct dhcp_message **dhcpp)
        if (type == DHCP_NAK) {
                /* For NAK, only check if we require the ServerID */
                if (has_option_mask(ifo->requiremask, DHO_SERVERID) &&
-                   get_option_addr(&addr.s_addr, dhcp, DHO_SERVERID) == -1)
+                   get_option_addr(&addr, dhcp, DHO_SERVERID) == -1)
                {
                        log_dhcp(LOG_WARNING, "reject NAK", iface, dhcp);
                        return;
@@ -510,7 +510,7 @@ handle_dhcp(struct interface *iface, struct dhcp_message **dhcpp)
                lease->addr.s_addr = dhcp->yiaddr;
                lease->server.s_addr = INADDR_ANY;
                if (type != 0)
-                       get_option_addr(&lease->server.s_addr,
+                       get_option_addr(&lease->server,
                            dhcp, DHO_SERVERID);
                log_dhcp(LOG_INFO, "offered", iface, dhcp);
                free(state->offer);