blob: 0a2159658d552734f1ae93f16050857ec305a820 [file] [log] [blame]
diff --git c/src/c/CMakeLists.txt w/src/c/CMakeLists.txt
new file mode 100644
index 000000000..57677caef
--- /dev/null
+++ w/src/c/CMakeLists.txt
@@ -0,0 +1,232 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cmake_minimum_required(VERSION 3.6)
+
+project(zookeeper VERSION 3.4.8)
+set(email user@zookeeper.apache.org)
+set(description "zookeeper C client")
+
+# general options
+include_directories(include tests generated ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
+if(UNIX)
+ add_compile_options(-Wall -fPIC)
+elseif(WIN32)
+ add_compile_options(/W3)
+endif()
+add_definitions(-DUSE_STATIC_LIB)
+
+# TODO: Enable /WX and /W4 on Windows. Currently there are ~1000 warnings.
+# TODO: Add Solaris support.
+# TODO: Add a shared library option.
+# TODO: Specify symbols to export.
+# TODO: Generate doxygen documentation.
+
+# Sync API option
+option(WANT_SYNCAPI "Enables Sync API support" ON)
+if(WANT_SYNCAPI)
+ add_definitions(-DTHREADED)
+endif()
+
+# CppUnit option
+if(WIN32 OR APPLE)
+ # The tests do not yet compile on Windows or macOS,
+ # so we set this to off by default.
+ #
+ # Note that CMake does not have expressions except in conditionals,
+ # so we're left with this if/else/endif pattern.
+ set(DEFAULT_WANT_CPPUNIT OFF)
+else()
+ set(DEFAULT_WANT_CPPUNIT ON)
+endif()
+option(WANT_CPPUNIT "Enables CppUnit and tests" ${DEFAULT_WANT_CPPUNIT})
+
+# The function `to_have(in out)` converts a header name like `arpa/inet.h`
+# into an Autotools style preprocessor definition `HAVE_ARPA_INET_H`.
+# This is then set or unset in `configure_file()` step.
+#
+# Note that CMake functions do not have return values; instead an "out"
+# variable must be passed, and explicitly set with parent scope.
+function(to_have in out)
+ string(TOUPPER ${in} str)
+ string(REGEX REPLACE "/|\\." "_" str ${str})
+ set(${out} "HAVE_${str}" PARENT_SCOPE)
+endfunction()
+
+# include file checks
+foreach(f generated/zookeeper.jute.h generated/zookeeper.jute.c)
+ if(EXISTS "${CMAKE_SOURCE_DIR}/${f}")
+ to_have(${f} name)
+ set(${name} 1)
+ else()
+ message(FATAL_ERROR
+ "jute files are missing!\n"
+ "Please run 'ant compile_jute' while in the ZooKeeper top level directory.")
+ endif()
+endforeach()
+
+# header checks
+include(CheckIncludeFile)
+set(check_headers
+ arpa/inet.h
+ dlfcn.h
+ fcntl.h
+ inttypes.h
+ memory.h
+ netdb.h
+ netinet/in.h
+ stdint.h
+ stdlib.h
+ string.h
+ strings.h
+ sys/socket.h
+ sys/stat.h
+ sys/time.h
+ sys/types.h
+ unistd.h
+ sys/utsname.h)
+
+foreach(f ${check_headers})
+ to_have(${f} name)
+ check_include_file(${f} ${name})
+endforeach()
+
+# function checks
+include(CheckFunctionExists)
+set(check_functions
+ getcwd
+ gethostbyname
+ gethostname
+ getlogin
+ getpwuid_r
+ gettimeofday
+ getuid
+ memmove
+ memset
+ poll
+ socket
+ strchr
+ strdup
+ strerror
+ strtol)
+
+foreach(fn ${check_functions})
+ to_have(${fn} name)
+ check_function_exists(${fn} ${name})
+endforeach()
+
+# library checks
+set(check_libraries rt m pthread)
+foreach(lib ${check_libraries})
+ to_have("lib${lib}" name)
+ find_library(${name} ${lib})
+endforeach()
+
+# IPv6 check
+include(CheckStructHasMember)
+check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h" ZOO_IPV6_ENABLED)
+
+# configure
+configure_file(cmake_config.h.in ${CMAKE_SOURCE_DIR}/include/config.h)
+
+# hashtable library
+set(hashtable_sources src/hashtable/hashtable_itr.c src/hashtable/hashtable.c)
+add_library(hashtable STATIC ${hashtable_sources})
+target_link_libraries(hashtable PUBLIC $<$<OR:$<PLATFORM_ID:Linux>,$<PLATFORM_ID:FreeBSD>>:m>)
+
+# zookeeper library
+set(zookeeper_sources
+ src/zookeeper.c
+ src/recordio.c
+ generated/zookeeper.jute.c
+ src/zk_log.c
+ src/zk_hashtable.c)
+
+if(WANT_SYNCAPI)
+ list(APPEND zookeeper_sources src/mt_adaptor.c)
+else()
+ list(APPEND zookeeper_sources src/st_adaptor.c)
+endif()
+
+if(WIN32)
+ list(APPEND zookeeper_sources src/winport.c)
+endif()
+
+add_library(zookeeper STATIC ${zookeeper_sources})
+target_link_libraries(zookeeper PUBLIC
+ hashtable
+ $<$<PLATFORM_ID:Linux>:rt> # clock_gettime
+ $<$<PLATFORM_ID:Windows>:ws2_32>) # Winsock 2.0
+
+if(WANT_SYNCAPI AND NOT WIN32)
+ find_package(Threads REQUIRED)
+ target_link_libraries(zookeeper PUBLIC Threads::Threads)
+endif()
+
+# cli executable
+add_executable(cli src/cli.c)
+target_link_libraries(cli zookeeper)
+
+# load_gen executable
+if(WANT_SYNCAPI AND NOT WIN32)
+ add_executable(load_gen src/load_gen.c)
+ target_link_libraries(load_gen zookeeper)
+endif()
+
+# tests
+set(test_sources
+ tests/TestDriver.cc
+ tests/LibCMocks.cc
+ tests/LibCSymTable.cc
+ tests/MocksBase.cc
+ tests/ZKMocks.cc
+ tests/Util.cc
+ tests/ThreadingUtil.cc
+ tests/TestZookeeperInit.cc
+ tests/TestZookeeperClose.cc
+ tests/TestClientRetry.cc
+ tests/TestOperations.cc
+ tests/TestMulti.cc
+ tests/TestWatchers.cc
+ tests/TestClient.cc)
+
+if(WANT_SYNCAPI)
+ list(APPEND test_sources tests/PthreadMocks.cc)
+endif()
+
+if(WANT_CPPUNIT)
+ add_executable(zktest ${test_sources})
+ target_compile_definitions(zktest
+ PRIVATE -DZKSERVER_CMD="${CMAKE_SOURCE_DIR}/tests/zkServer.sh")
+ # TODO: Use `find_library()` for `cppunit`.
+ target_link_libraries(zktest zookeeper cppunit dl)
+
+ # This reads the link flags from the file `tests/wrappers.opt` into
+ # the variable `symbol_wrappers` for use in `target_link_libraries`.
+ # It is a holdover from the original build system.
+ file(STRINGS tests/wrappers.opt symbol_wrappers)
+ if(WANT_SYNCAPI)
+ file(STRINGS tests/wrappers-mt.opt symbol_wrappers_mt)
+ endif()
+
+ target_link_libraries(zktest ${symbol_wrappers} ${symbol_wrappers_mt})
+
+ enable_testing()
+ add_test(NAME zktest_runner COMMAND zktest)
+ set_property(TEST zktest_runner PROPERTY ENVIRONMENT
+ "ZKROOT=${CMAKE_SOURCE_DIR}/../.."
+ "CLASSPATH=$CLASSPATH:$CLOVER_HOME/lib/clover.jar")
+endif()
diff --git c/src/c/Cli.vcproj w/src/c/Cli.vcproj
deleted file mode 100644
index 39ed8a429..000000000
--- c/src/c/Cli.vcproj
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="Cli"
- ProjectGUID="{050228F9-070F-4806-A2B5-E6B95D8EC4AF}"
- RootNamespace="Cli"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(ZOOKEEPER_HOME)\src\c\src;$(ZOOKEEPER_HOME)\src\c\include;$(ZOOKEEPER_HOME)\src\c;$(ZOOKEEPER_HOME)\src\c\generated"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;THREADED"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="Ws2_32.lib zookeeper_d.lib"
- OutputFile="$(OutDir)\$(ProjectName).exe"
- LinkIncremental="2"
- AdditionalLibraryDirectories="$(ZOOKEEPER_HOME)\src\c\Debug"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="$(ZOOKEEPER_HOME)\src\c\src;$(ZOOKEEPER_HOME)\src\c\include;$(ZOOKEEPER_HOME)\src\c;$(ZOOKEEPER_HOME)\src\c\generated"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;THREADED"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="Ws2_32.lib zookeeper.lib"
- LinkIncremental="1"
- AdditionalLibraryDirectories="$(ZOOKEEPER_HOME)\src\c\Release"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\src\cli.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(ZOOKEEPER_HOME)\src\c\include;$(ZOOKEEPER_HOME)\src\c;$(ZOOKEEPER_HOME)\src\c\src"
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git c/src/c/README w/src/c/README
index 0b31d0a7a..4f1ad7abf 100644
--- c/src/c/README
+++ w/src/c/README
@@ -71,6 +71,28 @@ tar downloaded from Apache please skip to step 2.
default only HTML documentation is generated. For information on
other document formats please use "./configure --help"
+Alternatively you can use the CMake build system. On Windows, this is required.
+Follow steps 1 and 2 above, and then continue here.
+
+1) do a "cmake [OPTIONS]" to generate the makefile or msbuild files (the correct
+ build system will be generated based on your platform). Some options from above
+ are supported:
+ -DCMAKE_BUILD_TYPE Debug by default, Release enables optimzation etc.
+ -DWANT_SYNCAPI ON by default, OFF disables the Sync API support
+ -DWANT_CPPUNIT ON except on Windows, OFF disables the tests
+ -DBUILD_SHARED_LIBS not yet supported, only static libraries are built
+ other CMake options see "cmake --help" for generic options, such as generator
+
+2) do a "cmake --build ." to build the default targets. Alternatively you can
+ invoke "make" or "msbuild" manually. If the tests were enabled, use "ctest -V"
+ to run them.
+
+Current limitations of the CMake build system include lack of Solaris support,
+no shared library option, no explicitly exported symbols (all are exported by
+default), no versions on the libraries, and no documentation generation.
+Features of CMake include a single, easily consumed cross-platform build system
+to generate the ZooKeeper C Client libraries for any project, with little to no
+configuration.
USING THE CLIENT
diff --git c/src/c/cmake_config.h.in w/src/c/cmake_config.h.in
new file mode 100644
index 000000000..55efd8a86
--- /dev/null
+++ w/src/c/cmake_config.h.in
@@ -0,0 +1,154 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CONFIG_H_
+#define CONFIG_H_
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#cmakedefine HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#cmakedefine HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#cmakedefine HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */
+#cmakedefine HAVE_GENERATED_ZOOKEEPER_JUTE_C 1
+
+/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */
+#cmakedefine HAVE_GENERATED_ZOOKEEPER_JUTE_H 1
+
+/* Define to 1 if you have the `getcwd' function. */
+#cmakedefine HAVE_GETCWD 1
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#cmakedefine HAVE_GETHOSTBYNAME 1
+
+/* Define to 1 if you have the `gethostname' function. */
+#cmakedefine HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the `getlogin' function. */
+#cmakedefine HAVE_GETLOGIN 1
+
+/* Define to 1 if you have the `getpwuid_r' function. */
+#cmakedefine HAVE_GETPWUID_R 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#cmakedefine HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the `getuid' function. */
+#cmakedefine HAVE_GETUID 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `rt' library (-lrt). */
+#cmakedefine HAVE_LIBRT 1
+
+/* Define to 1 if you have the `memmove' function. */
+#cmakedefine HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#cmakedefine HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `memset' function. */
+#cmakedefine HAVE_MEMSET 1
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#cmakedefine HAVE_NETDB_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#cmakedefine HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the `poll' function. */
+#cmakedefine HAVE_POLL 1
+
+/* Define to 1 if you have the `socket' function. */
+#cmakedefine HAVE_SOCKET 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#cmakedefine HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#cmakedefine HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strchr' function. */
+#cmakedefine HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strdup' function. */
+#cmakedefine HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#cmakedefine HAVE_STRERROR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#cmakedefine HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strtol' function. */
+#cmakedefine HAVE_STRTOL 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#cmakedefine HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#cmakedefine HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#cmakedefine HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#cmakedefine HAVE_SYS_UTSNAME_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H 1
+
+/* Define to 1 if IPv6 support is available. */
+#cmakedefine ZOO_IPV6_ENABLED 1
+
+/* poll() second argument type */
+#define POLL_NFDS_TYPE nfds_t
+
+/* Name of package */
+#define PACKAGE "${PROJECT_NAME}"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "${email}"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "${description}"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "${description} ${PROJECT_VERSION}"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "${PROJECT_NAME}"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "${PROJECT_VERSION}"
+
+/* Version number of package */
+#define VERSION "${PROJECT_VERSION}"
+
+#endif
diff --git c/src/c/include/recordio.h w/src/c/include/recordio.h
index 90f458b4a..eed5f99c2 100644
--- c/src/c/include/recordio.h
+++ w/src/c/include/recordio.h
@@ -19,11 +19,12 @@
#define __RECORDIO_H__
#include <sys/types.h>
-#ifndef WIN32
-#define STRUCT_INITIALIZER(l,r) .l = r
-#else
-#define STRUCT_INITIALIZER(l,r) r
+#include <stdint.h> /* for int64_t */
+#ifdef WIN32
#include "winconfig.h"
+#define STRUCT_INITIALIZER(l,r) r
+#else
+#define STRUCT_INITIALIZER(l,r) .l = r
#endif
#ifdef __cplusplus
diff --git c/src/c/include/winconfig.h w/src/c/include/winconfig.h
index 06c377e93..c273a932a 100644
--- c/src/c/include/winconfig.h
+++ w/src/c/include/winconfig.h
@@ -1,196 +1,15 @@
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#undef HAVE_ARPA_INET_H
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */
-#define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1
-
-/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */
-#define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1
-
-/* Define to 1 if you have the `getcwd' function. */
-#undef HAVE_GETCWD
-
-/* Define to 1 if you have the `gethostbyname' function. */
-#undef HAVE_GETHOSTBYNAME
-
-/* Define to 1 if you have the `gethostname' function. */
-#define HAVE_GETHOSTNAME 1
-
-/* Define to 1 if you have the `getlogin' function. */
-#undef HAVE_GETLOGIN
-
-/* Define to 1 if you have the `getpwuid_r' function. */
-#undef HAVE_GETPWUID_R
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#undef HAVE_GETTIMEOFDAY
-
-/* Define to 1 if you have the `getuid' function. */
-#undef HAVE_GETUID
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the `memmove' function. */
-#undef HAVE_MEMMOVE
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `memset' function. */
-#undef HAVE_MEMSET
-
-/* Define to 1 if you have the <netdb.h> header file. */
-#undef HAVE_NETDB_H
-
-/* Define to 1 if you have the <netinet/in.h> header file. */
-#undef HAVE_NETINET_IN_H
-
-/* Define to 1 if you have the `poll' function. */
-#undef HAVE_POLL
-
-/* Define to 1 if you have the `socket' function. */
-#undef HAVE_SOCKET
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strchr' function. */
-#define HAVE_STRCHR 1
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strtol' function. */
-#undef HAVE_STRTOL
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#undef HAVE_SYS_SOCKET_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <sys/utsname.h> header file. */
-#undef HAVE_SYS_UTSNAME_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#define LT_OBJDIR
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-/* #undef NO_MINUS_C_MINUS_O */
-
-/* Name of package */
-#define PACKAGE "c-client-src"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "user@zookeeper.apache.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "zookeeper C client"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "zookeeper C client 3.4.8 win32"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "c-client-src"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "3.4.8"
-
-/* poll() second argument type */
-#define POLL_NFDS_TYPE
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME
-
-/* Version number of package */
-#define VERSION "3.4.8"
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
+#ifndef WINCONFIG_H_
+#define WINCONFIG_H_
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#define inline __inline
#endif
-#ifdef WIN32
+
#define __attribute__(x)
#define __func__ __FUNCTION__
-#ifndef _WIN32_WINNT_NT4
-#define _WIN32_WINNT_NT4 0x0400
-#endif
-
-#define NTDDI_VERSION _WIN32_WINNT_NT4
-#define _WIN32_WINNT _WIN32_WINNT_NT4
-
-#define _CRT_SECURE_NO_WARNINGS
-#define WIN32_LEAN_AND_MEAN
-#include <Windows.h>
-#include <Winsock2.h>
-#include <winstdint.h>
-#include <process.h>
-#include <ws2tcpip.h>
-#undef AF_INET6
-#undef min
-#undef max
-
-#include <errno.h>
-
-#define strtok_r strtok_s
-#define localtime_r(a,b) localtime_s(b,a)
-#define get_errno() errno=GetLastError()
-#define random rand
-#define snprintf _snprintf
-
-#define ACL ZKACL // Conflict with windows API
-
-#define EAI_ADDRFAMILY WSAEINVAL
-#define EHOSTDOWN EPIPE
-#define ESTALE ENODEV
-
-#ifndef EWOULDBLOCK
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#endif
-
-#ifndef EINPROGRESS
-#define EINPROGRESS WSAEINPROGRESS
-#endif
+#define ACL ZKACL /* Conflict with windows API */
-typedef int pid_t;
#endif
diff --git c/src/c/include/winstdint.h w/src/c/include/winstdint.h
deleted file mode 100644
index d02608a59..000000000
--- c/src/c/include/winstdint.h
+++ /dev/null
@@ -1,247 +0,0 @@
-// ISO C9x compliant stdint.h for Microsoft Visual Studio
-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
-//
-// Copyright (c) 2006-2008 Alexander Chemeris
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-//
-// 3. The name of the author may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef _MSC_VER // [
-#error "Use this header only with Microsoft Visual C++ compilers!"
-#endif // _MSC_VER ]
-
-#ifndef _MSC_STDINT_H_ // [
-#define _MSC_STDINT_H_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif
-
-#include <limits.h>
-
-// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
-// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
-// or compiler give many errors like this:
-// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
-#ifdef __cplusplus
-extern "C" {
-#endif
-# include <wchar.h>
-#ifdef __cplusplus
-}
-#endif
-
-// Define _W64 macros to mark types changing their size, like intptr_t.
-#ifndef _W64
-# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
-# define _W64 __w64
-# else
-# define _W64
-# endif
-#endif
-
-
-// 7.18.1 Integer types
-
-// 7.18.1.1 Exact-width integer types
-
-// Visual Studio 6 and Embedded Visual C++ 4 doesn't
-// realize that, e.g. char has the same size as __int8
-// so we give up on __intX for them.
-#if (_MSC_VER < 1300)
- typedef signed char int8_t;
- typedef signed short int16_t;
- typedef signed int int32_t;
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
-#else
- typedef signed __int8 int8_t;
- typedef signed __int16 int16_t;
- typedef signed __int32 int32_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
-#endif
-typedef signed __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-
-// 7.18.1.2 Minimum-width integer types
-typedef int8_t int_least8_t;
-typedef int16_t int_least16_t;
-typedef int32_t int_least32_t;
-typedef int64_t int_least64_t;
-typedef uint8_t uint_least8_t;
-typedef uint16_t uint_least16_t;
-typedef uint32_t uint_least32_t;
-typedef uint64_t uint_least64_t;
-
-// 7.18.1.3 Fastest minimum-width integer types
-typedef int8_t int_fast8_t;
-typedef int16_t int_fast16_t;
-typedef int32_t int_fast32_t;
-typedef int64_t int_fast64_t;
-typedef uint8_t uint_fast8_t;
-typedef uint16_t uint_fast16_t;
-typedef uint32_t uint_fast32_t;
-typedef uint64_t uint_fast64_t;
-
-// 7.18.1.4 Integer types capable of holding object pointers
-#ifdef _WIN64 // [
- typedef signed __int64 intptr_t;
- typedef unsigned __int64 uintptr_t;
-#else // _WIN64 ][
- typedef _W64 signed int intptr_t;
- typedef _W64 unsigned int uintptr_t;
-#endif // _WIN64 ]
-
-// 7.18.1.5 Greatest-width integer types
-typedef int64_t intmax_t;
-typedef uint64_t uintmax_t;
-
-
-// 7.18.2 Limits of specified-width integer types
-
-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
-
-// 7.18.2.1 Limits of exact-width integer types
-#define INT8_MIN ((int8_t)_I8_MIN)
-#define INT8_MAX _I8_MAX
-#define INT16_MIN ((int16_t)_I16_MIN)
-#define INT16_MAX _I16_MAX
-#define INT32_MIN ((int32_t)_I32_MIN)
-#define INT32_MAX _I32_MAX
-#define INT64_MIN ((int64_t)_I64_MIN)
-#define INT64_MAX _I64_MAX
-#define UINT8_MAX _UI8_MAX
-#define UINT16_MAX _UI16_MAX
-#define UINT32_MAX _UI32_MAX
-#define UINT64_MAX _UI64_MAX
-
-// 7.18.2.2 Limits of minimum-width integer types
-#define INT_LEAST8_MIN INT8_MIN
-#define INT_LEAST8_MAX INT8_MAX
-#define INT_LEAST16_MIN INT16_MIN
-#define INT_LEAST16_MAX INT16_MAX
-#define INT_LEAST32_MIN INT32_MIN
-#define INT_LEAST32_MAX INT32_MAX
-#define INT_LEAST64_MIN INT64_MIN
-#define INT_LEAST64_MAX INT64_MAX
-#define UINT_LEAST8_MAX UINT8_MAX
-#define UINT_LEAST16_MAX UINT16_MAX
-#define UINT_LEAST32_MAX UINT32_MAX
-#define UINT_LEAST64_MAX UINT64_MAX
-
-// 7.18.2.3 Limits of fastest minimum-width integer types
-#define INT_FAST8_MIN INT8_MIN
-#define INT_FAST8_MAX INT8_MAX
-#define INT_FAST16_MIN INT16_MIN
-#define INT_FAST16_MAX INT16_MAX
-#define INT_FAST32_MIN INT32_MIN
-#define INT_FAST32_MAX INT32_MAX
-#define INT_FAST64_MIN INT64_MIN
-#define INT_FAST64_MAX INT64_MAX
-#define UINT_FAST8_MAX UINT8_MAX
-#define UINT_FAST16_MAX UINT16_MAX
-#define UINT_FAST32_MAX UINT32_MAX
-#define UINT_FAST64_MAX UINT64_MAX
-
-// 7.18.2.4 Limits of integer types capable of holding object pointers
-#ifdef _WIN64 // [
-# define INTPTR_MIN INT64_MIN
-# define INTPTR_MAX INT64_MAX
-# define UINTPTR_MAX UINT64_MAX
-#else // _WIN64 ][
-# define INTPTR_MIN INT32_MIN
-# define INTPTR_MAX INT32_MAX
-# define UINTPTR_MAX UINT32_MAX
-#endif // _WIN64 ]
-
-// 7.18.2.5 Limits of greatest-width integer types
-#define INTMAX_MIN INT64_MIN
-#define INTMAX_MAX INT64_MAX
-#define UINTMAX_MAX UINT64_MAX
-
-// 7.18.3 Limits of other integer types
-
-#ifdef _WIN64 // [
-# define PTRDIFF_MIN _I64_MIN
-# define PTRDIFF_MAX _I64_MAX
-#else // _WIN64 ][
-# define PTRDIFF_MIN _I32_MIN
-# define PTRDIFF_MAX _I32_MAX
-#endif // _WIN64 ]
-
-#define SIG_ATOMIC_MIN INT_MIN
-#define SIG_ATOMIC_MAX INT_MAX
-
-#ifndef SIZE_MAX // [
-# ifdef _WIN64 // [
-# define SIZE_MAX _UI64_MAX
-# else // _WIN64 ][
-# define SIZE_MAX _UI32_MAX
-# endif // _WIN64 ]
-#endif // SIZE_MAX ]
-
-// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
-#ifndef WCHAR_MIN // [
-# define WCHAR_MIN 0
-#endif // WCHAR_MIN ]
-#ifndef WCHAR_MAX // [
-# define WCHAR_MAX _UI16_MAX
-#endif // WCHAR_MAX ]
-
-#define WINT_MIN 0
-#define WINT_MAX _UI16_MAX
-
-#endif // __STDC_LIMIT_MACROS ]
-
-
-// 7.18.4 Limits of other integer types
-
-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
-
-// 7.18.4.1 Macros for minimum-width integer constants
-
-#define INT8_C(val) val##i8
-#define INT16_C(val) val##i16
-#define INT32_C(val) val##i32
-#define INT64_C(val) val##i64
-
-#define UINT8_C(val) val##ui8
-#define UINT16_C(val) val##ui16
-#define UINT32_C(val) val##ui32
-#define UINT64_C(val) val##ui64
-
-// 7.18.4.2 Macros for greatest-width integer constants
-#define INTMAX_C INT64_C
-#define UINTMAX_C UINT64_C
-
-#endif // __STDC_CONSTANT_MACROS ]
-
-
-#endif // _MSC_STDINT_H_ ]
diff --git c/src/c/include/zookeeper.h w/src/c/include/zookeeper.h
index 7d1066a93..b0bb09e3f 100644
--- c/src/c/include/zookeeper.h
+++ w/src/c/include/zookeeper.h
@@ -20,12 +20,18 @@
#define ZOOKEEPER_H_
#include <stdlib.h>
+
+/* we must not include config.h as a public header */
#ifndef WIN32
#include <sys/socket.h>
#include <sys/time.h>
-#else
-#include "winconfig.h"
#endif
+
+#ifdef WIN32
+#include <winsock2.h> /* must always be included before ws2tcpip.h */
+#include <ws2tcpip.h> /* for struct sock_addr and socklen_t */
+#endif
+
#include <stdio.h>
#include <ctype.h>
diff --git c/src/c/src/load_gen.c w/src/c/src/load_gen.c
index 72b595076..0410ca137 100644
--- c/src/c/src/load_gen.c
+++ w/src/c/src/load_gen.c
@@ -19,13 +19,9 @@
#include <zookeeper.h>
#include "zookeeper_log.h"
#include <errno.h>
-#ifndef WIN32
#ifdef THREADED
#include <pthread.h>
#endif
-#else
-#include "win32port.h"
-#endif
#include <string.h>
#include <stdlib.h>
diff --git c/src/c/src/mt_adaptor.c w/src/c/src/mt_adaptor.c
index 7dc78789f..52d86d5d9 100644
--- c/src/c/src/mt_adaptor.c
+++ w/src/c/src/mt_adaptor.c
@@ -19,7 +19,7 @@
#define THREADED
#endif
-#ifndef DLL_EXPORT
+#if !defined(DLL_EXPORT) && !defined(USE_STATIC_LIB)
# define USE_STATIC_LIB
#endif
@@ -373,8 +373,7 @@ void *do_io(void *v)
int interest;
int timeout;
int maxfd=1;
- int rc;
-
+
zookeeper_interest(zh, &fd, &interest, &tv);
if (fd != -1) {
fds[1].fd=fd;
@@ -436,7 +435,7 @@ void *do_io(void *v)
}
#endif
// dispatch zookeeper events
- rc = zookeeper_process(zh, interest);
+ zookeeper_process(zh, interest);
// check the current state of the zhandle and terminate
// if it is_unrecoverable()
if(is_unrecoverable(zh))
@@ -483,25 +482,9 @@ int32_t inc_ref_counter(zhandle_t* zh,int i)
int32_t fetch_and_add(volatile int32_t* operand, int incr)
{
#ifndef WIN32
- int32_t result;
- asm __volatile__(
- "lock xaddl %0,%1\n"
- : "=r"(result), "=m"(*(int *)operand)
- : "0"(incr)
- : "memory");
- return result;
+ return __sync_fetch_and_add(operand, incr);
#else
- volatile int32_t result;
- _asm
- {
- mov eax, operand; //eax = v;
- mov ebx, incr; // ebx = i;
- mov ecx, 0x0; // ecx = 0;
- lock xadd dword ptr [eax], ecx;
- lock xadd dword ptr [eax], ebx;
- mov result, ecx; // result = ebx;
- }
- return result;
+ return InterlockedExchangeAdd(operand, incr);
#endif
}
diff --git c/src/c/src/recordio.c w/src/c/src/recordio.c
index 41797fbc9..e5944d6be 100644
--- c/src/c/src/recordio.c
+++ w/src/c/src/recordio.c
@@ -23,6 +23,8 @@
#include <stdlib.h>
#ifndef WIN32
#include <netinet/in.h>
+#else
+#include <winsock2.h> /* for _htonl and _ntohl */
#endif
void deallocate_String(char **s)
diff --git c/src/c/src/winport.c w/src/c/src/winport.c
index aeef3a84e..3592ea149 100644
--- c/src/c/src/winport.c
+++ w/src/c/src/winport.c
@@ -18,8 +18,10 @@
#ifdef WIN32
#include "winport.h"
-#include <winsock2.h>
-#include <ws2tcpip.h>
+#include <stdlib.h>
+#include <stdint.h> /* for int64_t */
+#include <winsock2.h> /* must always be included before ws2tcpip.h */
+#include <ws2tcpip.h> /* for SOCKET */
int pthread_mutex_lock(pthread_mutex_t* _mutex ){
int rc = WaitForSingleObject( *_mutex, // handle to mutex
@@ -255,6 +257,14 @@ int pthread_setspecific(pthread_key_t key, const void *value)
return ((rc != 0 ) ? 0 : GetLastError());
}
+int gettimeofday(struct timeval *tp, void *tzp) {
+ int64_t now = 0;
+ if (tzp != 0) { errno = EINVAL; return -1; }
+ GetSystemTimeAsFileTime( (LPFILETIME)&now );
+ tp->tv_sec = (long)(now / 10000000 - 11644473600LL);
+ tp->tv_usec = (now / 10) % 1000000;
+ return 0;
+}
int close(SOCKET fd) {
return closesocket(fd);
diff --git c/src/c/src/winport.h w/src/c/src/winport.h
index 32272c03d..da6028cd3 100644
--- c/src/c/src/winport.h
+++ w/src/c/src/winport.h
@@ -25,9 +25,31 @@
#define WINPORT_H_
#ifdef WIN32
-#include <winconfig.h>
+#include "winconfig.h"
+
+#define _WINSOCK_DEPRECATED_NO_WARNINGS
+#include <winsock2.h> /* must always be included before ws2tcpip.h */
+#include <ws2tcpip.h> /* for struct sock_addr used in zookeeper.h */
+
+/* POSIX names are deprecated, use ISO conformant names instead. */
+#define strdup _strdup
+#define getcwd _getcwd
+#define getpid _getpid
+
+/* Windows "secure" versions of POSIX reentrant functions */
+#define strtok_r strtok_s
+#define localtime_r(a,b) localtime_s(b,a)
+
+/* After this version of MSVC, snprintf became a defined function,
+ and so cannot be redefined, nor can #ifndef be used to guard it. */
+#if ((defined(_MSC_VER) && _MSC_VER < 1900) || !defined(_MSC_VER))
+#define snprintf _snprintf
+#endif
+
+
#include <errno.h>
#include <process.h>
+#include <stdint.h> /* for int64_t */
#include <stdlib.h>
#include <malloc.h>
@@ -105,14 +127,7 @@ int pthread_key_delete(pthread_key_t key);
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
-inline int gettimeofday(struct timeval *tp, void *tzp) {
- int64_t now = 0;
- if (tzp != 0) { errno = EINVAL; return -1; }
- GetSystemTimeAsFileTime( (LPFILETIME)&now );
- tp->tv_sec = (long)(now / 10000000 - 11644473600LL);
- tp->tv_usec = (now / 10) % 1000000;
- return 0;
-}
+int gettimeofday(struct timeval *tp, void *tzp);
int close(SOCKET fd);
int Win32WSAStartup();
void Win32WSACleanup();
diff --git c/src/c/src/zk_log.c w/src/c/src/zk_log.c
index 37ff856ca..6b4fdfa2b 100644
--- c/src/c/src/zk_log.c
+++ w/src/c/src/zk_log.c
@@ -16,13 +16,16 @@
* limitations under the License.
*/
-#ifndef DLL_EXPORT
+#if !defined(DLL_EXPORT) && !defined(USE_STATIC_LIB)
# define USE_STATIC_LIB
#endif
#include "zookeeper_log.h"
#ifndef WIN32
#include <unistd.h>
+#else
+typedef DWORD pid_t;
+#include <process.h> /* for getpid */
#endif
#include <stdarg.h>
diff --git c/src/c/src/zookeeper.c w/src/c/src/zookeeper.c
index 1ba90afa2..9b837f227 100644
--- c/src/c/src/zookeeper.c
+++ w/src/c/src/zookeeper.c
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-#ifndef DLL_EXPORT
+#if !defined(DLL_EXPORT) && !defined(USE_STATIC_LIB)
# define USE_STATIC_LIB
#endif
@@ -24,6 +24,7 @@
#define USE_IPV6
#endif
+#include "config.h"
#include <zookeeper.h>
#include <zookeeper.jute.h>
#include <proto.h>
@@ -41,16 +42,33 @@
#include <stdarg.h>
#include <limits.h>
-#ifndef WIN32
+#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_POLL
#include <poll.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#include <netinet/tcp.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_NETDB_H
#include <netdb.h>
-#include <unistd.h>
-#include "config.h"
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> // needed for _POSIX_MONOTONIC_CLOCK
#endif
#ifdef HAVE_SYS_UTSNAME_H
@@ -61,6 +79,15 @@
#include <pwd.h>
#endif
+#ifdef WIN32
+#define random rand /* replace POSIX random with Windows rand */
+#include <process.h> /* for getpid */
+#include <direct.h> /* for getcwd */
+#define EAI_ADDRFAMILY WSAEINVAL /* is this still needed? */
+#define EHOSTDOWN EPIPE
+#define ESTALE ENODEV
+#endif
+
#define IF_DEBUG(x) if(logLevel==ZOO_LOG_LEVEL_DEBUG) {x;}
const int ZOOKEEPER_WRITE = 1 << 0;
@@ -1611,7 +1638,16 @@ int zookeeper_interest(zhandle_t *zh, int *fd, int *interest,
#endif
rc = connect(zh->fd, (struct sockaddr*) &zh->addrs[zh->connect_index], sizeof(struct sockaddr_in));
#ifdef WIN32
- get_errno();
+ errno = GetLastError();
+
+#ifndef EWOULDBLOCK
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#endif
+
+#ifndef EINPROGRESS
+#define EINPROGRESS WSAEINPROGRESS
+#endif
+
#if _MSC_VER >= 1600
switch (errno) {
case WSAEWOULDBLOCK:
diff --git c/src/c/zookeeper.vcproj w/src/c/zookeeper.vcproj
deleted file mode 100644
index dc3ab43e3..000000000
--- c/src/c/zookeeper.vcproj
+++ /dev/null
@@ -1,300 +0,0 @@
-???<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="zookeeper"
- ProjectGUID="{5754FB2B-5EA5-4988-851D-908CA533A626}"
- RootNamespace="zookeeper"
- Keyword="Win32Proj"
- TargetFrameworkVersion="0"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="Debug"
- IntermediateDirectory="Debug"
- ConfigurationType="2"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="$(ZOOKEEPER_HOME)\src\c\include;$(ZOOKEEPER_HOME)\src\c\generated;$(ZOOKEEPER_HOME)\src\c;$(ZOOKEEPER_HOME)\src\c\src\hashtable"
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;ZOOKEEPER_EXPORTS;DLL_EXPORT;THREADED"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="false"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib"
- OutputFile="$(OutDir)\$(ProjectName).dll"
- LinkIncremental="1"
- AdditionalLibraryDirectories=""
- GenerateDebugInformation="true"
- SubSystem="2"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- ImportLibrary=".\Debug/zookeeper_d.lib"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="Release"
- IntermediateDirectory="Release"
- ConfigurationType="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(ZOOKEEPER_HOME)\src\c\generated;$(ZOOKEEPER_HOME)\src\c;$(ZOOKEEPER_HOME)\src\c\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;ZOOKEEPER_EXPORTS;DLL_EXPORT;THREADED"
- RuntimeLibrary="2"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="WS2_32.lib"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="2"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath=".\src\hashtable\hashtable.h"
- >
- </File>
- <File
- RelativePath=".\src\hashtable\hashtable_itr.h"
- >
- </File>
- <File
- RelativePath=".\src\hashtable\hashtable_private.h"
- >
- </File>
- <File
- RelativePath=".\include\proto.h"
- >
- </File>
- <File
- RelativePath=".\include\recordio.h"
- >
- </File>
- <File
- RelativePath=".\include\winconfig.h"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath=".\src\winport.h"
- >
- </File>
- <File
- RelativePath=".\include\winstdint.h"
- >
- </File>
- <File
- RelativePath=".\src\zk_adaptor.h"
- >
- </File>
- <File
- RelativePath=".\src\zk_hashtable.h"
- >
- </File>
- <File
- RelativePath=".\include\zookeeper.h"
- >
- </File>
- <File
- RelativePath=".\generated\zookeeper.jute.h"
- >
- </File>
- <File
- RelativePath=".\include\zookeeper_log.h"
- >
- </File>
- <File
- RelativePath=".\include\zookeeper_version.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath=".\src\hashtable\hashtable.c"
- >
- </File>
- <File
- RelativePath=".\src\hashtable\hashtable_itr.c"
- >
- </File>
- <File
- RelativePath=".\src\mt_adaptor.c"
- >
- </File>
- <File
- RelativePath=".\src\recordio.c"
- >
- </File>
- <File
- RelativePath=".\src\winport.c"
- >
- </File>
- <File
- RelativePath=".\src\zk_hashtable.c"
- >
- </File>
- <File
- RelativePath=".\src\zk_log.c"
- >
- </File>
- <File
- RelativePath=".\src\zookeeper.c"
- >
- </File>
- <File
- RelativePath=".\generated\zookeeper.jute.c"
- >
- </File>
- </Filter>
- <File
- RelativePath=".\ClassDiagram1.cd"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
From 4343ef1db40ebe2a744326000eff725deb55f97f Mon Sep 17 00:00:00 2001
From: Kapil Arya <kapil@mesosphere.io>
Date: Thu, 16 Aug 2018 15:53:53 -0400
Subject: [PATCH] Backported a format error fix.
This patch backports https://github.com/apache/zookeeper/pull/559.
---
src/c/src/zookeeper.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/c/src/zookeeper.c b/src/c/src/zookeeper.c
index 1ba90afa..a4c28e36 100644
--- a/src/c/src/zookeeper.c
+++ b/src/c/src/zookeeper.c
@@ -3440,7 +3440,7 @@ int zoo_add_auth(zhandle_t *zh,const char* scheme,const char* cert,
static const char* format_endpoint_info(const struct sockaddr_storage* ep)
{
static char buf[128];
- char addrstr[128];
+ char addrstr[INET6_ADDRSTRLEN];
void *inaddr;
#ifdef WIN32
char * addrstring;
--
2.18.0