aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>2011-12-15 18:36:27 +0059
committerBernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>2011-12-15 18:36:27 +0059
commit47accd6b5a7ceb86a44d52905a635f164d82e087 (patch)
tree6c0548034426a22a0b3b99b47a60076896bc6a52
parent0d3a47d979ac35a49b2a2da9e80e16bd37aab877 (diff)
downloaddhcpcd-linaro_android_4.0.1.tar.gz
dhcpcd: Fix aliasing violationslinaro_android_4.0.1
Signed-off-by: Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org>
-rw-r--r--control.c24
-rw-r--r--net.c26
2 files changed, 31 insertions, 19 deletions
diff --git a/control.c b/control.c
index 24fb354..e04ce9f 100644
--- a/control.c
+++ b/control.c
@@ -46,7 +46,10 @@ static int fd = -1;
static char buffer[1024];
static char *argvp[255];
-struct sockaddr_un sun;
+union {
+ struct sockaddr_un un;
+ struct sockaddr sa;
+} sun;
struct fd_list *fds = NULL;
static void
@@ -100,13 +103,16 @@ handle_control_data(void *arg)
static void
handle_control(_unused void *arg)
{
- struct sockaddr_un run;
+ union {
+ struct sockaddr_un run;
+ struct sockaddr sa;
+ } run;
socklen_t len;
struct fd_list *l;
int f;
- len = sizeof(run);
- if ((f = accept(fd, (struct sockaddr *)&run, &len)) == -1)
+ len = sizeof(run.run);
+ if ((f = accept(fd, &run.sa, &len)) == -1)
return;
l = xmalloc(sizeof(*l));
l->fd = f;
@@ -122,9 +128,9 @@ make_sock(void)
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
return -1;
memset(&sun, 0, sizeof(sun));
- sun.sun_family = AF_UNIX;
- strlcpy(sun.sun_path, CONTROLSOCKET, sizeof(sun.sun_path));
- return sizeof(sun.sun_family) + strlen(sun.sun_path) + 1;
+ sun.un.sun_family = AF_UNIX;
+ strlcpy(sun.un.sun_path, CONTROLSOCKET, sizeof(sun.un.sun_path));
+ return sizeof(sun.un.sun_family) + strlen(sun.un.sun_path) + 1;
}
int
@@ -135,7 +141,7 @@ start_control(void)
if ((len = make_sock()) == -1)
return -1;
unlink(CONTROLSOCKET);
- if (bind(fd, (struct sockaddr *)&sun, len) == -1 ||
+ if (bind(fd, &sun.sa, len) == -1 ||
chmod(CONTROLSOCKET,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) == -1 ||
set_cloexec(fd) == -1 ||
@@ -181,7 +187,7 @@ open_control(void)
if ((len = make_sock()) == -1)
return -1;
- return connect(fd, (struct sockaddr *)&sun, len);
+ return connect(fd, &sun.sa, len);
}
int
diff --git a/net.c b/net.c
index f3147d6..20118b5 100644
--- a/net.c
+++ b/net.c
@@ -577,7 +577,10 @@ int
open_udp_socket(struct interface *iface)
{
int s;
- struct sockaddr_in sin;
+ union {
+ struct sockaddr_in in;
+ struct sockaddr sa;
+ } sin;
int n;
#ifdef SO_BINDTODEVICE
struct ifreq ifr;
@@ -607,10 +610,10 @@ open_udp_socket(struct interface *iface)
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1)
goto eexit;
memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_port = htons(DHCP_CLIENT_PORT);
- sin.sin_addr.s_addr = iface->addr.s_addr;
- if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1)
+ sin.in.sin_family = AF_INET;
+ sin.in.sin_port = htons(DHCP_CLIENT_PORT);
+ sin.in.sin_addr.s_addr = iface->addr.s_addr;
+ if (bind(s, &sin.sa, sizeof(sin.in)) == -1)
goto eexit;
iface->udp_fd = s;
@@ -626,14 +629,17 @@ ssize_t
send_packet(const struct interface *iface, struct in_addr to,
const uint8_t *data, ssize_t len)
{
- struct sockaddr_in sin;
+ union {
+ struct sockaddr_in in;
+ struct sockaddr sa;
+ } sin;
memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = to.s_addr;
- sin.sin_port = htons(DHCP_SERVER_PORT);
+ sin.in.sin_family = AF_INET;
+ sin.in.sin_addr.s_addr = to.s_addr;
+ sin.in.sin_port = htons(DHCP_SERVER_PORT);
return sendto(iface->udp_fd, data, len, 0,
- (struct sockaddr *)&sin, sizeof(sin));
+ &sin.sa, sizeof(sin.in));
}
struct udp_dhcp_packet