From: Roy Marples Date: Wed, 8 Jul 2009 17:01:38 +0000 (+0000) Subject: Change get_option_addr to accept struct in_addr * instead of uint32_t * X-Git-Tag: v5.0.6~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95782488782a1ece83e00c5985a61bf90d724a94;p=thirdparty%2Fdhcpcd.git Change get_option_addr to accept struct in_addr * instead of uint32_t * to fix an alignment issue on SGI MIPS. --- diff --git a/configure.c b/configure.c index 641a00f9..3a32e0da 100644 --- a/configure.c +++ b/configure.c @@ -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 f9fb515c..f347acaa 100644 --- 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 38719530..85845f04 100644 --- 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); diff --git a/dhcpcd.c b/dhcpcd.c index 950dd169..18031d5d 100644 --- 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);