From d7b7c7727af209c99c95bd0d0b33e3f5428d8d3a Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Sat, 5 Oct 2013 15:34:56 -0700 Subject: [PATCH] Fix win32 so it works again --- lib/logging.c | 4 ++++ lib/pdu.c | 6 +++++- lib/scsi-lowlevel.c | 1 + lib/socket.c | 21 ++++++++++++++------- win32/vsbuild.bat | 5 +++-- win32/win32_compat.c | 10 ++++++++++ win32/win32_compat.h | 13 +++++++++++++ 7 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/logging.c b/lib/logging.c index 6a7c6d6..89e1e14 100644 --- a/lib/logging.c +++ b/lib/logging.c @@ -69,7 +69,11 @@ iscsi_log_message(struct iscsi_context *iscsi, int level, const char *format, .. if (iscsi->target_name[0]) { static char message2[1024]; +#if defined(WIN32) + _snprintf_s(message2, 1024, 1024, "%s [%s]", message, iscsi->target_name); +#else snprintf(message2, 1024, "%s [%s]", message, iscsi->target_name); +#endif iscsi->log_fn(level, message2); } else diff --git a/lib/pdu.c b/lib/pdu.c index 08ec994..f0b900a 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -73,7 +73,11 @@ void iscsi_dump_pdu_header(struct iscsi_context *iscsi, unsigned char *data) { char dump[ISCSI_RAW_HEADER_SIZE*3+1]={0}; int i; for (i=0;i +#include "win32/win32_compat.h" #else #include #endif diff --git a/lib/socket.c b/lib/socket.c index 468af32..041c25e 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -41,6 +41,7 @@ #if defined(WIN32) #include #include +#include "win32/win32_compat.h" #define ioctl ioctlsocket #define close closesocket #else @@ -56,6 +57,7 @@ #include #endif +#include #include #include #include @@ -140,7 +142,7 @@ int set_tcp_sockopt(int sockfd, int optname, int value) level = SOL_TCP; #endif - return setsockopt(sockfd, level, optname, &value, sizeof(value)); + return setsockopt(sockfd, level, optname, (char *)&value, sizeof(value)); } #ifndef TCP_USER_TIMEOUT @@ -327,7 +329,11 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, } if (connect(iscsi->fd, &sa.sa, socksize) != 0 +#if defined(WIN32) + && WSAGetLastError() != WSAEWOULDBLOCK) { +#else && errno != EINPROGRESS) { +#endif iscsi_set_error(iscsi, "Connect failed with errno : " "%s(%d)", strerror(errno), errno); close(iscsi->fd); @@ -700,7 +706,7 @@ iscsi_write_to_socket(struct iscsi_context *iscsi) return 0; } -static inline int +static int iscsi_service_reconnect_if_loggedin(struct iscsi_context *iscsi) { if (iscsi->is_loggedin) { @@ -719,7 +725,7 @@ iscsi_service(struct iscsi_context *iscsi, int revents) socklen_t err_size = sizeof(err); if (getsockopt(iscsi->fd, SOL_SOCKET, SO_ERROR, - &err, &err_size) != 0 || err != 0) { + (char *)&err, &err_size) != 0 || err != 0) { if (err == 0) { err = errno; } @@ -751,8 +757,11 @@ iscsi_service(struct iscsi_context *iscsi, int revents) if (iscsi->is_connected == 0 && iscsi->fd != -1 && revents&POLLOUT) { int err = 0; socklen_t err_size = sizeof(err); + struct sockaddr_in local; + socklen_t local_l = sizeof(local); + if (getsockopt(iscsi->fd, SOL_SOCKET, SO_ERROR, - &err, &err_size) != 0 || err != 0) { + (char *)&err, &err_size) != 0 || err != 0) { if (err == 0) { err = errno; } @@ -768,8 +777,6 @@ iscsi_service(struct iscsi_context *iscsi, int revents) return iscsi_service_reconnect_if_loggedin(iscsi); } - struct sockaddr_in local; - socklen_t local_l = sizeof(local); if (getsockname(iscsi->fd, (struct sockaddr *) &local, &local_l) == 0) { ISCSI_LOG(iscsi, 2, "connection established (%s:%u -> %s)", inet_ntoa(local.sin_addr), (unsigned)ntohs(local.sin_port),iscsi->connected_portal); @@ -881,7 +888,7 @@ int iscsi_set_tcp_keepalive(struct iscsi_context *iscsi, int idle _U_, int count { #ifdef SO_KEEPALIVE int value = 1; - if (setsockopt(iscsi->fd, SOL_SOCKET, SO_KEEPALIVE, &value, sizeof(value)) != 0) { + if (setsockopt(iscsi->fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&value, sizeof(value)) != 0) { iscsi_set_error(iscsi, "TCP: Failed to set socket option SO_KEEPALIVE. Error %s(%d)", strerror(errno), errno); return -1; } diff --git a/win32/vsbuild.bat b/win32/vsbuild.bat index 0e48de0..6dfeb75 100644 --- a/win32/vsbuild.bat +++ b/win32/vsbuild.bat @@ -11,6 +11,7 @@ cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\crc3 cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\discovery.c -Folib\discovery.obj cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\init.c -Folib\init.obj cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\login.c -Folib\login.obj +cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\logging.c -Folib\logging.obj cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\md5.c -Folib\md5.obj cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\nop.c -Folib\nop.obj cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\pdu.c -Folib\pdu.obj @@ -27,9 +28,9 @@ cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd win32\wi rem rem create a linklibrary/dll rem -lib /out:lib\libiscsi.lib /def:lib\libiscsi.def lib\connect.obj lib\crc32c.obj lib\discovery.obj lib\init.obj lib\login.obj lib\md5.obj lib\nop.obj lib\pdu.obj lib\iscsi-command.obj lib\scsi-lowlevel.obj lib\socket.obj lib\sync.obj lib\task_mgmt.obj lib\win32_compat.obj +lib /out:lib\libiscsi.lib /def:lib\libiscsi.def lib\connect.obj lib\crc32c.obj lib\discovery.obj lib\init.obj lib\login.obj lib\logging.obj lib\md5.obj lib\nop.obj lib\pdu.obj lib\iscsi-command.obj lib\scsi-lowlevel.obj lib\socket.obj lib\sync.obj lib\task_mgmt.obj lib\win32_compat.obj -link /DLL /out:lib\libiscsi.dll /DEBUG /DEBUGTYPE:cv lib\libiscsi.exp lib\connect.obj lib\crc32c.obj lib\discovery.obj lib\init.obj lib\login.obj lib\md5.obj lib\nop.obj lib\pdu.obj lib\iscsi-command.obj lib\scsi-lowlevel.obj lib\socket.obj lib\sync.obj lib\task_mgmt.obj lib\win32_compat.obj ws2_32.lib kernel32.lib +link /DLL /out:lib\libiscsi.dll /DEBUG /DEBUGTYPE:cv lib\libiscsi.exp lib\connect.obj lib\crc32c.obj lib\discovery.obj lib\init.obj lib\login.obj lib\logging.obj lib\md5.obj lib\nop.obj lib\pdu.obj lib\iscsi-command.obj lib\scsi-lowlevel.obj lib\socket.obj lib\sync.obj lib\task_mgmt.obj lib\win32_compat.obj ws2_32.lib kernel32.lib diff --git a/win32/win32_compat.c b/win32/win32_compat.c index fe2ca05..c900544 100644 --- a/win32/win32_compat.c +++ b/win32/win32_compat.c @@ -198,4 +198,14 @@ int win32_gettimeofday(struct timeval *tv, struct timezone *tz) return 0; } +ssize_t win32_readv(int fd, const struct iovec *iov, int iovcnt) +{ + return read(fd, iov[0].iov_base, iov[0].iov_len); +} + +ssize_t win32_writev(int fd, const struct iovec *iov, int iovcnt) +{ + return write(fd, iov[0].iov_base, iov[0].iov_len); +} + #endif diff --git a/win32/win32_compat.h b/win32/win32_compat.h index 0119433..1df3630 100644 --- a/win32/win32_compat.h +++ b/win32/win32_compat.h @@ -32,13 +32,19 @@ THE SOFTWARE. #include #include #include +#include #include +#define SOL_TCP IPPROTO_TCP + +typedef int ssize_t; typedef int uid_t; typedef int gid_t; typedef int socklen_t; /* Wrapper macros to call misc. functions win32 is missing */ +#define writev win32_writev +#define readv win32_readv #define poll(x, y, z) win32_poll(x, y, z) #define inet_pton(x,y,z) win32_inet_pton(x,y,z) #define sleep(x) Sleep(x * 1000) @@ -46,5 +52,12 @@ int win32_inet_pton(int af, const char * src, void * dst); int win32_poll(struct pollfd *fds, unsigned int nfsd, int timeout); int win32_gettimeofday(struct timeval *tv, struct timezone *tz); +struct iovec { + void *iov_base; + size_t iov_len; +}; + +#define inline + #endif//win32_COMPAT_H_ #endif//WIN32