From f750101980572e496fcc016f3dcecd8c20e4f46b Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Thu, 11 May 2017 19:52:06 -0700 Subject: [PATCH] Add initial visual studio project files and fix the win32 build Win32 has been rotting for a while. This patch adds vs17 build files as well as fixing up all build errors that have accumulated. There are still build warnings but those can be addressed in a followup patch. Signed-off-by: Ronnie Sahlberg --- configure.ac | 16 ++ include/iscsi-private.h | 11 +- lib/connect.c | 8 + lib/iser.c | 7 + lib/pdu.c | 10 +- lib/scsi-lowlevel.c | 3 + lib/socket.c | 30 +++- lib/sync.c | 5 +- win32/libiscsi/libiscsi.sln | 26 +++ win32/libiscsi/libiscsi.vcxproj | 218 ++++++++++++++++++++++++ win32/libiscsi/libiscsi.vcxproj.filters | 29 ++++ win32/libiscsi/version.rc | 107 ++++++++++++ win32/vsbuild.bat | 44 ----- win32/win32_compat.h | 9 +- 14 files changed, 463 insertions(+), 60 deletions(-) create mode 100644 win32/libiscsi/libiscsi.sln create mode 100644 win32/libiscsi/libiscsi.vcxproj create mode 100644 win32/libiscsi/libiscsi.vcxproj.filters create mode 100644 win32/libiscsi/version.rc delete mode 100644 win32/vsbuild.bat diff --git a/configure.ac b/configure.ac index 1952e6d..cf62b64 100644 --- a/configure.ac +++ b/configure.ac @@ -70,10 +70,26 @@ if test x"$libiscsi_cv_NEED_SYS_FILIO_H" = x"yes"; then AC_DEFINE(NEED_SYS_FILIO_H,1,[Whether we need sys/filio.h]) fi +# check for sys/socket.h +dnl Check for sys/socket.h +AC_CHECK_HEADERS([sys/socket.h]) + +# check for netinet/tcp.h +dnl Check for netinet/tcp.h +AC_CHECK_HEADERS([netinet/tcp.h]) + +# check for netinet/in.h +dnl Check for netinet/in.h +AC_CHECK_HEADERS([netinet/in.h]) + # check for arpa/inet.h dnl Check for arpa/inet.h AC_CHECK_HEADERS([arpa/inet.h]) +# check for sys/uio.h +dnl Check for sys/uio.h +AC_CHECK_HEADERS([sys/uio.h]) + # check for poll.h dnl Check for poll.h AC_CHECK_HEADERS([poll.h]) diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 0045f90..a85b4bd 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -40,9 +40,6 @@ extern "C" { #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif -#include -#include - #define ISCSI_RAW_HEADER_SIZE 48 #define ISCSI_DIGEST_SIZE 4 @@ -68,12 +65,6 @@ void iscsi_free_iscsi_in_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *i /* max length of chap challange */ #define MAX_CHAP_C_LENGTH 2048 -union socket_address { - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - struct sockaddr sa; -}; - struct iscsi_context { struct iscsi_transport *drv; void *opaque; @@ -394,6 +385,8 @@ int iscsi_service_reconnect_if_loggedin(struct iscsi_context *iscsi); void iscsi_dump_pdu_header(struct iscsi_context *iscsi, unsigned char *data); +union socket_address; + typedef struct iscsi_transport { int (*connect)(struct iscsi_context *iscsi, union socket_address *sa, int ai_family); int (*queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); diff --git a/lib/connect.c b/lib/connect.c index 7faeed5..989b924 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -21,6 +21,14 @@ #include #endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +#ifdef HAVE_NETINET_IN_H +#include +#endif + #include #include #include diff --git a/lib/iser.c b/lib/iser.c index 17832c3..4aef52e 100644 --- a/lib/iser.c +++ b/lib/iser.c @@ -34,6 +34,13 @@ #ifdef __linux +/* MUST keep in sync with socket.c */ +union socket_address { + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr sa; +}; + static int cq_handle(struct iser_conn *iser_conn); /* diff --git a/lib/pdu.c b/lib/pdu.c index 63adcc6..6fd4b45 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -27,8 +27,17 @@ #include #endif +#ifdef HAVE_INTTYPES_H +#include +#else +#define PRIu64 "llu" +#define PRIx32 "x" +#endif + #if defined(WIN32) #include +#include +#include "win32/win32_compat.h" #else #include #endif @@ -36,7 +45,6 @@ #include #include #include -#include #include "iscsi.h" #include "iscsi-private.h" #include "scsi-lowlevel.h" diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 9626cd2..0558e5b 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -45,7 +45,10 @@ #include #endif +#ifdef HAVE_SYS_SOCKET_H #include +#endif + #include #include #include diff --git a/lib/socket.c b/lib/socket.c index 41b68c0..f9e3c1a 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -39,16 +39,17 @@ #include "aros/aros_compat.h" #endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + #if defined(WIN32) #include #include #include "win32/win32_compat.h" -#define ioctl ioctlsocket -#define close closesocket #else #include #include -#include #include #include #include @@ -58,7 +59,10 @@ #include #endif +#ifdef HAVE_SYS_UIO_H #include +#endif + #include #include #include @@ -74,6 +78,13 @@ static uint32_t iface_rr = 0; struct iscsi_transport; +/* MUST keep in sync with iser.c */ +union socket_address { + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr sa; +}; + void iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { @@ -1087,6 +1098,18 @@ void iscsi_set_bind_interfaces(struct iscsi_context *iscsi, char * interfaces _U #endif } +#ifdef WIN32 +static iscsi_transport iscsi_transport_tcp = { + iscsi_tcp_connect, + iscsi_tcp_queue_pdu, + iscsi_tcp_new_pdu, + iscsi_tcp_disconnect, + iscsi_tcp_free_pdu, + iscsi_tcp_service, + iscsi_tcp_get_fd, + iscsi_tcp_which_events, +}; +#else static iscsi_transport iscsi_transport_tcp = { .connect = iscsi_tcp_connect, .queue_pdu = iscsi_tcp_queue_pdu, @@ -1097,6 +1120,7 @@ static iscsi_transport iscsi_transport_tcp = { .get_fd = iscsi_tcp_get_fd, .which_events = iscsi_tcp_which_events, }; +#endif void iscsi_init_tcp_transport(struct iscsi_context *iscsi) { diff --git a/lib/sync.c b/lib/sync.c index 0e4d42b..1c2084e 100644 --- a/lib/sync.c +++ b/lib/sync.c @@ -32,11 +32,14 @@ #include "win32/win32_compat.h" #endif +#ifdef HAVE_UNISTD_H +#include +#endif + #include #include #include #include -#include #include "iscsi.h" #include "iscsi-private.h" #include "scsi-lowlevel.h" diff --git a/win32/libiscsi/libiscsi.sln b/win32/libiscsi/libiscsi.sln new file mode 100644 index 0000000..661dedc --- /dev/null +++ b/win32/libiscsi/libiscsi.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{07C74339-C53E-4C5C-B9A5-2AA95ED03B2A}") = "libiscsi", "libiscsi.vcxproj", "{A3B13826-6DEF-4C25-A790-A16B37804064}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A3B13826-6DEF-4C25-A790-A16B37804064}.Debug|Win32.ActiveCfg = Debug|Win32 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Debug|Win32.Build.0 = Debug|Win32 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Debug|x64.ActiveCfg = Debug|x64 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Debug|x64.Build.0 = Debug|x64 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Release|Win32.ActiveCfg = Release|Win32 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Release|Win32.Build.0 = Release|Win32 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Release|x64.ActiveCfg = Release|x64 + {A3B13826-6DEF-4C25-A790-A16B37804064}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/libiscsi/libiscsi.vcxproj b/win32/libiscsi/libiscsi.vcxproj new file mode 100644 index 0000000..1969257 --- /dev/null +++ b/win32/libiscsi/libiscsi.vcxproj @@ -0,0 +1,218 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {7CAB9B67-6AA9-497F-A900-20D9D05049F5} + Win32Proj + libiscsi + + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + + + + + + + true + $(LibraryPath) + $(ExecutablePath) + + + true + $(LibraryPath) + $(ExecutablePath) + + + false + $(LibraryPath) + $(ExecutablePath) + + + false + $(LibraryPath) + $(ExecutablePath) + + + + + + Level3 + Disabled + WIN32;NDEBUG;_WINDOWS;_USRDLL;_U_=;_USE_32BIT_TIME_T;__STDC_CONSTANT_MACROS;%(PreprocessorDefinitions) + ..\..\include;..\..\.;..\..\win32;..\..\lib + Default + 4996 + + + Windows + true + ..\..\lib\libiscsi.def + ws2_32.lib;%(AdditionalDependencies) + MSVCRT + + + + + + + + + + + Level3 + Disabled + WIN32;NDEBUG;_WINDOWS;_USRDLL;_U_=;__STDC_CONSTANT_MACROS;%(PreprocessorDefinitions) + ..\..\include;..\..\.;..\..\win32;..\..\lib + Default + 4996 + + + Windows + true + ..\..\lib\libiscsi.def + ws2_32.lib;%(AdditionalDependencies) + MSVCRT + + + + + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;_U_=;_USE_32BIT_TIME_T;__STDC_CONSTANT_MACROS;%(PreprocessorDefinitions) + ..\..\include;..\..\.;..\..\win32;..\..\lib + 4996 + + + Windows + true + true + true + ws2_32.lib;%(AdditionalDependencies) + ..\..\lib\libiscsi.def + + + + + + + + + Level3 + + + Full + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;_U_=;__STDC_CONSTANT_MACROS;%(PreprocessorDefinitions) + ..\..\include;..\..\.;..\..\win32;..\..\lib + 4996 + AnySuitable + Speed + + + Windows + true + true + true + ws2_32.lib;%(AdditionalDependencies) + ..\..\lib\libiscsi.def + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/libiscsi/libiscsi.vcxproj.filters b/win32/libiscsi/libiscsi.vcxproj.filters new file mode 100644 index 0000000..e104ac8 --- /dev/null +++ b/win32/libiscsi/libiscsi.vcxproj.filters @@ -0,0 +1,29 @@ + + + + + {38246570-1DA0-489E-920A-20A22AAAB787} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {7F9950EA-C34C-4898-8D50-DF2069176D4B} + h;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + + + Header Files + + + + + + + + + diff --git a/win32/libiscsi/version.rc b/win32/libiscsi/version.rc new file mode 100644 index 0000000..3326cea --- /dev/null +++ b/win32/libiscsi/version.rc @@ -0,0 +1,107 @@ + +// Microsoft Visual C++ generated resource script. +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Deutsch (Deutschland) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource1.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,18,0,0 + PRODUCTVERSION 1,18,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040704b0" + BEGIN + VALUE "CompanyName", "https://github.com/sahlberg/libiscsi" + VALUE "FileDescription", "LIBISCSI is a userspace iSCSI initiator." + VALUE "FileVersion", "1.18.0.0" + VALUE "InternalName", "libiscsi.dll" + VALUE "LegalCopyright", "Copyright (C) 2017" + VALUE "OriginalFilename", "libiscsi.dll" + VALUE "ProductName", "libiscsi" + VALUE "ProductVersion", "1.18.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x407, 1200 + END +END + +#endif // Deutsch (Deutschland) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/win32/vsbuild.bat b/win32/vsbuild.bat deleted file mode 100644 index 6dfeb75..0000000 --- a/win32/vsbuild.bat +++ /dev/null @@ -1,44 +0,0 @@ -rem -rem build script for win32 -rem - - -rem -rem generate core part of library -rem -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\connect.c -Folib\connect.obj -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\crc32c.c -Folib\crc32c.obj -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 -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\iscsi-command.c -Folib\iscsi-command.obj -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\scsi-lowlevel.c -Folib\scsi-lowlevel.obj -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\socket.c -Folib\socket.obj -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\sync.c -Folib\sync.obj -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd lib\task_mgmt.c -Folib\task_mgmt.obj -cl /I. /Iinclude -Zi -Od -c -D_U_="" -DWIN32 -D_WIN32_WINNT=0x0600 -MDd win32\win32_compat.c -Folib\win32_compat.obj - - - - -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\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\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 - - - - -rem -rem build a test application -rem -cl /I. /Iinclude -Zi -Od -DWIN32 -D_WIN32_WINNT=0x0600 -MDd -D_U_="" examples\iscsiclient.c lib\win32_compat.obj lib\libiscsi.lib WS2_32.lib kernel32.lib mswsock.lib advapi32.lib wsock32.lib advapi32.lib - - - diff --git a/win32/win32_compat.h b/win32/win32_compat.h index d6adfd7..c34bd7a 100644 --- a/win32/win32_compat.h +++ b/win32/win32_compat.h @@ -43,15 +43,20 @@ 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 close closesocket +#define ioctl ioctlsocket +#define readv win32_readv +#define writev win32_writev #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) +#define snprintf sprintf_s #define snprintf(a, b, c, ...) _snprintf_s(a, b, b, c, ## __VA_ARGS__) 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); +ssize_t win32_writev(int fd, const struct iovec *iov, int iovcnt); +ssize_t win32_readv(int fd, const struct iovec *iov, int iovcnt); struct iovec { void *iov_base;