-/*
+/*
Copyright (C) 2010 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
This program is free software; you can redistribute it and/or modify
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)
{
int iscsi_connect_async(struct iscsi_context *iscsi, const char *target, iscsi_command_cb cb, void *private_data)
{
- int tpgt = -1;
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) {
/* check if we have a target portal group tag */
if ((str = rindex(addr, ',')) != NULL) {
- tpgt = atoi(str+1);
str[0] = 0;
}
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;
}
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)
{
if (iscsi->is_connected == 0) {
events |= POLLOUT;
- }
+ }
if (iscsi->outqueue) {
events |= POLLOUT;