X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fiscsi%2Fsocket.c;h=17c6ffee3b0370af99997fd127459b0fc8a51796;hp=6f1eeddac291c0881bfaddb1f9b6d613556fde16;hb=418cb41273ba4b8bcb07a7b310605107e35bf525;hpb=cb522f25cada0d3429c69d0fbaa5bd337a422cdd diff --git a/ccan/iscsi/socket.c b/ccan/iscsi/socket.c index 6f1eedda..17c6ffee 100644 --- a/ccan/iscsi/socket.c +++ b/ccan/iscsi/socket.c @@ -1,4 +1,4 @@ -/* +/* Copyright (C) 2010 by Ronnie Sahlberg This program is free software; you can redistribute it and/or modify @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include "iscsi.h" #include "iscsi-private.h" @@ -43,8 +45,11 @@ int iscsi_connect_async(struct iscsi_context *iscsi, const char *target, iscsi_c int port = 3260; char *str; char *addr; - struct sockaddr_storage s; - struct sockaddr_in *sin = (struct sockaddr_in *)&s; + union { + struct sockaddr sa; + struct sockaddr_storage ss; + struct sockaddr_in sin; + } s; int socksize; if (iscsi == NULL) { @@ -75,22 +80,22 @@ int iscsi_connect_async(struct iscsi_context *iscsi, const char *target, iscsi_c str[0] = 0; } - sin->sin_family = AF_INET; - sin->sin_port = htons(port); - if (inet_pton(AF_INET, addr, &sin->sin_addr) != 1) { + s.sin.sin_family = AF_INET; + s.sin.sin_port = htons(port); + if (inet_pton(AF_INET, addr, &s.sin.sin_addr) != 1) { printf("failed to convert to ip address\n"); free(addr); return -4; } free(addr); - switch (s.ss_family) { + switch (s.ss.ss_family) { case AF_INET: iscsi->fd = socket(AF_INET, SOCK_STREAM, 0); socksize = sizeof(struct sockaddr_in); break; default: - printf("Unknown family :%d\n", s.ss_family); + printf("Unknown family :%d\n", s.ss.ss_family); return -5; } @@ -106,13 +111,13 @@ int iscsi_connect_async(struct iscsi_context *iscsi, const char *target, iscsi_c set_nonblocking(iscsi->fd); - if (connect(iscsi->fd, (struct sockaddr *)&s, socksize) != 0 && errno != EINPROGRESS) { + if (connect(iscsi->fd, &s.sa, socksize) != 0 && errno != EINPROGRESS) { printf("Connect failed errno : %s (%d)\n", strerror(errno), errno); return -7; - } + } return 0; -} +} int iscsi_disconnect(struct iscsi_context *iscsi) { @@ -153,7 +158,7 @@ int iscsi_which_events(struct iscsi_context *iscsi) if (iscsi->is_connected == 0) { events |= POLLOUT; - } + } if (iscsi->outqueue) { events |= POLLOUT;