]> git.ozlabs.org Git - ccan/blobdiff - ccan/iscsi/socket.c
iscsi: use <sys/filio.h> on Solaris.
[ccan] / ccan / iscsi / socket.c
index 6f1eeddac291c0881bfaddb1f9b6d613556fde16..f79b31692b764dffb3e5136e1a1fb504a15c3c30 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    Copyright (C) 2010 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
    
    This program is free software; you can redistribute it and/or modify
@@ -15,6 +15,7 @@
    along with this program; if not, see <http://www.gnu.org/licenses/>.
 */
 
+#include "config.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <netinet/in.h>
 #include <poll.h>
 #include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
 #include <arpa/inet.h>
 #include "iscsi.h"
 #include "iscsi-private.h"
 #include "dlinklist.h"
+#if HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
 
 static void set_nonblocking(int fd)
 {
@@ -43,8 +49,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 +84,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 +115,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 +162,7 @@ int iscsi_which_events(struct iscsi_context *iscsi)
 
        if (iscsi->is_connected == 0) {
                events |= POLLOUT;
-       }       
+       }
 
        if (iscsi->outqueue) {
                events |= POLLOUT;