diff --git a/build.ps1 b/build.ps1 index 8ed04b9..770a301 100644 --- a/build.ps1 +++ b/build.ps1 @@ -230,4 +230,14 @@ function Clean { rm cache -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' rm dist -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' + #rm pkg\nuget\bindings\ZeroTier.Sockets\*.cs -Force -Confirm:$false -ErrorAction:'silentlycontinue' + #rm pkg\nuget\bindings\ZeroTier.Sockets\bin -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' + #rm pkg\nuget\bindings\ZeroTier.Sockets\obj -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' + #rm pkg\nuget\ZeroTier.Sockets\contentFiles -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' + rm pkg\nuget\ZeroTier.Sockets\lib -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' + rm pkg\nuget\ZeroTier.Sockets\bin -Recurse -Force -Confirm:$false -ErrorAction:'silentlycontinue' + rm 'pkg\nuget\*' -Recurse -Include *.pdb + rm 'pkg\nuget\*' -Recurse -Include *.cs + rm 'pkg\nuget\*' -Recurse -Include *.dll + rm 'pkg\nuget\*' -Recurse -Include LICENSE.* } diff --git a/build.sh b/build.sh index 8f08420..1c26687 100755 --- a/build.sh +++ b/build.sh @@ -310,6 +310,7 @@ host() if [[ $1 = *"docs"* ]]; then # Generate documentation cd docs/c && doxygen + cp -f *.png html/ exit 0 fi # -DZTS_ENABLE_CENTRAL_API=0 @@ -547,15 +548,42 @@ test-c() rm -rf $TARGET_BUILD_DIR # Build selftest test $1 - # Ports can be anything we want since they aren't system ports - port4=8080 - port6=8081 # Start Alice as server "$BIN_OUTPUT_DIR/selftest-c-api" $alice_path $testnet $port4 $port6 & # Start Bob as client "$BIN_OUTPUT_DIR/selftest-c-api" $bob_path $testnet $port4 $alice_ip4 $port6 $alice_ip6 & } +# Test C# API +test-cs() +{ + if [[ -z "${alice_path}" ]]; then + echo "Please set necessary environment variables for test" + exit 0 + fi + ARTIFACT="pinvoke" + # Default to debug so asserts aren't optimized out + BUILD_TYPE=${1:-debug} + TARGET_BUILD_DIR=$DEFAULT_HOST_BIN_OUTPUT_DIR-$ARTIFACT-$BUILD_TYPE + LIB_OUTPUT_DIR=$TARGET_BUILD_DIR/lib + BIN_OUTPUT_DIR=$TARGET_BUILD_DIR/bin + rm -rf $TARGET_BUILD_DIR + # Build C shared library exporting C# symbols + host-pinvoke $1 + # TODO: This should eventually be converted to a proper dotnet project + # Build C# managed API library + csc -target:library -out:$LIB_OUTPUT_DIR/ZeroTier.Sockets.dll src/bindings/csharp/*.cs + # Build selftest + mkdir -p $BIN_OUTPUT_DIR + csc -out:$BIN_OUTPUT_DIR/selftest.exe -reference:$LIB_OUTPUT_DIR/ZeroTier.Sockets.dll test/selftest.cs + # Copy shared libraries into bin directory so they can be discovered by dlopen + cp $LIB_OUTPUT_DIR/* $BIN_OUTPUT_DIR + # Start Alice as server + mono --debug "$BIN_OUTPUT_DIR/selftest.exe" $alice_path $testnet $port4 $port6 & + # Start Bob as client + mono --debug "$BIN_OUTPUT_DIR/selftest.exe" $bob_path $testnet $port4 $alice_ip4 $port6 $alice_ip6 & +} + # Recursive deep clean clean() { diff --git a/examples/csharp/example.cs b/examples/csharp/example.cs index 5be0095..80b6c70 100644 --- a/examples/csharp/example.cs +++ b/examples/csharp/example.cs @@ -139,7 +139,8 @@ public class ExampleApp { } catch (ZeroTier.Sockets.SocketException e) { - Console.WriteLine("ServiveErrorCode={0} SocketErrorCode={1}", e.ServiceErrorCode, e.SocketErrorCode); + Console.WriteLine("ServiceErrorCode={0} SocketErrorCode={1}", + e.ServiceErrorCode, e.SocketErrorCode); } if (bytesRec > 0) { Console.WriteLine("Bytes received: {0}", bytesRec); @@ -163,7 +164,8 @@ public class ExampleApp { } catch (ZeroTier.Sockets.SocketException e) { Console.WriteLine(e); - Console.WriteLine("ServiveErrorCode={0} SocketErrorCode={1}", e.ServiceErrorCode, e.SocketErrorCode); + Console.WriteLine("ServiceErrorCode={0} SocketErrorCode={1}", + e.ServiceErrorCode, e.SocketErrorCode); } Console.WriteLine("\nPress ENTER to continue..."); @@ -212,7 +214,7 @@ public class ExampleApp { Console.WriteLine("ArgumentNullException : {0}",ane.ToString()); } catch (ZeroTier.Sockets.SocketException e) { Console.WriteLine(e); - Console.WriteLine("ServiveErrorCode={0} SocketErrorCode={1}", e.ServiceErrorCode, e.SocketErrorCode); + Console.WriteLine("ServiceErrorCode={0} SocketErrorCode={1}", e.ServiceErrorCode, e.SocketErrorCode); } } catch (Exception e) { Console.WriteLine( e.ToString()); diff --git a/include/ZeroTierSockets.h b/include/ZeroTierSockets.h index 0abe99c..095198e 100644 --- a/include/ZeroTierSockets.h +++ b/include/ZeroTierSockets.h @@ -1519,14 +1519,29 @@ ZTS_API int ZTCALL zts_connect( /** * @brief Connect a socket to a remote host * + * This convenience function exists because ZeroTier uses transport-triggered + * links. This means that links between peers do not exist until peers try to + * talk to each other. This can be a problem during connection procedures since + * some of the initial packets are lost. To alleviate the need to try + * `zts_connect` many times, this function will keep re-trying for you, even if + * no known routes exist. However, if the socket is set to `non-blocking` mode + * it will behave identically to `zts_connect` and return immediately upon + * failure. + * * @param fd Socket file descriptor * @param family Address family: `ZTS_AF_INET` or `ZTS_AF_INET6` * @param ipstr Human-readable IP string * @param port Port - * @return `ZTS_ERR_OK` if successful, `ZTS_ERR_SERVICE` if the node - * experiences a problem, `ZTS_ERR_ARG` if invalid arg. Sets `zts_errno` + * @param timeout_ms (Approximate) amount of time in milliseconds before + * connection attempt is aborted. Will block for `30 seconds` if timeout is + * set to `0`. + * + * @return `ZTS_ERR_OK` if successful, `ZTS_ERR_SOCKET` if the function times + * out with no connection made, `ZTS_ERR_SERVICE` if the node experiences a + * problem, `ZTS_ERR_ARG` if invalid arg. Sets `zts_errno` */ -ZTS_API int ZTCALL zts_connect_easy(int fd, int family, char *ipstr, int port); +ZTS_API int ZTCALL zts_connect_easy( + int fd, int family, char *ipstr, int port, int timeout_ms); /** * @brief Bind a socket to a local address @@ -1574,6 +1589,19 @@ ZTS_API int ZTCALL zts_listen(int fd, int backlog); ZTS_API int ZTCALL zts_accept( int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen); +/** + * @brief Accept an incoming connection + * + * @param fd Socket file descriptor + * @param remoteIpStr Buffer that will receive remote host IP string + * @param len Size of buffer that will receive remote host IP string + * Must be set to `ZTS_INET6_ADDRSTRLEN` + * @param port Port number of the newly connected remote host (value-result) + * @return New file descriptor if successful, `ZTS_ERR_SERVICE` if the node + * experiences a problem, `ZTS_ERR_ARG` if invalid arg. Sets `zts_errno` + */ +ZTS_API int ZTCALL zts_accept_easy(int fd, char *remoteIpStr, int len, int *port); + // Socket level option number #define ZTS_SOL_SOCKET 0x0fff // Socket options diff --git a/pkg/nuget/ZeroTier.Sockets/nuget.org.md b/pkg/nuget/ZeroTier.Sockets/nuget.org.md index 91f0b04..527b2b1 100644 --- a/pkg/nuget/ZeroTier.Sockets/nuget.org.md +++ b/pkg/nuget/ZeroTier.Sockets/nuget.org.md @@ -1,9 +1,9 @@ -[ZeroTier](https://www.zerotier.com) SDK +[ZeroTier](https://www.zerotier.com) ===== -Connect physical devices, virtual devices, and application instances as if everything is on a single LAN. +Securely connect application instances, physical devices, and virtual devices as if everything is on a single LAN. ZeroTier brings your network into user-space. No root, and no host configuration requirements. -ZeroTier brings your network into user-space. We've paired our network hypervisor core with a TCP/UDP/IP stack [(lwIP)](https://en.wikipedia.org/wiki/LwIP) to provide your application with an exclusive and private virtual network interface. All traffic on this interface is end-to-end encrypted between each peer and we provide an easy-to-use socket interface similar to [Berkeley Sockets](https://en.wikipedia.org/wiki/Berkeley_sockets). Since we aren't using the kernel's IP stack that means no drivers, no root, and no host configuration requirements. +We've paired our network hyper-visor core with a TCP/UDP/IP stack [(lwIP)](https://en.wikipedia.org/wiki/LwIP) to provide your application with an exclusive and private virtual network interface. All traffic on this interface is end-to-end encrypted between each peer and we provide an easy-to-use socket interface similar to [Berkeley Sockets](https://en.wikipedia.org/wiki/Berkeley_sockets). - Website: https://www.zerotier.com/ - ZeroTier Manual: https://www.zerotier.com/manual/ @@ -11,19 +11,20 @@ ZeroTier brings your network into user-space. We've paired our network hyperviso - SDK Repo: https://github.com/zerotier/libzt - Forum: https://discuss.zerotier.com -## 1.3.3-alpha.2 Release Notes +## 1.3.4 Release Notes -### New namespace structure: -- `ZeroTier.Core` (API to control a ZeroTier Node) - - `class ZeroTier.Core.Node` - - `class ZeroTier.Core.Event` -- `ZeroTier.Sockets` - - `class ZeroTier.Sockets.Socket` - - `class ZeroTier.Sockets.SocketException` -- `ZeroTier.Central` (upcoming) +### Added: + - IPv6 Support + - `Socket.ReceiveTimeout` + - `Socket.SendTimeout` + - `Socket.ConnectTimeout` + - `Socket.SendBufferSize` + - `Socket.ReceiveBufferSize` + - `Socket.Ttl` + - `Socket.LingerState` + - `Socket.KeepAlive` + - `Socket.NoDelay` + - `Socket.Blocking` -### Added to Socket API - - `Socket.ReceiveTimeout`, `Socket.SendTimeout`, etc. - -### Bugs - - Fixed memory leak caused by unmanaged resources not being released. \ No newline at end of file +### Bugfixes: + - Minor C API fixes diff --git a/src/Sockets.cpp b/src/Sockets.cpp index 6254406..6c0c3ab 100644 --- a/src/Sockets.cpp +++ b/src/Sockets.cpp @@ -66,22 +66,44 @@ int zts_connect(int fd, const struct zts_sockaddr *addr, zts_socklen_t addrlen) return lwip_connect(fd, (sockaddr*)addr, addrlen); } -int zts_connect_easy(int fd, int family, char *ipstr, int port) { +int zts_connect_easy(int fd, int family, char *ipstr, int port, int timeout_ms) { + if (timeout_ms < 0) { + return ZTS_ERR_ARG; + } + if (timeout_ms == 0) { + timeout_ms = 30000; // Default + } + int div = 4; // Must be > 0, Four connection attempts per second + int n_tries = (timeout_ms / 1000) * div; + int connect_delay = 1000 / div; + int err = ZTS_ERR_SOCKET; + + zts_socklen_t addrlen = 0; + struct zts_sockaddr_storage ss; + struct zts_sockaddr *sa = NULL; + if (family == ZTS_AF_INET) { - struct zts_sockaddr_in in4; - zts_socklen_t addrlen = sizeof(in4); + addrlen = sizeof(ss); ipstr2sockaddr( - family, ipstr, port, (struct zts_sockaddr *)&in4, &addrlen); - struct zts_sockaddr *sa = (struct zts_sockaddr *)&in4; - return zts_connect(fd, sa, addrlen); + family, ipstr, port, (struct zts_sockaddr *)&ss, &addrlen); + sa = (struct zts_sockaddr *)&ss; } if (family == ZTS_AF_INET6) { - struct zts_sockaddr_in6 in6; - zts_socklen_t addrlen = sizeof(in6); + addrlen = sizeof(ss); ipstr2sockaddr( - family, ipstr, port, (struct zts_sockaddr *)&in6, &addrlen); - struct zts_sockaddr *sa = (struct zts_sockaddr *)&in6; - return zts_connect(fd, sa, addrlen); + family, ipstr, port, (struct zts_sockaddr *)&ss, &addrlen); + sa = (struct zts_sockaddr *)&ss; + } + if (addrlen > 0 && sa != NULL) { + if (zts_get_blocking(fd)) { + do { + err = zts_connect(fd, sa, addrlen); + zts_delay_ms(connect_delay); + n_tries--; + } + while ((err < 0) && (zts_errno != 0) && (n_tries > 0)); + } + return err; } return ZTS_ERR_ARG; } @@ -137,6 +159,34 @@ int zts_accept(int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen) return lwip_accept(fd, (sockaddr*)addr, (socklen_t*)addrlen); } +int zts_accept_easy(int fd, char *remoteIpStr, int len, int *port) +{ + if (len != ZTS_INET6_ADDRSTRLEN) { + return ZTS_ERR_ARG; + } + char ipstr[ZTS_INET6_ADDRSTRLEN]; + memset(ipstr, 0, ZTS_INET6_ADDRSTRLEN); + + zts_sockaddr_storage ss; + zts_socklen_t addrlen = sizeof(ss); + + int acc_fd = zts_accept(fd, (zts_sockaddr*)&ss, (zts_socklen_t*)&addrlen); + struct zts_sockaddr *sa = (struct zts_sockaddr *)&ss; + if (sa->sa_family == ZTS_AF_INET) { + struct zts_sockaddr_in *in4 = (struct zts_sockaddr_in*)sa; + zts_inet_ntop(ZTS_AF_INET, &(in4->sin_addr), + remoteIpStr, ZTS_INET_ADDRSTRLEN); + *port = ntohs(in4->sin_port); + } + if (sa->sa_family == ZTS_AF_INET6) { + struct zts_sockaddr_in6 *in6 = (struct zts_sockaddr_in6*)sa; + zts_inet_ntop(ZTS_AF_INET6, &(in6->sin6_addr), + remoteIpStr, ZTS_INET6_ADDRSTRLEN); + *port = ntohs(in6->sin6_port); + } + return acc_fd; +} + int zts_setsockopt( int fd, int level, int optname, const void *optval,zts_socklen_t optlen) { diff --git a/src/bindings/csharp/Node.cs b/src/bindings/csharp/Node.cs index 8a37a19..7411129 100644 --- a/src/bindings/csharp/Node.cs +++ b/src/bindings/csharp/Node.cs @@ -35,6 +35,8 @@ namespace ZeroTier.Core static ulong _nodeId = 0x0; static bool _isOnline = false; static bool _joinedAtLeastOneNetwork = false; + static bool _has_ipv4_routes = false; + static bool _has_ipv6_routes = false; static bool _hasBeenFreed = false; string _configFilePath; ushort _servicePort; @@ -94,12 +96,22 @@ namespace ZeroTier.Core newEvent = new ZeroTier.Core.Event(msg.eventCode,"EVENT_NETWORK_ACCESS_DENIED"); } if (msg.eventCode == Constants.EVENT_NETWORK_READY_IP4) { - _joinedAtLeastOneNetwork = true; + zts_network_details unmanagedDetails = + (zts_network_details)Marshal.PtrToStructure(msg.network, typeof(zts_network_details)); newEvent = new ZeroTier.Core.Event(msg.eventCode,"EVENT_NETWORK_READY_IP4"); + newEvent.networkDetails = new NetworkDetails(); + newEvent.networkDetails.networkId = unmanagedDetails.nwid; + _joinedAtLeastOneNetwork = true; + _has_ipv4_routes = true; } if (msg.eventCode == Constants.EVENT_NETWORK_READY_IP6) { - _joinedAtLeastOneNetwork = true; + zts_network_details unmanagedDetails = + (zts_network_details)Marshal.PtrToStructure(msg.network, typeof(zts_network_details)); newEvent = new ZeroTier.Core.Event(msg.eventCode,"EVENT_NETWORK_READY_IP6"); + newEvent.networkDetails = new NetworkDetails(); + newEvent.networkDetails.networkId = unmanagedDetails.nwid; + _joinedAtLeastOneNetwork = true; + _has_ipv6_routes = true; } if (msg.eventCode == Constants.EVENT_NETWORK_DOWN) { newEvent = new ZeroTier.Core.Event(msg.eventCode,"EVENT_NETWORK_DOWN"); @@ -261,7 +273,7 @@ namespace ZeroTier.Core _nodeId = 0x0; return zts_restart(); } - + /// /// Requests to join a ZeroTier network. Remember to authorize your node/device. /// @@ -300,6 +312,17 @@ namespace ZeroTier.Core return _joinedAtLeastOneNetwork; } + + public bool HasIPv4Routes + { + get { return _has_ipv4_routes; } + } + + public bool HasIPv6Routes + { + get { return _has_ipv6_routes; } + } + public ulong NodeId { get { diff --git a/src/bindings/csharp/Socket.cs b/src/bindings/csharp/Socket.cs index edd171c..1a4739a 100644 --- a/src/bindings/csharp/Socket.cs +++ b/src/bindings/csharp/Socket.cs @@ -48,6 +48,8 @@ namespace ZeroTier.Sockets bool _isBound; bool _isConnected; + int _connectTimeout = 30000; + AddressFamily _socketFamily; SocketType _socketType; ProtocolType _socketProtocol; @@ -140,50 +142,26 @@ namespace ZeroTier.Sockets throw new ArgumentNullException("remoteEndPoint"); } int err = Constants.ERR_OK; - int addrlen = 0; - IntPtr remoteAddrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(zts_sockaddr))); - if (remoteEndPoint.AddressFamily == AddressFamily.InterNetwork) - { - zts_sockaddr_in sa = new zts_sockaddr_in(); - addrlen = Marshal.SizeOf(typeof(zts_sockaddr_in)); - switch (remoteEndPoint.AddressFamily) - { - case AddressFamily.InterNetwork: - sa.sin_family = (byte)Constants.AF_INET; - break; - case AddressFamily.InterNetworkV6: - sa.sin_family = (byte)Constants.AF_INET6; - break; - case AddressFamily.Unknown: - sa.sin_family = (byte)Constants.AF_UNSPEC; - break; - } - sa.sin_port = (short)IPAddress.HostToNetworkOrder((ushort)remoteEndPoint.Port); - sa.sin_addr = remoteEndPoint.Address.GetAddressBytes(); - sa.sin_len = (byte)addrlen; // lwIP-specific - - Marshal.StructureToPtr(sa, remoteAddrPtr, false); - //zts_sockaddr sAddr = (zts_sockaddr)Marshal.PtrToStructure(remoteAddrPtr, typeof(zts_sockaddr)); - err = zts_connect(_fd, remoteAddrPtr, (byte)addrlen); - + if (remoteEndPoint.AddressFamily == AddressFamily.InterNetwork) { + err = zts_connect_easy( + _fd, + Constants.AF_INET, + remoteEndPoint.Address.ToString(), + (ushort)remoteEndPoint.Port, + _connectTimeout); } - if (remoteEndPoint.AddressFamily == AddressFamily.InterNetworkV6) - { - /* - socketAddress.iSockaddrLength = Marshal.SizeOf(typeof(sockaddr_in6)); - socketAddress.lpSockAddr = CriticalAllocHandle.FromSize(socketAddress.iSockaddrLength); - sockaddr_in6 sa = new sockaddr_in6(); - sa.sin6_family = (short)AddressFamily.InterNetworkV6; - sa.sin6_port = (ushort)endpoint.Port; - sa.sin6_addr = endpoint.Address.GetAddressBytes(); - sa.sin6_scope_id = (uint)endpoint.Address.ScopeId; - Marshal.StructureToPtr(sa, (IntPtr)socketAddress.lpSockAddr, false); - */ + if (remoteEndPoint.AddressFamily == AddressFamily.InterNetworkV6) { + Console.WriteLine("going to connect to: " + remoteEndPoint.ToString()); + err = zts_connect_easy( + _fd, + Constants.AF_INET6, + remoteEndPoint.Address.ToString(), + (ushort)remoteEndPoint.Port, + _connectTimeout); } if (err < 0) { throw new ZeroTier.Sockets.SocketException(err, ZeroTier.Core.Node.ErrNo); } - Marshal.FreeHGlobal(remoteAddrPtr); _remoteEndPoint = remoteEndPoint; _isConnected = true; } @@ -201,48 +179,24 @@ namespace ZeroTier.Sockets throw new ArgumentNullException("localEndPoint"); } int err = Constants.ERR_OK; - int addrlen = 0; - IntPtr localAddrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(zts_sockaddr))); - if (localEndPoint.AddressFamily == AddressFamily.InterNetwork) - { - zts_sockaddr_in sa = new zts_sockaddr_in(); - addrlen = Marshal.SizeOf(typeof(zts_sockaddr_in)); - switch (localEndPoint.AddressFamily) - { - case AddressFamily.InterNetwork: - sa.sin_family = (byte)Constants.AF_INET; - break; - case AddressFamily.InterNetworkV6: - sa.sin_family = (byte)Constants.AF_INET6; - break; - case AddressFamily.Unknown: - sa.sin_family = (byte)Constants.AF_UNSPEC; - break; - } - sa.sin_port = (short)IPAddress.HostToNetworkOrder((ushort)localEndPoint.Port); - sa.sin_addr = localEndPoint.Address.GetAddressBytes(); - sa.sin_len = (byte)addrlen; // lwIP-specific - - Marshal.StructureToPtr(sa, localAddrPtr, false); - err = zts_bind(_fd, localAddrPtr, (byte)addrlen); + if (localEndPoint.AddressFamily == AddressFamily.InterNetwork) { + err = zts_bind_easy( + _fd, + Constants.AF_INET, + "0.0.0.0", + (ushort)localEndPoint.Port); } - if (localEndPoint.AddressFamily == AddressFamily.InterNetworkV6) - { - /* - socketAddress.iSockaddrLength = Marshal.SizeOf(typeof(sockaddr_in6)); - socketAddress.lpSockAddr = CriticalAllocHandle.FromSize(socketAddress.iSockaddrLength); - sockaddr_in6 sa = new sockaddr_in6(); - sa.sin6_family = (short)AddressFamily.InterNetworkV6; - sa.sin6_port = (ushort)endpoint.Port; - sa.sin6_addr = endpoint.Address.GetAddressBytes(); - sa.sin6_scope_id = (uint)endpoint.Address.ScopeId; - Marshal.StructureToPtr(sa, (IntPtr)socketAddress.lpSockAddr, false); - */ + if (localEndPoint.AddressFamily == AddressFamily.InterNetworkV6) { + // Todo: detect IPAddress.IPv6Any + err = zts_bind_easy( + _fd, + Constants.AF_INET6, + "::", + (ushort)localEndPoint.Port); } if (err < 0) { throw new ZeroTier.Sockets.SocketException((int)err); } - Marshal.FreeHGlobal(localAddrPtr); _localEndPoint = localEndPoint; _isBound = true; } @@ -274,29 +228,22 @@ namespace ZeroTier.Sockets throw new ZeroTier.Sockets.SocketException((int)Constants.ERR_SOCKET); } if (_isListening == false) { - throw new InvalidOperationException("Socket is not in a listening state. Call Listen() first"); + throw new InvalidOperationException( + "Socket is not in a listening state. Call Listen() first"); } - // TODO: Rewrite -- Check for memory leaks - // Inform zts_accept of the size of the available address buffer - int addrlen = Marshal.SizeOf(typeof(zts_sockaddr_in)); - IntPtr addrlenPtr = GCHandle.Alloc(addrlen, GCHandleType.Pinned).AddrOfPinnedObject(); - // Allocate space for address buffer and provide pointer to zts_accept - zts_sockaddr_in in4 = new zts_sockaddr_in(); - IntPtr remoteAddrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(zts_sockaddr_in))); - Marshal.StructureToPtr(in4, remoteAddrPtr, false); - - int err = zts_accept(_fd, remoteAddrPtr, addrlenPtr); - if (err < 0) { - throw new ZeroTier.Sockets.SocketException(err, ZeroTier.Core.Node.ErrNo); - } - in4 = (zts_sockaddr_in)Marshal.PtrToStructure(remoteAddrPtr, typeof(zts_sockaddr_in)); - // Convert sockaddr contents to IPEndPoint - IPAddress ipAddress = new IPAddress(in4.sin_addr); - IPEndPoint clientEndPoint = new IPEndPoint(ipAddress, IPAddress.NetworkToHostOrder(((ushort)in4.sin_port))); + IntPtr lpBuffer = Marshal.AllocHGlobal(ZeroTier.Constants.INET6_ADDRSTRLEN); + int port = 0; + int accepted_fd = zts_accept_easy( + _fd, lpBuffer, ZeroTier.Constants.INET6_ADDRSTRLEN, ref port); + // Convert buffer to managed string + string str = Marshal.PtrToStringAnsi(lpBuffer); + Marshal.FreeHGlobal(lpBuffer); + lpBuffer = IntPtr.Zero; + IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Parse(str), port); + Console.WriteLine("clientEndPoint = " + clientEndPoint.ToString()); // Create new socket by providing file descriptor returned from zts_accept call. Socket clientSocket = new Socket( - err, _socketFamily, _socketType, _socketProtocol, _localEndPoint, clientEndPoint); - Marshal.FreeHGlobal(remoteAddrPtr); + accepted_fd, _socketFamily, _socketType, _socketProtocol, _localEndPoint, clientEndPoint); return clientSocket; } @@ -332,28 +279,8 @@ namespace ZeroTier.Sockets public bool Blocking { - get { - return _isBlocking; - } - set { - if (_isClosed) { - throw new ObjectDisposedException("Socket has been closed"); - } - int opts = 0; - if ((opts = zts_fcntl(_fd, (int)(ZeroTier.Constants.F_GETFL), 0)) < 0) { - throw new ZeroTier.Sockets.SocketException(opts, ZeroTier.Core.Node.ErrNo); - } - if (value) { // Blocking - opts = opts & (~(ZeroTier.Constants.O_NONBLOCK)); - } - if (!value) { // Non-Blocking - opts = opts | (int)(ZeroTier.Constants.O_NONBLOCK); - } - if ((opts = zts_fcntl(_fd, ZeroTier.Constants.F_SETFL, (int)opts)) < 0) { - throw new ZeroTier.Sockets.SocketException(opts, ZeroTier.Core.Node.ErrNo); - } - _isBlocking = value; - } + get { return Convert.ToBoolean(zts_get_blocking(_fd)); } + set { zts_set_blocking(_fd, Convert.ToInt32(value)); } } public bool Poll(int microSeconds, System.Net.Sockets.SelectMode mode) @@ -384,13 +311,16 @@ namespace ZeroTier.Sockets poll_set = (zts_pollfd)Marshal.PtrToStructure(poll_fd_ptr, typeof(zts_pollfd)); if (result != 0) { if (mode == SelectMode.SelectRead) { - result = Convert.ToInt32(((byte)poll_set.revents & (byte)ZeroTier.Constants.POLLIN) != 0); + result = Convert.ToInt32(((byte)poll_set.revents + & (byte)ZeroTier.Constants.POLLIN) != 0); } if (mode == SelectMode.SelectWrite) { - result = Convert.ToInt32(((byte)poll_set.revents & (byte)ZeroTier.Constants.POLLOUT) != 0); + result = Convert.ToInt32(((byte)poll_set.revents + & (byte)ZeroTier.Constants.POLLOUT) != 0); } if (mode == SelectMode.SelectError) { - result = Convert.ToInt32(((poll_set.revents & (byte)ZeroTier.Constants.POLLERR) != 0) || + result = Convert.ToInt32(((poll_set.revents + & (byte)ZeroTier.Constants.POLLERR) != 0) || ((poll_set.revents & (byte)ZeroTier.Constants.POLLNVAL) != 0)); } } @@ -430,66 +360,67 @@ namespace ZeroTier.Sockets return zts_recv(_fd, bufferPtr, (uint)Buffer.ByteLength(buffer), (int)flags); } - private void _set_timeout(int timeout_ms, int optname) - { - zts_timeval tv = new zts_timeval(); - // Convert milliseconds to timeval struct - tv.tv_sec = timeout_ms / 1000; - tv.tv_usec = (timeout_ms % 1000) * 1000; - IntPtr tv_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(zts_timeval))); - Marshal.StructureToPtr(tv, tv_ptr, false); - ushort option_size = (ushort)Marshal.SizeOf(typeof(zts_sockaddr_in)); - int err = 0; - if ((err = zts_setsockopt(_fd, ZeroTier.Constants.SOL_SOCKET, - ZeroTier.Constants.SO_RCVTIMEO, tv_ptr, option_size)) < 0) { - throw new ZeroTier.Sockets.SocketException(err, ZeroTier.Core.Node.ErrNo); - } - Marshal.FreeHGlobal(tv_ptr); - } - - private int _get_timeout(int optname) - { - zts_timeval tv = new zts_timeval(); - IntPtr tv_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(zts_timeval))); - Marshal.StructureToPtr(tv, tv_ptr, false); - ushort optlen = (ushort)Marshal.SizeOf(typeof(zts_timeval)); - GCHandle optlen_gc_handle = GCHandle.Alloc(optlen, GCHandleType.Pinned); - IntPtr optlen_ptr = optlen_gc_handle.AddrOfPinnedObject(); - int err = 0; - if ((err = zts_getsockopt(_fd, ZeroTier.Constants.SOL_SOCKET, - ZeroTier.Constants.SO_RCVTIMEO, tv_ptr, optlen_ptr)) < 0) { - throw new ZeroTier.Sockets.SocketException(err, ZeroTier.Core.Node.ErrNo); - } - tv = (zts_timeval)Marshal.PtrToStructure(tv_ptr, typeof(zts_timeval)); - optlen_gc_handle.Free(); - Marshal.FreeHGlobal(tv_ptr); - // Convert timeval struct to milliseconds - return (int)((tv.tv_sec * 1000) + (tv.tv_usec / 1000)); - } - public int ReceiveTimeout { - get { return _get_timeout(ZeroTier.Constants.SO_RCVTIMEO); } - set { _set_timeout(value, ZeroTier.Constants.SO_RCVTIMEO); } + get { return zts_get_recv_timeout(_fd); } + // TODO: microseconds + set { zts_set_recv_timeout(_fd, value, 0); } } public int SendTimeout { - get { return _get_timeout(ZeroTier.Constants.SO_SNDTIMEO); } - set { _set_timeout(value, ZeroTier.Constants.SO_SNDTIMEO); } + get { return zts_get_send_timeout(_fd); } + // TODO: microseconds + set { zts_set_send_timeout(_fd, value, 0); } } - /* TODO - public int ReceiveBufferSize { get; set; } + public int ConnectTimeout + { + get { return _connectTimeout; } + set { _connectTimeout = value;} + } - public int SendBufferSize { get; set; } + public int ReceiveBufferSize + { + get { return zts_get_recv_buf_size(_fd); } + set { zts_set_recv_buf_size(_fd, value); } + } - public short Ttl { get; set; } + public int SendBufferSize + { + get { return zts_get_send_buf_size(_fd); } + set { zts_set_send_buf_size(_fd, value); } + } - public LingerOption LingerState { get; set; } + public short Ttl + { + get { return Convert.ToInt16(zts_get_ttl(_fd)); } + set { zts_set_ttl(_fd, value); } + } - public bool NoDelay { get; set; } - */ + public LingerOption LingerState + { + get { + LingerOption lo = new LingerOption( + Convert.ToBoolean(zts_get_linger_enabled(_fd)), zts_get_linger_value(_fd)); + return lo; + } + set { + zts_set_linger(_fd, Convert.ToInt32(value.Enabled), value.LingerTime); + } + } + + public bool NoDelay + { + get { return Convert.ToBoolean(zts_get_no_delay(_fd)); } + set { zts_set_no_delay(_fd, Convert.ToInt32(value)); } + } + + public bool KeepAlive + { + get { return Convert.ToBoolean(zts_get_keepalive(_fd)); } + set { zts_set_keepalive(_fd, Convert.ToInt32(value)); } + } public bool Connected { get { return _isConnected; } } @@ -526,15 +457,24 @@ namespace ZeroTier.Sockets [DllImport("libzt", EntryPoint="CSharp_zts_connect")] static extern int zts_connect(int arg1, IntPtr arg2, ushort arg3); + [DllImport("libzt", CharSet=CharSet.Ansi, EntryPoint="CSharp_zts_connect_easy")] + static extern int zts_connect_easy(int arg1, int arg2, string arg3, ushort arg4, int arg5); + [DllImport("libzt", EntryPoint="CSharp_zts_bind")] static extern int zts_bind(int arg1, IntPtr arg2, ushort arg3); + [DllImport("libzt", CharSet=CharSet.Ansi, EntryPoint="CSharp_zts_bind_easy")] + static extern int zts_bind_easy(int arg1, int arg2, string arg3, ushort arg4); + [DllImport("libzt", EntryPoint="CSharp_zts_listen")] static extern int zts_listen(int arg1, int arg2); [DllImport("libzt", EntryPoint="CSharp_zts_accept")] static extern int zts_accept(int arg1, IntPtr arg2, IntPtr arg3); + [DllImport("libzt", CharSet=CharSet.Ansi, EntryPoint="CSharp_zts_accept_easy")] + static extern int zts_accept_easy(int arg1, IntPtr remoteAddrStr, int arg2, ref int arg3); + [DllImport("libzt", EntryPoint="CSharp_zts_setsockopt")] static extern int zts_setsockopt(int arg1, int arg2, int arg3, IntPtr arg4, ushort arg5); @@ -592,6 +532,69 @@ namespace ZeroTier.Sockets [DllImport("libzt", EntryPoint="CSharp_zts_shutdown")] static extern int zts_shutdown(int arg1, int arg2); + [DllImport("libzt", EntryPoint="CSharp_zts_set_no_delay")] + static extern int zts_set_no_delay(int fd, int enabled); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_no_delay")] + static extern int zts_get_no_delay(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_linger")] + static extern int zts_set_linger(int fd, int enabled, int value); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_linger_enabled")] + static extern int zts_get_linger_enabled(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_linger_value")] + static extern int zts_get_linger_value(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_reuse_addr")] + static extern int zts_set_reuse_addr(int fd, int enabled); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_reuse_addr")] + static extern int zts_get_reuse_addr(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_recv_timeout")] + static extern int zts_set_recv_timeout(int fd, int seconds, int microseconds); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_recv_timeout")] + static extern int zts_get_recv_timeout(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_send_timeout")] + static extern int zts_set_send_timeout(int fd, int seconds, int microseconds); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_send_timeout")] + static extern int zts_get_send_timeout(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_send_buf_size")] + static extern int zts_set_send_buf_size(int fd, int size); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_send_buf_size")] + static extern int zts_get_send_buf_size(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_recv_buf_size")] + static extern int zts_set_recv_buf_size(int fd, int size); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_recv_buf_size")] + static extern int zts_get_recv_buf_size(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_ttl")] + static extern int zts_set_ttl(int fd, int ttl); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_ttl")] + static extern int zts_get_ttl(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_blocking")] + static extern int zts_set_blocking(int fd, int enabled); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_blocking")] + static extern int zts_get_blocking(int fd); + + [DllImport("libzt", EntryPoint="CSharp_zts_set_keepalive")] + static extern int zts_set_keepalive(int fd, int enabled); + + [DllImport("libzt", EntryPoint="CSharp_zts_get_keepalive")] + static extern int zts_get_keepalive(int fd); + [DllImport("libzt", EntryPoint="CSharp_zts_add_dns_nameserver")] static extern int zts_add_dns_nameserver(IntPtr arg1); diff --git a/src/bindings/csharp/zt_wrap.cpp b/src/bindings/csharp/zt_wrap.cpp index 0f08b39..31865be 100644 --- a/src/bindings/csharp/zt_wrap.cpp +++ b/src/bindings/csharp/zt_wrap.cpp @@ -20,23 +20,23 @@ #ifdef __cplusplus /* SwigValueWrapper is described in swig.swg */ template class SwigValueWrapper { - struct SwigMovePointer { - T *ptr; - SwigMovePointer(T *p) : ptr(p) { } - ~SwigMovePointer() { delete ptr; } - SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } - } pointer; - SwigValueWrapper& operator=(const SwigValueWrapper& rhs); - SwigValueWrapper(const SwigValueWrapper& rhs); + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); public: - SwigValueWrapper() : pointer(0) { } - SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } - operator T&() const { return *pointer.ptr; } - T *operator&() { return pointer.ptr; } + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } }; template T SwigValueInit() { - return T(); + return T(); } #endif @@ -173,72 +173,72 @@ template T SwigValueInit() { /* Support for throwing C# exceptions from C/C++. There are two types: * Exceptions that take a message and ArgumentExceptions that take a message and a parameter name. */ typedef enum { - SWIG_CSharpApplicationException, - SWIG_CSharpArithmeticException, - SWIG_CSharpDivideByZeroException, - SWIG_CSharpIndexOutOfRangeException, - SWIG_CSharpInvalidCastException, - SWIG_CSharpInvalidOperationException, - SWIG_CSharpIOException, - SWIG_CSharpNullReferenceException, - SWIG_CSharpOutOfMemoryException, - SWIG_CSharpOverflowException, - SWIG_CSharpSystemException + SWIG_CSharpApplicationException, + SWIG_CSharpArithmeticException, + SWIG_CSharpDivideByZeroException, + SWIG_CSharpIndexOutOfRangeException, + SWIG_CSharpInvalidCastException, + SWIG_CSharpInvalidOperationException, + SWIG_CSharpIOException, + SWIG_CSharpNullReferenceException, + SWIG_CSharpOutOfMemoryException, + SWIG_CSharpOverflowException, + SWIG_CSharpSystemException } SWIG_CSharpExceptionCodes; typedef enum { - SWIG_CSharpArgumentException, - SWIG_CSharpArgumentNullException, - SWIG_CSharpArgumentOutOfRangeException + SWIG_CSharpArgumentException, + SWIG_CSharpArgumentNullException, + SWIG_CSharpArgumentOutOfRangeException } SWIG_CSharpExceptionArgumentCodes; typedef void (SWIGSTDCALL* SWIG_CSharpExceptionCallback_t)(const char *); typedef void (SWIGSTDCALL* SWIG_CSharpExceptionArgumentCallback_t)(const char *, const char *); typedef struct { - SWIG_CSharpExceptionCodes code; - SWIG_CSharpExceptionCallback_t callback; + SWIG_CSharpExceptionCodes code; + SWIG_CSharpExceptionCallback_t callback; } SWIG_CSharpException_t; typedef struct { - SWIG_CSharpExceptionArgumentCodes code; - SWIG_CSharpExceptionArgumentCallback_t callback; + SWIG_CSharpExceptionArgumentCodes code; + SWIG_CSharpExceptionArgumentCallback_t callback; } SWIG_CSharpExceptionArgument_t; static SWIG_CSharpException_t SWIG_csharp_exceptions[] = { - { SWIG_CSharpApplicationException, NULL }, - { SWIG_CSharpArithmeticException, NULL }, - { SWIG_CSharpDivideByZeroException, NULL }, - { SWIG_CSharpIndexOutOfRangeException, NULL }, - { SWIG_CSharpInvalidCastException, NULL }, - { SWIG_CSharpInvalidOperationException, NULL }, - { SWIG_CSharpIOException, NULL }, - { SWIG_CSharpNullReferenceException, NULL }, - { SWIG_CSharpOutOfMemoryException, NULL }, - { SWIG_CSharpOverflowException, NULL }, - { SWIG_CSharpSystemException, NULL } + { SWIG_CSharpApplicationException, NULL }, + { SWIG_CSharpArithmeticException, NULL }, + { SWIG_CSharpDivideByZeroException, NULL }, + { SWIG_CSharpIndexOutOfRangeException, NULL }, + { SWIG_CSharpInvalidCastException, NULL }, + { SWIG_CSharpInvalidOperationException, NULL }, + { SWIG_CSharpIOException, NULL }, + { SWIG_CSharpNullReferenceException, NULL }, + { SWIG_CSharpOutOfMemoryException, NULL }, + { SWIG_CSharpOverflowException, NULL }, + { SWIG_CSharpSystemException, NULL } }; static SWIG_CSharpExceptionArgument_t SWIG_csharp_exceptions_argument[] = { - { SWIG_CSharpArgumentException, NULL }, - { SWIG_CSharpArgumentNullException, NULL }, - { SWIG_CSharpArgumentOutOfRangeException, NULL } + { SWIG_CSharpArgumentException, NULL }, + { SWIG_CSharpArgumentNullException, NULL }, + { SWIG_CSharpArgumentOutOfRangeException, NULL } }; static void SWIGUNUSED SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code, const char *msg) { - SWIG_CSharpExceptionCallback_t callback = SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback; - if ((size_t)code < sizeof(SWIG_csharp_exceptions)/sizeof(SWIG_CSharpException_t)) { - callback = SWIG_csharp_exceptions[code].callback; - } - callback(msg); + SWIG_CSharpExceptionCallback_t callback = SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback; + if ((size_t)code < sizeof(SWIG_csharp_exceptions)/sizeof(SWIG_CSharpException_t)) { + callback = SWIG_csharp_exceptions[code].callback; + } + callback(msg); } static void SWIGUNUSED SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code, const char *msg, const char *param_name) { - SWIG_CSharpExceptionArgumentCallback_t callback = SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback; - if ((size_t)code < sizeof(SWIG_csharp_exceptions_argument)/sizeof(SWIG_CSharpExceptionArgument_t)) { - callback = SWIG_csharp_exceptions_argument[code].callback; - } - callback(msg, param_name); + SWIG_CSharpExceptionArgumentCallback_t callback = SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback; + if ((size_t)code < sizeof(SWIG_csharp_exceptions_argument)/sizeof(SWIG_CSharpExceptionArgument_t)) { + callback = SWIG_csharp_exceptions_argument[code].callback; + } + callback(msg, param_name); } @@ -246,40 +246,40 @@ static void SWIGUNUSED SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExcepti extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionCallbacks_zt( - SWIG_CSharpExceptionCallback_t applicationCallback, - SWIG_CSharpExceptionCallback_t arithmeticCallback, - SWIG_CSharpExceptionCallback_t divideByZeroCallback, - SWIG_CSharpExceptionCallback_t indexOutOfRangeCallback, - SWIG_CSharpExceptionCallback_t invalidCastCallback, - SWIG_CSharpExceptionCallback_t invalidOperationCallback, - SWIG_CSharpExceptionCallback_t ioCallback, - SWIG_CSharpExceptionCallback_t nullReferenceCallback, - SWIG_CSharpExceptionCallback_t outOfMemoryCallback, - SWIG_CSharpExceptionCallback_t overflowCallback, - SWIG_CSharpExceptionCallback_t systemCallback) { - SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback = applicationCallback; - SWIG_csharp_exceptions[SWIG_CSharpArithmeticException].callback = arithmeticCallback; - SWIG_csharp_exceptions[SWIG_CSharpDivideByZeroException].callback = divideByZeroCallback; - SWIG_csharp_exceptions[SWIG_CSharpIndexOutOfRangeException].callback = indexOutOfRangeCallback; - SWIG_csharp_exceptions[SWIG_CSharpInvalidCastException].callback = invalidCastCallback; - SWIG_csharp_exceptions[SWIG_CSharpInvalidOperationException].callback = invalidOperationCallback; - SWIG_csharp_exceptions[SWIG_CSharpIOException].callback = ioCallback; - SWIG_csharp_exceptions[SWIG_CSharpNullReferenceException].callback = nullReferenceCallback; - SWIG_csharp_exceptions[SWIG_CSharpOutOfMemoryException].callback = outOfMemoryCallback; - SWIG_csharp_exceptions[SWIG_CSharpOverflowException].callback = overflowCallback; - SWIG_csharp_exceptions[SWIG_CSharpSystemException].callback = systemCallback; + SWIG_CSharpExceptionCallback_t applicationCallback, + SWIG_CSharpExceptionCallback_t arithmeticCallback, + SWIG_CSharpExceptionCallback_t divideByZeroCallback, + SWIG_CSharpExceptionCallback_t indexOutOfRangeCallback, + SWIG_CSharpExceptionCallback_t invalidCastCallback, + SWIG_CSharpExceptionCallback_t invalidOperationCallback, + SWIG_CSharpExceptionCallback_t ioCallback, + SWIG_CSharpExceptionCallback_t nullReferenceCallback, + SWIG_CSharpExceptionCallback_t outOfMemoryCallback, + SWIG_CSharpExceptionCallback_t overflowCallback, + SWIG_CSharpExceptionCallback_t systemCallback) { + SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback = applicationCallback; + SWIG_csharp_exceptions[SWIG_CSharpArithmeticException].callback = arithmeticCallback; + SWIG_csharp_exceptions[SWIG_CSharpDivideByZeroException].callback = divideByZeroCallback; + SWIG_csharp_exceptions[SWIG_CSharpIndexOutOfRangeException].callback = indexOutOfRangeCallback; + SWIG_csharp_exceptions[SWIG_CSharpInvalidCastException].callback = invalidCastCallback; + SWIG_csharp_exceptions[SWIG_CSharpInvalidOperationException].callback = invalidOperationCallback; + SWIG_csharp_exceptions[SWIG_CSharpIOException].callback = ioCallback; + SWIG_csharp_exceptions[SWIG_CSharpNullReferenceException].callback = nullReferenceCallback; + SWIG_csharp_exceptions[SWIG_CSharpOutOfMemoryException].callback = outOfMemoryCallback; + SWIG_csharp_exceptions[SWIG_CSharpOverflowException].callback = overflowCallback; + SWIG_csharp_exceptions[SWIG_CSharpSystemException].callback = systemCallback; } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionArgumentCallbacks_zt( - SWIG_CSharpExceptionArgumentCallback_t argumentCallback, - SWIG_CSharpExceptionArgumentCallback_t argumentNullCallback, - SWIG_CSharpExceptionArgumentCallback_t argumentOutOfRangeCallback) { - SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback = argumentCallback; - SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentNullException].callback = argumentNullCallback; - SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentOutOfRangeException].callback = argumentOutOfRangeCallback; + SWIG_CSharpExceptionArgumentCallback_t argumentCallback, + SWIG_CSharpExceptionArgumentCallback_t argumentNullCallback, + SWIG_CSharpExceptionArgumentCallback_t argumentOutOfRangeCallback) { + SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback = argumentCallback; + SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentNullException].callback = argumentNullCallback; + SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentOutOfRangeException].callback = argumentOutOfRangeCallback; } @@ -292,7 +292,7 @@ static SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback = NULL; extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_zt(SWIG_CSharpStringHelperCallback callback) { - SWIG_csharp_string_callback = callback; + SWIG_csharp_string_callback = callback; } @@ -336,38 +336,38 @@ SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_zt(SWIG_CSharpStringHelpe SWIGINTERN void SWIG_CSharpException(int code, const char *msg) { - if (code == SWIG_ValueError) { - SWIG_CSharpExceptionArgumentCodes exception_code = SWIG_CSharpArgumentOutOfRangeException; - SWIG_CSharpSetPendingExceptionArgument(exception_code, msg, 0); - } else { - SWIG_CSharpExceptionCodes exception_code = SWIG_CSharpApplicationException; - switch(code) { - case SWIG_MemoryError: - exception_code = SWIG_CSharpOutOfMemoryException; - break; - case SWIG_IndexError: - exception_code = SWIG_CSharpIndexOutOfRangeException; - break; - case SWIG_DivisionByZero: - exception_code = SWIG_CSharpDivideByZeroException; - break; - case SWIG_IOError: - exception_code = SWIG_CSharpIOException; - break; - case SWIG_OverflowError: - exception_code = SWIG_CSharpOverflowException; - break; - case SWIG_RuntimeError: - case SWIG_TypeError: - case SWIG_SyntaxError: - case SWIG_SystemError: - case SWIG_UnknownError: - default: - exception_code = SWIG_CSharpApplicationException; - break; - } - SWIG_CSharpSetPendingException(exception_code, msg); - } + if (code == SWIG_ValueError) { + SWIG_CSharpExceptionArgumentCodes exception_code = SWIG_CSharpArgumentOutOfRangeException; + SWIG_CSharpSetPendingExceptionArgument(exception_code, msg, 0); + } else { + SWIG_CSharpExceptionCodes exception_code = SWIG_CSharpApplicationException; + switch(code) { + case SWIG_MemoryError: + exception_code = SWIG_CSharpOutOfMemoryException; + break; + case SWIG_IndexError: + exception_code = SWIG_CSharpIndexOutOfRangeException; + break; + case SWIG_DivisionByZero: + exception_code = SWIG_CSharpDivideByZeroException; + break; + case SWIG_IOError: + exception_code = SWIG_CSharpIOException; + break; + case SWIG_OverflowError: + exception_code = SWIG_CSharpOverflowException; + break; + case SWIG_RuntimeError: + case SWIG_TypeError: + case SWIG_SyntaxError: + case SWIG_SystemError: + case SWIG_UnknownError: + default: + exception_code = SWIG_CSharpApplicationException; + break; + } + SWIG_CSharpSetPendingException(exception_code, msg); + } } @@ -386,709 +386,989 @@ extern "C" { #endif SWIGEXPORT void SWIGSTDCALL CSharp_zts_errno_set(int jarg1) { - int arg1 ; + int arg1; - arg1 = (int)jarg1; - zts_errno = arg1; + arg1 = (int)jarg1; + zts_errno = arg1; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_errno_get() { - int jresult ; - int result; + int jresult; + int result; - result = (int)zts_errno; - jresult = result; - return jresult; + result = (int)zts_errno; + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_allow_network_caching(unsigned char jarg1) { - int jresult ; - uint8_t arg1 ; - int result; + int jresult; + uint8_t arg1; + int result; - arg1 = (uint8_t)jarg1; - result = (int)zts_allow_network_caching(arg1); - jresult = result; - return jresult; + arg1 = (uint8_t)jarg1; + result = (int)zts_allow_network_caching(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_allow_peer_caching(unsigned char jarg1) { - int jresult ; - uint8_t arg1 ; - int result; + int jresult; + uint8_t arg1; + int result; - arg1 = (uint8_t)jarg1; - result = (int)zts_allow_peer_caching(arg1); - jresult = result; - return jresult; + arg1 = (uint8_t)jarg1; + result = (int)zts_allow_peer_caching(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_allow_local_conf(unsigned char jarg1) { - int jresult ; - uint8_t arg1 ; - int result; + int jresult; + uint8_t arg1; + int result; - arg1 = (uint8_t)jarg1; - result = (int)zts_allow_local_conf(arg1); - jresult = result; - return jresult; + arg1 = (uint8_t)jarg1; + result = (int)zts_allow_local_conf(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_start(char * jarg1, void * jarg2, unsigned short jarg3) { - int jresult ; - char *arg1 = (char *) 0 ; - CppCallback arg2 = (CppCallback) 0 ; - uint16_t arg3 ; - int result; + int jresult; + char *arg1 = (char *) 0; + CppCallback arg2 = (CppCallback) 0; + uint16_t arg3; + int result; - arg1 = (char *)jarg1; - arg2 = (CppCallback)jarg2; - arg3 = (uint16_t)jarg3; - result = (int)zts_start((char const *)arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (char *)jarg1; + arg2 = (CppCallback)jarg2; + arg3 = (uint16_t)jarg3; + result = (int)zts_start((char const *)arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_stop() { - int jresult ; - int result; + int jresult; + int result; - result = (int)zts_stop(); - jresult = result; - return jresult; + result = (int)zts_stop(); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_restart() { - int jresult ; - int result; + int jresult; + int result; - result = (int)zts_restart(); - jresult = result; - return jresult; + result = (int)zts_restart(); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_free() { - int jresult ; - int result; + int jresult; + int result; - result = (int)zts_free(); - jresult = result; - return jresult; + result = (int)zts_free(); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_join(unsigned long long jarg1) { - int jresult ; - uint64_t arg1 ; - int result; + int jresult; + uint64_t arg1; + int result; - arg1 = (uint64_t)jarg1; - result = (int)zts_join(arg1); - jresult = result; - return jresult; + arg1 = (uint64_t)jarg1; + result = (int)zts_join(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_leave(unsigned long long jarg1) { - int jresult ; - uint64_t arg1 ; - int result; + int jresult; + uint64_t arg1; + int result; - arg1 = (uint64_t)jarg1; - result = (int)zts_leave(arg1); - jresult = result; - return jresult; + arg1 = (uint64_t)jarg1; + result = (int)zts_leave(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_orbit(unsigned long long jarg1, unsigned long long jarg2) { - int jresult ; - uint64_t arg1 ; - uint64_t arg2 ; - int result; + int jresult; + uint64_t arg1; + uint64_t arg2; + int result; - arg1 = (uint64_t)jarg1; - arg2 = (uint64_t)jarg2; - result = (int)zts_orbit(arg1,arg2); - jresult = result; - return jresult; + arg1 = (uint64_t)jarg1; + arg2 = (uint64_t)jarg2; + result = (int)zts_orbit(arg1,arg2); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_deorbit(unsigned long long jarg1) { - int jresult ; - uint64_t arg1 ; - int result; + int jresult; + uint64_t arg1; + int result; - arg1 = (uint64_t)jarg1; - result = (int)zts_deorbit(arg1); - jresult = result; - return jresult; + arg1 = (uint64_t)jarg1; + result = (int)zts_deorbit(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_6plane_addr(void * jarg1, unsigned long long jarg2, unsigned long long jarg3) { - int jresult ; - zts_sockaddr_storage *arg1 = (zts_sockaddr_storage *) 0 ; - uint64_t arg2 ; - uint64_t arg3 ; - int result; + int jresult; + zts_sockaddr_storage *arg1 = (zts_sockaddr_storage *) 0; + uint64_t arg2; + uint64_t arg3; + int result; - arg1 = (zts_sockaddr_storage *)jarg1; - arg2 = (uint64_t)jarg2; - arg3 = (uint64_t)jarg3; - result = (int)zts_get_6plane_addr(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (zts_sockaddr_storage *)jarg1; + arg2 = (uint64_t)jarg2; + arg3 = (uint64_t)jarg3; + result = (int)zts_get_6plane_addr(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_rfc4193_addr(void * jarg1, unsigned long long jarg2, unsigned long long jarg3) { - int jresult ; - zts_sockaddr_storage *arg1 = (zts_sockaddr_storage *) 0 ; - uint64_t arg2 ; - uint64_t arg3 ; - int result; + int jresult; + zts_sockaddr_storage *arg1 = (zts_sockaddr_storage *) 0; + uint64_t arg2; + uint64_t arg3; + int result; - arg1 = (zts_sockaddr_storage *)jarg1; - arg2 = (uint64_t)jarg2; - arg3 = (uint64_t)jarg3; - result = (int)zts_get_rfc4193_addr(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (zts_sockaddr_storage *)jarg1; + arg2 = (uint64_t)jarg2; + arg3 = (uint64_t)jarg3; + result = (int)zts_get_rfc4193_addr(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT unsigned long long SWIGSTDCALL CSharp_zts_generate_adhoc_nwid_from_range(unsigned short jarg1, unsigned short jarg2) { - unsigned long long jresult ; - uint16_t arg1 ; - uint16_t arg2 ; - uint64_t result; + unsigned long long jresult; + uint16_t arg1; + uint16_t arg2; + uint64_t result; - arg1 = (uint16_t)jarg1; - arg2 = (uint16_t)jarg2; - result = zts_generate_adhoc_nwid_from_range(arg1,arg2); - jresult = result; - return jresult; + arg1 = (uint16_t)jarg1; + arg2 = (uint16_t)jarg2; + result = zts_generate_adhoc_nwid_from_range(arg1,arg2); + jresult = result; + return jresult; } SWIGEXPORT void SWIGSTDCALL CSharp_zts_delay_ms(long jarg1) { - long arg1 ; + long arg1; - arg1 = (long)jarg1; - zts_delay_ms(arg1); + arg1 = (long)jarg1; + zts_delay_ms(arg1); } /* SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_all_stats(void * jarg1) { - int jresult ; - zts_stats *arg1 = (zts_stats *) 0 ; - int result; + int jresult; + zts_stats *arg1 = (zts_stats *) 0; + int result; - arg1 = (zts_stats *)jarg1; - result = (int)zts_get_all_stats(arg1); - jresult = result; - return jresult; + arg1 = (zts_stats *)jarg1; + result = (int)zts_get_all_stats(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_protocol_stats(int jarg1, void * jarg2) { - int jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - int result; + int jresult; + int arg1; + void *arg2 = (void *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - result = (int)zts_get_protocol_stats(arg1,arg2); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + result = (int)zts_get_protocol_stats(arg1,arg2); + jresult = result; + return jresult; } */ SWIGEXPORT int SWIGSTDCALL CSharp_zts_socket(int jarg1, int jarg2, int jarg3) { - int jresult ; - int arg1 ; - int arg2 ; - int arg3 ; - int result; + int jresult; + int arg1; + int arg2; + int arg3; + int result; - arg1 = (int)jarg1; - arg2 = (int)jarg2; - arg3 = (int)jarg3; - result = (int)zts_socket(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + result = (int)zts_socket(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_connect(int jarg1, zts_sockaddr* jarg2, unsigned short jarg3) { - int jresult ; - int arg1 ; - zts_sockaddr *arg2 = (zts_sockaddr *) 0 ; - zts_socklen_t arg3 ; - int result; + int jresult; + int arg1; + zts_sockaddr *arg2 = (zts_sockaddr *) 0; + zts_socklen_t arg3; + int result; - arg1 = (int)jarg1; - arg2 = (zts_sockaddr *)jarg2; - arg3 = (zts_socklen_t)jarg3; - result = (int)zts_connect(arg1,(zts_sockaddr const *)arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_sockaddr *)jarg2; + arg3 = (zts_socklen_t)jarg3; + result = (int)zts_connect(arg1,(zts_sockaddr const *)arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_connect_easy(int jarg1, int jarg2, char* jarg3, unsigned short jarg4, int jarg5) { + int jresult; + int result; + result = (int)zts_connect_easy(jarg1,jarg2,jarg3,jarg4,jarg5); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_bind(int jarg1, zts_sockaddr* jarg2, unsigned short jarg3) { - int jresult ; - int arg1 ; - zts_sockaddr *arg2 = (zts_sockaddr *) 0 ; - zts_socklen_t arg3 ; - int result; + int jresult; + int arg1; + zts_sockaddr *arg2 = (zts_sockaddr *) 0; + zts_socklen_t arg3; + int result; - arg1 = (int)jarg1; - arg2 = (zts_sockaddr *)jarg2; - arg3 = (zts_socklen_t)jarg3; - result = (int)zts_bind(arg1,(zts_sockaddr const *)arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_sockaddr *)jarg2; + arg3 = (zts_socklen_t)jarg3; + result = (int)zts_bind(arg1,(zts_sockaddr const *)arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_bind_easy(int jarg1, int jarg2, char* jarg3, unsigned short jarg4) { + int jresult; + int result; + result = (int)zts_bind_easy(jarg1,jarg2,jarg3,jarg4); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_listen(int jarg1, int jarg2) { - int jresult ; - int arg1 ; - int arg2 ; - int result; + int jresult; + int arg1; + int arg2; + int result; - arg1 = (int)jarg1; - arg2 = (int)jarg2; - result = (int)zts_listen(arg1,arg2); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_listen(arg1,arg2); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_accept(int jarg1, zts_sockaddr* jarg2, int * jarg3) { - int jresult ; - int arg1 ; - zts_sockaddr *arg2 = (zts_sockaddr *) 0 ; - zts_socklen_t *arg3 = (zts_socklen_t *) 0 ; - int result; + int jresult; + int arg1; + zts_sockaddr *arg2 = (zts_sockaddr *) 0; + zts_socklen_t *arg3 = (zts_socklen_t *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (zts_sockaddr *)jarg2; - arg3 = (zts_socklen_t *)jarg3; - result = (int)zts_accept(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_sockaddr *)jarg2; + arg3 = (zts_socklen_t *)jarg3; + result = (int)zts_accept(arg1,arg2,arg3); + jresult = result; + return jresult; } +SWIGEXPORT int SWIGSTDCALL CSharp_zts_accept_easy(int jarg1, char* remoteAddrStr, int jarg2, int *jarg3) +{ + return zts_accept_easy(jarg1, remoteAddrStr, jarg2, jarg3); +} SWIGEXPORT int SWIGSTDCALL CSharp_zts_setsockopt(int jarg1, int jarg2, int jarg3, void * jarg4, unsigned short jarg5) { - int jresult ; - int arg1 ; - int arg2 ; - int arg3 ; - void *arg4 = (void *) 0 ; - zts_socklen_t arg5 ; - int result; + int jresult; + int arg1; + int arg2; + int arg3; + void *arg4 = (void *) 0; + zts_socklen_t arg5; + int result; - arg1 = (int)jarg1; - arg2 = (int)jarg2; - arg3 = (int)jarg3; - arg4 = (void *)jarg4; - arg5 = (zts_socklen_t)jarg5; - result = (int)zts_setsockopt(arg1,arg2,arg3,(void const *)arg4,arg5); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + arg4 = (void *)jarg4; + arg5 = (zts_socklen_t)jarg5; + result = (int)zts_setsockopt(arg1,arg2,arg3,(void const *)arg4,arg5); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_getsockopt(int jarg1, int jarg2, int jarg3, void * jarg4, void * jarg5) { - int jresult ; - int arg1 ; - int arg2 ; - int arg3 ; - void *arg4 = (void *) 0 ; - zts_socklen_t *arg5 = (zts_socklen_t *) 0 ; - int result; + int jresult; + int arg1; + int arg2; + int arg3; + void *arg4 = (void *) 0; + zts_socklen_t *arg5 = (zts_socklen_t *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (int)jarg2; - arg3 = (int)jarg3; - arg4 = (void *)jarg4; - arg5 = (zts_socklen_t *)jarg5; - result = (int)zts_getsockopt(arg1,arg2,arg3,arg4,arg5); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + arg4 = (void *)jarg4; + arg5 = (zts_socklen_t *)jarg5; + result = (int)zts_getsockopt(arg1,arg2,arg3,arg4,arg5); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_getsockname(int jarg1, zts_sockaddr* jarg2, void * jarg3) { - int jresult ; - int arg1 ; - zts_sockaddr *arg2 = (zts_sockaddr *) 0 ; - zts_socklen_t *arg3 = (zts_socklen_t *) 0 ; - int result; + int jresult; + int arg1; + zts_sockaddr *arg2 = (zts_sockaddr *) 0; + zts_socklen_t *arg3 = (zts_socklen_t *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (zts_sockaddr *)jarg2; - arg3 = (zts_socklen_t *)jarg3; - result = (int)zts_getsockname(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_sockaddr *)jarg2; + arg3 = (zts_socklen_t *)jarg3; + result = (int)zts_getsockname(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_getpeername(int jarg1, zts_sockaddr* jarg2, void * jarg3) { - int jresult ; - int arg1 ; - zts_sockaddr *arg2 = (zts_sockaddr *) 0 ; - zts_socklen_t *arg3 = (zts_socklen_t *) 0 ; - int result; + int jresult; + int arg1; + zts_sockaddr *arg2 = (zts_sockaddr *) 0; + zts_socklen_t *arg3 = (zts_socklen_t *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (zts_sockaddr *)jarg2; - arg3 = (zts_socklen_t *)jarg3; - result = (int)zts_getpeername(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_sockaddr *)jarg2; + arg3 = (zts_socklen_t *)jarg3; + result = (int)zts_getpeername(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_close(int jarg1) { - int jresult ; - int arg1 ; - int result; + int jresult; + int arg1; + int result; - arg1 = (int)jarg1; - result = (int)zts_close(arg1); - jresult = result; - return jresult; + arg1 = (int)jarg1; + result = (int)zts_close(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_select(int jarg1, void * jarg2, void * jarg3, void * jarg4, void * jarg5) { - int jresult ; - int arg1 ; - zts_fd_set *arg2 = (zts_fd_set *) 0 ; - zts_fd_set *arg3 = (zts_fd_set *) 0 ; - zts_fd_set *arg4 = (zts_fd_set *) 0 ; - zts_timeval *arg5 = (zts_timeval *) 0 ; - int result; + int jresult; + int arg1; + zts_fd_set *arg2 = (zts_fd_set *) 0; + zts_fd_set *arg3 = (zts_fd_set *) 0; + zts_fd_set *arg4 = (zts_fd_set *) 0; + zts_timeval *arg5 = (zts_timeval *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (zts_fd_set *)jarg2; - arg3 = (zts_fd_set *)jarg3; - arg4 = (zts_fd_set *)jarg4; - arg5 = (zts_timeval *)jarg5; - result = (int)zts_select(arg1,arg2,arg3,arg4,arg5); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_fd_set *)jarg2; + arg3 = (zts_fd_set *)jarg3; + arg4 = (zts_fd_set *)jarg4; + arg5 = (zts_timeval *)jarg5; + result = (int)zts_select(arg1,arg2,arg3,arg4,arg5); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_fcntl(int jarg1, int jarg2, int jarg3) { - int jresult ; - int arg1 ; - int arg2 ; - int arg3 ; - int result; + int jresult; + int arg1; + int arg2; + int arg3; + int result; - arg1 = (int)jarg1; - arg2 = (int)jarg2; - arg3 = (int)jarg3; - result = (int)zts_fcntl(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + result = (int)zts_fcntl(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_poll(void * jarg1, unsigned int jarg2, int jarg3) { - int jresult ; - zts_pollfd *arg1 = (zts_pollfd *) 0 ; - zts_nfds_t arg2 ; - int arg3 ; - int result; + int jresult; + zts_pollfd *arg1 = (zts_pollfd *) 0; + zts_nfds_t arg2; + int arg3; + int result; - arg1 = (zts_pollfd *)jarg1; - arg2 = (zts_nfds_t)jarg2; - arg3 = (int)jarg3; - result = (int)zts_poll(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (zts_pollfd *)jarg1; + arg2 = (zts_nfds_t)jarg2; + arg3 = (int)jarg3; + result = (int)zts_poll(arg1,arg2,arg3); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_ioctl(int jarg1, unsigned long jarg2, void * jarg3) { - int jresult ; - int arg1 ; - unsigned long arg2 ; - void *arg3 = (void *) 0 ; - int result; + int jresult; + int arg1; + unsigned long arg2; + void *arg3 = (void *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (unsigned long)jarg2; - arg3 = (void *)jarg3; - result = (int)zts_ioctl(arg1,arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (unsigned long)jarg2; + arg3 = (void *)jarg3; + result = (int)zts_ioctl(arg1,arg2,arg3); + jresult = result; + return jresult; +} + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_send(int jarg1, void * jarg2, unsigned long jarg3, int jarg4) { + int arg1; + void *arg2 = (void *) 0; + size_t arg3; + int arg4; + ssize_t result; + + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (size_t)jarg3; + arg4 = (int)jarg4; + result = zts_send(arg1,(void const *)arg2,arg3,arg4); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_send(int jarg1, void * jarg2, unsigned long jarg3, int jarg4) { - void * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - size_t arg3 ; - int arg4 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_sendto(int jarg1, void * jarg2, unsigned long jarg3, int jarg4, zts_sockaddr* jarg5, unsigned short jarg6) { + int arg1; + void *arg2 = (void *) 0; + size_t arg3; + int arg4; + zts_sockaddr *arg5 = (zts_sockaddr *) 0; + zts_socklen_t arg6; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (size_t)jarg3; - arg4 = (int)jarg4; - result = zts_send(arg1,(void const *)arg2,arg3,arg4); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (size_t)jarg3; + arg4 = (int)jarg4; + arg5 = (zts_sockaddr *)jarg5; + arg6 = (zts_socklen_t)jarg6; + result = zts_sendto(arg1,(void const *)arg2,arg3,arg4,(zts_sockaddr const *)arg5,arg6); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_sendto(int jarg1, void * jarg2, unsigned long jarg3, int jarg4, zts_sockaddr* jarg5, unsigned short jarg6) { - void * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - size_t arg3 ; - int arg4 ; - zts_sockaddr *arg5 = (zts_sockaddr *) 0 ; - zts_socklen_t arg6 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_sendmsg(int jarg1, void * jarg2, int jarg3) { + int arg1; + zts_msghdr *arg2 = (zts_msghdr *) 0; + int arg3; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (size_t)jarg3; - arg4 = (int)jarg4; - arg5 = (zts_sockaddr *)jarg5; - arg6 = (zts_socklen_t)jarg6; - result = zts_sendto(arg1,(void const *)arg2,arg3,arg4,(zts_sockaddr const *)arg5,arg6); - jresult = new ssize_t((const ssize_t &)result); - return jresult; -} - - -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_sendmsg(int jarg1, void * jarg2, int jarg3) { - void * jresult ; - int arg1 ; - zts_msghdr *arg2 = (zts_msghdr *) 0 ; - int arg3 ; - ssize_t result; - - arg1 = (int)jarg1; - arg2 = (zts_msghdr *)jarg2; - arg3 = (int)jarg3; - result = zts_sendmsg(arg1,(zts_msghdr const *)arg2,arg3); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_msghdr *)jarg2; + arg3 = (int)jarg3; + result = zts_sendmsg(arg1,(zts_msghdr const *)arg2,arg3); + return result; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_recv(int jarg1, void * jarg2, unsigned long jarg3, int jarg4) { - void * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - size_t arg3 ; - int arg4 ; - ssize_t result; + int arg1; + void *arg2 = (void *) 0; + size_t arg3; + int arg4; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (size_t)jarg3; - arg4 = (int)jarg4; - result = zts_recv(arg1,arg2,arg3,arg4); - return result; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (size_t)jarg3; + arg4 = (int)jarg4; + result = zts_recv(arg1,arg2,arg3,arg4); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_recvfrom(int jarg1, void * jarg2, unsigned long jarg3, int jarg4, zts_sockaddr* jarg5, void * jarg6) { - void * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - size_t arg3 ; - int arg4 ; - zts_sockaddr *arg5 = (zts_sockaddr *) 0 ; - zts_socklen_t *arg6 = (zts_socklen_t *) 0 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_recvfrom(int jarg1, void * jarg2, unsigned long jarg3, int jarg4, zts_sockaddr* jarg5, void * jarg6) { + int arg1; + void *arg2 = (void *) 0; + size_t arg3; + int arg4; + zts_sockaddr *arg5 = (zts_sockaddr *) 0; + zts_socklen_t *arg6 = (zts_socklen_t *) 0; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (size_t)jarg3; - arg4 = (int)jarg4; - arg5 = (zts_sockaddr *)jarg5; - arg6 = (zts_socklen_t *)jarg6; - result = zts_recvfrom(arg1,arg2,arg3,arg4,arg5,arg6); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (size_t)jarg3; + arg4 = (int)jarg4; + arg5 = (zts_sockaddr *)jarg5; + arg6 = (zts_socklen_t *)jarg6; + result = zts_recvfrom(arg1,arg2,arg3,arg4,arg5,arg6); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_recvmsg(int jarg1, void * jarg2, int jarg3) { - void * jresult ; - int arg1 ; - zts_msghdr *arg2 = (zts_msghdr *) 0 ; - int arg3 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_recvmsg(int jarg1, void * jarg2, int jarg3) { + int arg1; + zts_msghdr *arg2 = (zts_msghdr *) 0; + int arg3; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (zts_msghdr *)jarg2; - arg3 = (int)jarg3; - result = zts_recvmsg(arg1,arg2,arg3); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_msghdr *)jarg2; + arg3 = (int)jarg3; + result = zts_recvmsg(arg1,arg2,arg3); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_read(int jarg1, void * jarg2, unsigned long jarg3) { - void * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - size_t arg3 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_read(int jarg1, void * jarg2, unsigned long jarg3) { + int arg1; + void *arg2 = (void *) 0; + size_t arg3; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (size_t)jarg3; - result = zts_read(arg1,arg2,arg3); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (size_t)jarg3; + result = zts_read(arg1,arg2,arg3); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_readv(int jarg1, void * jarg2, int jarg3) { - void * jresult ; - int arg1 ; - zts_iovec *arg2 = (zts_iovec *) 0 ; - int arg3 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_readv(int jarg1, void * jarg2, int jarg3) { + int arg1; + zts_iovec *arg2 = (zts_iovec *) 0; + int arg3; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (zts_iovec *)jarg2; - arg3 = (int)jarg3; - result = zts_readv(arg1,(zts_iovec const *)arg2,arg3); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_iovec *)jarg2; + arg3 = (int)jarg3; + result = zts_readv(arg1,(zts_iovec const *)arg2,arg3); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_write(int jarg1, void * jarg2, unsigned long jarg3) { - void * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - size_t arg3 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_write(int jarg1, void * jarg2, unsigned long jarg3) { + int arg1; + void *arg2 = (void *) 0; + size_t arg3; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (size_t)jarg3; - result = zts_write(arg1,(void const *)arg2,arg3); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (size_t)jarg3; + result = zts_write(arg1,(void const *)arg2,arg3); + return result; } -SWIGEXPORT void * SWIGSTDCALL CSharp_zts_writev(int jarg1, void * jarg2, int jarg3) { - void * jresult ; - int arg1 ; - zts_iovec *arg2 = (zts_iovec *) 0 ; - int arg3 ; - ssize_t result; +SWIGEXPORT int SWIGSTDCALL CSharp_zts_writev(int jarg1, void * jarg2, int jarg3) { + int arg1; + zts_iovec *arg2 = (zts_iovec *) 0; + int arg3; + ssize_t result; - arg1 = (int)jarg1; - arg2 = (zts_iovec *)jarg2; - arg3 = (int)jarg3; - result = zts_writev(arg1,(zts_iovec const *)arg2,arg3); - jresult = new ssize_t((const ssize_t &)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (zts_iovec *)jarg2; + arg3 = (int)jarg3; + result = zts_writev(arg1,(zts_iovec const *)arg2,arg3); + return result; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_shutdown(int jarg1, int jarg2) { - int jresult ; - int arg1 ; - int arg2 ; - int result; + int jresult; + int arg1; + int arg2; + int result; - arg1 = (int)jarg1; - arg2 = (int)jarg2; - result = (int)zts_shutdown(arg1,arg2); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_shutdown(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_no_delay(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_no_delay(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_no_delay(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_no_delay(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_linger(int jarg1, int jarg2, int jarg3) { + int jresult; + int arg1; + int arg2; + int arg3; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + result = (int)zts_set_linger(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_linger_enabled(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_linger_enabled(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_linger_value(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_linger_value(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_reuse_addr(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_reuse_addr(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_reuse_addr(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_reuse_addr(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_recv_timeout(int jarg1, int jarg2, int jarg3) { + int jresult; + int arg1; + int arg2; + int arg3; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + result = (int)zts_set_recv_timeout(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_recv_timeout(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_recv_timeout(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_send_timeout(int jarg1, int jarg2, int jarg3) { + int jresult; + int arg1; + int arg2; + int arg3; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + result = (int)zts_set_send_timeout(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_send_timeout(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_send_timeout(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_send_buf_size(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_send_buf_size(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_send_buf_size(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_send_buf_size(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_recv_buf_size(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_recv_buf_size(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_recv_buf_size(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_recv_buf_size(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_ttl(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_ttl(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_ttl(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_ttl(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_blocking(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_blocking(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_blocking(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_blocking(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_set_keepalive(int jarg1, int jarg2) { + int jresult; + int arg1; + int arg2; + int result; + + arg1 = (int)jarg1; + arg2 = (int)jarg2; + result = (int)zts_set_keepalive(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_zts_get_keepalive(int jarg1) { + int jresult; + int arg1; + int result; + + arg1 = (int)jarg1; + result = (int)zts_get_keepalive(arg1); + jresult = result; + return jresult; } /* SWIGEXPORT int SWIGSTDCALL CSharp_zts_dns_set_server(zts_sockaddr* jarg1) { - int jresult ; - zts_sockaddr *arg1 = (zts_sockaddr *) 0 ; - int result; + int jresult; + zts_sockaddr *arg1 = (zts_sockaddr *) 0; + int result; - arg1 = (zts_sockaddr *)jarg1; - result = (int)zts_add_dns_nameserver(arg1); - jresult = result; - return jresult; + arg1 = (zts_sockaddr *)jarg1; + result = (int)zts_add_dns_nameserver(arg1); + jresult = result; + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_dns_get_server(zts_sockaddr* jarg1) { - int jresult ; - zts_sockaddr *arg1 = (zts_sockaddr *) 0 ; - int result; + int jresult; + zts_sockaddr *arg1 = (zts_sockaddr *) 0; + int result; - arg1 = (zts_sockaddr *)jarg1; - result = (int)zts_del_dns_nameserver(arg1); - jresult = result; - return jresult; + arg1 = (zts_sockaddr *)jarg1; + result = (int)zts_del_dns_nameserver(arg1); + jresult = result; + return jresult; } */ SWIGEXPORT char * SWIGSTDCALL CSharp_zts_inet_ntop(int jarg1, void * jarg2, char * jarg3, unsigned short jarg4) { - char * jresult ; - int arg1 ; - void *arg2 = (void *) 0 ; - char *arg3 = (char *) 0 ; - zts_socklen_t arg4 ; - char *result = 0 ; + char * jresult; + int arg1; + void *arg2 = (void *) 0; + char *arg3 = (char *) 0; + zts_socklen_t arg4; + char *result = 0; - arg1 = (int)jarg1; - arg2 = (void *)jarg2; - arg3 = (char *)jarg3; - arg4 = (zts_socklen_t)jarg4; - result = (char *)zts_inet_ntop(arg1,(void const *)arg2,arg3,arg4); - jresult = SWIG_csharp_string_callback((const char *)result); - return jresult; + arg1 = (int)jarg1; + arg2 = (void *)jarg2; + arg3 = (char *)jarg3; + arg4 = (zts_socklen_t)jarg4; + result = (char *)zts_inet_ntop(arg1,(void const *)arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; } SWIGEXPORT int SWIGSTDCALL CSharp_zts_inet_pton(int jarg1, char * jarg2, void * jarg3) { - int jresult ; - int arg1 ; - char *arg2 = (char *) 0 ; - void *arg3 = (void *) 0 ; - int result; + int jresult; + int arg1; + char *arg2 = (char *) 0; + void *arg3 = (void *) 0; + int result; - arg1 = (int)jarg1; - arg2 = (char *)jarg2; - arg3 = (void *)jarg3; - result = (int)zts_inet_pton(arg1,(char const *)arg2,arg3); - jresult = result; - return jresult; + arg1 = (int)jarg1; + arg2 = (char *)jarg2; + arg3 = (void *)jarg3; + result = (int)zts_inet_pton(arg1,(char const *)arg2,arg3); + jresult = result; + return jresult; } #ifdef __cplusplus diff --git a/test/selftest-c-api.c b/test/selftest-c-api.c index 9d7ce68..c70857f 100644 --- a/test/selftest-c-api.c +++ b/test/selftest-c-api.c @@ -426,16 +426,6 @@ void test_service() assert(res == ZTS_ERR_OK); assert(res == 0); -//----------------------------------------------------------------------------// -// Test *_easy API // -//----------------------------------------------------------------------------// - - //zts_connect_easy(0, ZTS_AF_INET, "192.168.7.9", 7878); - //zts_connect_easy(0, ZTS_AF_INET6, "FCC5:205E:4FF5:5311:DFF0::1", 7878); - //res = zts_bind_easy(0, ZTS_AF_INET6, "::", 8080); - //fprintf(stderr, "res=%d, zts_errno=%d\n", res, zts_errno); - //zts_delay_ms(60000); - //----------------------------------------------------------------------------// // Test DNS client functionality // //----------------------------------------------------------------------------// @@ -486,7 +476,8 @@ void test_service() // Server // //----------------------------------------------------------------------------// -#define MAX_CONNECT_TIME 60 +#define MAX_CONNECT_TIME 60 // outer re-attempt loop +#define CONNECT_TIMEOUT 30 // zts_connect_easy, ms #define BUFLEN 128 char *msg = "welcome to the machine"; @@ -549,6 +540,13 @@ void start_server_app(uint16_t port4, uint16_t port6) zts_close(acc4); assert(err == ZTS_ERR_OK && zts_errno == 0); + assert(bytes_sent == bytes_read); + if (bytes_sent == bytes_read) { + fprintf(stderr, "server4: Test OK\n"); + } else { + fprintf(stderr, "server4: Test FAIL\n"); + } + // // IPv6 test // @@ -600,6 +598,13 @@ void start_server_app(uint16_t port4, uint16_t port6) assert(err == ZTS_ERR_OK && zts_errno == 0); int s = zts_socket(ZTS_AF_INET, ZTS_SOCK_STREAM, 0); assert(("s != ZTS_ERR_SERVICE, not shut down", s == ZTS_ERR_SERVICE)); + + assert(bytes_sent == bytes_read); + if (bytes_sent == bytes_read) { + fprintf(stderr, "server6: Test OK\n"); + } else { + fprintf(stderr, "server6: Test FAIL\n"); + } } //----------------------------------------------------------------------------// @@ -633,7 +638,7 @@ void start_client_app(char *ip4, uint16_t port4, char *ip6, uint16_t port6) clock_gettime(CLOCK_MONOTONIC, &start); do { fprintf(stderr, "client4: connecting to: %s:%d\n", ip4, port4); - err = zts_connect_easy(s4, ZTS_AF_INET, ip4, port4); + err = zts_connect_easy(s4, ZTS_AF_INET, ip4, port4, CONNECT_TIMEOUT); zts_delay_ms(500); clock_gettime(CLOCK_MONOTONIC, &now); time_diff = (now.tv_sec - start.tv_sec); @@ -657,6 +662,13 @@ void start_client_app(char *ip4, uint16_t port4, char *ip6, uint16_t port6) zts_close(s4); assert(err == ZTS_ERR_OK && zts_errno == 0); + assert(bytes_sent == bytes_read); + if (bytes_sent == bytes_read) { + fprintf(stderr, "client4: Test OK\n"); + } else { + fprintf(stderr, "client4: Test FAIL\n"); + } + // // IPv6 test // @@ -671,7 +683,7 @@ void start_client_app(char *ip4, uint16_t port4, char *ip6, uint16_t port6) clock_gettime(CLOCK_MONOTONIC, &start); do { fprintf(stderr, "client6: connecting to: %s:%d\n", ip6, port6); - err = zts_connect_easy(s6, ZTS_AF_INET6, ip6, port6); + err = zts_connect_easy(s6, ZTS_AF_INET6, ip6, port6, CONNECT_TIMEOUT); zts_delay_ms(500); clock_gettime(CLOCK_MONOTONIC, &now); time_diff = (now.tv_sec - start.tv_sec); @@ -699,6 +711,13 @@ void start_client_app(char *ip4, uint16_t port4, char *ip6, uint16_t port6) assert(err == ZTS_ERR_OK && zts_errno == 0); int s = zts_socket(ZTS_AF_INET, ZTS_SOCK_STREAM, 0); assert(("s != ZTS_ERR_SERVICE, not shut down", s == ZTS_ERR_SERVICE)); + + assert(bytes_sent == bytes_read); + if (bytes_sent == bytes_read) { + fprintf(stderr, "client6: Test OK\n"); + } else { + fprintf(stderr, "client6: Test FAIL\n"); + } } //----------------------------------------------------------------------------//