summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2009-02-11 18:33:03 -0500
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2009-02-11 18:33:03 -0500
commit6c96b11141bc8dd7d5df4812ea2bf395756503de (patch)
tree1bd510da79329772c343c71ba07368fc531c5dc7 /src
parent4118a0c053531ed45299318a5fcececcab94a314 (diff)
- fix strict-aliasing errors
Diffstat (limited to 'src')
-rw-r--r--src/disp-nis.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/disp-nis.c b/src/disp-nis.c
index a69c18a..4c92f8c 100644
--- a/src/disp-nis.c
+++ b/src/disp-nis.c
@@ -59,11 +59,18 @@
struct request_info;
#endif
+union dispatch_client_addr {
+ struct sockaddr_storage ss;
+ struct sockaddr s;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+};
+
/* Handle all incoming data. */
struct dispatch_client {
/* The client socket and address. */
int client_fd;
- struct sockaddr_storage client_addr;
+ union dispatch_client_addr client_addr;
socklen_t client_addrlen;
bool_t client_secure;
/* The client state. */
@@ -98,7 +105,7 @@ struct dispatch_client_data {
/* Data for disconnected clients. */
struct {
int client_fd;
- struct sockaddr_storage client_addr;
+ union dispatch_client_addr client_addr;
socklen_t client_addrlen;
bool_t client_secure;
char *reply_buf;
@@ -235,19 +242,19 @@ dispatch_securenets_add(struct plugin_state *state, const char *value)
}
static bool_t
dispatch_securenets_check(struct plugin_state *state,
- struct sockaddr_storage *client_addr)
+ union dispatch_client_addr *client_addr)
{
struct securenet_info *sn;
struct in_addr addr;
struct in6_addr addr6, mask6, masked6;
int i;
for (sn = state->securenet_info; sn != NULL; sn = sn->sn_next) {
- switch (client_addr->ss_family) {
+ switch (client_addr->ss.ss_family) {
case AF_INET:
if (sn->sn_family != AF_INET) {
continue;
}
- addr = ((struct sockaddr_in*) client_addr)->sin_addr;
+ addr = client_addr->sin.sin_addr;
if ((addr.s_addr &
sn->sn_addr.sin.netmask.s_addr) ==
(sn->sn_addr.sin.address.s_addr &
@@ -256,7 +263,7 @@ dispatch_securenets_check(struct plugin_state *state,
}
break;
case AF_INET6:
- addr6 = ((struct sockaddr_in6*) client_addr)->sin6_addr;
+ addr6 = client_addr->sin6.sin6_addr;
if ((sn->sn_family == AF_INET) &&
IN6_IS_ADDR_V4MAPPED(&addr6)) {
if ((((uint32_t*)addr6.s6_addr)[3] &
@@ -466,15 +473,15 @@ dispatch_dgram(struct plugin_state *state, int fd)
"datagram request permitted by securenets\n");
}
- switch (cdata.dgram.client_addr.ss_family) {
+ switch (cdata.dgram.client_addr.ss.ss_family) {
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
case AF_INET:
- sin = (struct sockaddr_in *) &cdata.dgram.client_addr;
+ sin = (struct sockaddr_in *) &cdata.dgram.client_addr.sin;
cdata.dgram.client_secure = ntohs(sin->sin_port) < 1024;
break;
case AF_INET6:
- sin6 = (struct sockaddr_in6 *) &cdata.dgram.client_addr;
+ sin6 = (struct sockaddr_in6 *) &cdata.dgram.client_addr.sin6;
cdata.dgram.client_secure = ntohs(sin6->sin6_port) < 1024;
break;
default:
@@ -559,7 +566,7 @@ dispatch_accept_client(struct plugin_state *state, int fd)
linger.l_onoff = 1;
linger.l_linger = 0;
setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));
- switch (client->client_addr.ss_family) {
+ switch (client->client_addr.ss.ss_family) {
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
case AF_INET: