diff options
author | Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org> | 2011-12-15 18:36:27 +0059 |
---|---|---|
committer | Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org> | 2011-12-15 18:36:27 +0059 |
commit | 47accd6b5a7ceb86a44d52905a635f164d82e087 (patch) | |
tree | 6c0548034426a22a0b3b99b47a60076896bc6a52 | |
parent | 0d3a47d979ac35a49b2a2da9e80e16bd37aab877 (diff) | |
download | dhcpcd-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.c | 24 | ||||
-rw-r--r-- | net.c | 26 |
2 files changed, 31 insertions, 19 deletions
@@ -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 @@ -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 |