summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2009-07-08 17:01:38 +0000
committerRoy Marples <roy@marples.name>2009-07-08 17:01:38 +0000
commit95782488782a1ece83e00c5985a61bf90d724a94 (patch)
tree953944fb0f3577272ce03bf27d7fb6cad953b97d
parentbf80d526822f7903b5da1e329627495aa6d34401 (diff)
downloaddhcpcd-95782488782a1ece83e00c5985a61bf90d724a94.tar.xz
Change get_option_addr to accept struct in_addr * instead of uint32_t *
to fix an alignment issue on SGI MIPS.
-rw-r--r--configure.c11
-rw-r--r--dhcp.c22
-rw-r--r--dhcp.h2
-rw-r--r--dhcpcd.c6
4 files changed, 22 insertions, 19 deletions
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);