diff --git a/include/ZeroTierSockets.h b/include/ZeroTierSockets.h index e95163a..8f95c8d 100644 --- a/include/ZeroTierSockets.h +++ b/include/ZeroTierSockets.h @@ -20,6 +20,21 @@ #ifndef ZT_SOCKETS_H #define ZT_SOCKETS_H +////////////////////////////////////////////////////////////////////////////// +// Configuration Options // +////////////////////////////////////////////////////////////////////////////// + +#ifdef ZTS_ENABLE_PYTHON + /* In some situations (Python comes to mind) a signal may not make its + way to libzt, for this reason we make sure to define a custom signal handler + that can at least process SIGTERMs */ + #define ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS 1 +#endif + +#if !defined(ZTS_ENABLE_PYTHON) && !defined(ZTS_ENABLE_PINVOKE) +#define ZTS_C_API_ONLY 1 +#endif + #if !ZTS_NO_STDINT_H #include #endif @@ -39,7 +54,7 @@ extern "C" { #endif -#ifdef ZTS_PINVOKE +#ifdef ZTS_ENABLE_PINVOKE // Used by P/INVOKE wrappers typedef void (*CppCallback)(void *msg); #endif @@ -735,9 +750,6 @@ struct zts_network_details } multicastSubscriptions[ZTS_MAX_MULTICAST_SUBSCRIPTIONS]; }; - - - /** * Physical network path to a peer */ @@ -829,6 +841,94 @@ struct zts_peer_list unsigned long peerCount; }; +////////////////////////////////////////////////////////////////////////////// +// Python bits // +////////////////////////////////////////////////////////////////////////////// + +#ifdef ZTS_ENABLE_PYTHON + +#include "Python.h" + +/** + * Abstract class used as a director. Pointer to an instance of this class + * is provided to the Python layer. + * + * See: https://rawgit.com/swig/swig/master/Doc/Manual/SWIGPlus.html#SWIGPlus_target_language_callbacks + */ +class PythonDirectorCallbackClass +{ +public: + /** + * Called by native code on event. Implemented in Python + */ + virtual void on_zerotier_event(struct zts_callback_msg *msg); + virtual ~PythonDirectorCallbackClass() {}; +}; + +extern PythonDirectorCallbackClass *_userEventCallback; + +/** + * @brief + * + * @param fd + * @param + * @param + * @param + * + * @return + */ +int zts_sock_bind(int fd, int family, int type, PyObject *addro); + +/** + * @brief + * + * @param fd + * @param + * @param + * @param + * + * @return + */ +int zts_sock_connect(int fd, int family, int type, PyObject *addro); + +/** + * @brief + * + * @param fd + * @param + * @param + * @param + * + * @return + */ +PyObject * zts_sock_accept(int fd); + +/** + * @brief + * + * @param fd + * @param + * @param + * @param + * + * @return + */ +PyObject * zts_sock_recv(int fd, int len, int flags); + +/** + * @brief + * + * @param fd + * @param + * @param + * @param + * + * @return + */ +int zts_sock_send(int fd, PyObject *buf, int len, int flags); + +#endif + ////////////////////////////////////////////////////////////////////////////// // ZeroTier Service Controls // ////////////////////////////////////////////////////////////////////////////// @@ -849,7 +949,7 @@ struct zts_peer_list // Central API // ////////////////////////////////////////////////////////////////////////////// -#ifndef NO_CENTRAL_API +#ifdef ZTS_ENABLE_CENTRAL_API #define CENTRAL_API_DEFAULT_URL "https://my.zerotier.com" #define CENRTAL_API_MAX_URL_LEN 128 @@ -1032,12 +1132,17 @@ ZTS_API int ZTCALL zts_get_node_identity(char *key_pair_str, uint16_t *key_buf_l * @param port Port that the library should use for talking to other ZeroTier nodes * @return ZTS_ERR_OK on success. ZTS_ERR_SERVICE or ZTS_ERR_ARG on failure */ -#ifdef ZTS_PINVOKE - ZTS_API int ZTCALL zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, - CppCallback callback, uint16_t port); -#else - ZTS_API int ZTCALL zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, - void (*callback)(void *), uint16_t port); +#ifdef ZTS_ENABLE_PYTHON +int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, + PythonDirectorCallbackClass *callback, uint16_t port); +#endif +#ifdef ZTS_ENABLE_PINVOKE +int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, + CppCallback callback, uint16_t port); +#endif +#ifdef ZTS_C_API_ONLY +int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, + void (*callback)(void *), uint16_t port); #endif /** @@ -1100,9 +1205,13 @@ ZTS_API int ZTCALL zts_disable_local_storage(uint8_t disabled); * @param port Port that the library should use for talking to other ZeroTier nodes * @return ZTS_ERR_OK on success. ZTS_ERR_SERVICE or ZTS_ERR_ARG on failure */ -#ifdef ZTS_PINVOKE +#ifdef ZTS_ENABLE_PYTHON + ZTS_API int ZTCALL zts_start(const char *path, PythonDirectorCallbackClass *callback, uint16_t port); +#endif +#ifdef ZTS_ENABLE_PINVOKE ZTS_API int ZTCALL zts_start(const char *path, CppCallback callback, uint16_t port); -#else +#endif +#ifdef ZTS_C_API_ONLY ZTS_API int ZTCALL zts_start(const char *path, void (*callback)(void *), uint16_t port); #endif @@ -1234,6 +1343,8 @@ ZTS_API void ZTCALL zts_delay_ms(long interval_ms); // Statistics // ////////////////////////////////////////////////////////////////////////////// +#ifdef ZTS_ENABLE_STATS + #define ZTS_STATS_PROTOCOL_LINK 0 #define ZTS_STATS_PROTOCOL_ETHARP 1 #define ZTS_STATS_PROTOCOL_IP 2 @@ -1325,6 +1436,8 @@ struct zts_stats { struct zts_stats_proto nd6; }; +#endif + /** * @brief Return all statistical counters for all protocols (inefficient) * diff --git a/src/Central.cpp b/src/Central.cpp index e43ed53..e06f6ab 100644 --- a/src/Central.cpp +++ b/src/Central.cpp @@ -14,7 +14,7 @@ #ifndef ZT_CENTRAL_H #define ZT_CENTRAL_H -#ifdef CENTRAL_API +#ifdef ZTS_ENABLE_CENTRAL_API #include #include diff --git a/src/Controls.cpp b/src/Controls.cpp index fc62ca7..d358409 100644 --- a/src/Controls.cpp +++ b/src/Controls.cpp @@ -25,15 +25,16 @@ #include "Mutex.hpp" #include "OSUtils.hpp" +#include "ZeroTierSockets.h" #include "Debug.hpp" #include "NodeService.hpp" #include "VirtualTap.hpp" #include "Events.hpp" -#include "ZeroTierSockets.h" +#include "Signals.hpp" using namespace ZeroTier; -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #include #endif @@ -46,13 +47,20 @@ namespace ZeroTier { extern NodeService *service; extern Mutex serviceLock; - extern void (*_userEventCallbackFunc)(void *); +#ifdef ZTS_ENABLE_PYTHON + +#endif +#ifdef ZTS_ENABLE_PINVOKE + extern void (*_userEventCallback)(void *); +#endif +#ifdef ZTS_C_API_ONLY + extern void (*_userEventCallback)(void *); +#endif extern uint8_t allowNetworkCaching; extern uint8_t allowPeerCaching; extern uint8_t allowLocalConf; extern uint8_t disableLocalStorage; // Off by default - -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA // References to JNI objects and VM kept for future callbacks JavaVM *jvm = NULL; jobject objRef = NULL; @@ -110,10 +118,15 @@ int zts_get_node_identity(char *key_pair_str, uint16_t *key_buf_len) } // TODO: This logic should be further generalized in the next API redesign -#ifdef ZTS_PINVOKE +#ifdef ZTS_ENABLE_PYTHON +int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, + PythonDirectorCallbackClass *callback, uint16_t port) +#endif +#ifdef ZTS_ENABLE_PINVOKE int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, CppCallback callback, uint16_t port) -#else +#endif +#ifdef ZTS_C_API_ONLY int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, void (*callback)(void *), uint16_t port) #endif @@ -122,6 +135,9 @@ int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, return ZTS_ERR_ARG; } Mutex::Lock _l(serviceLock); +//#ifdef ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS + _install_signal_handlers(); +//#endif // ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS _lwip_driver_init(); if (service || _getState(ZTS_STATE_NODE_RUNNING)) { // Service is already initialized @@ -132,11 +148,7 @@ int zts_start_with_identity(const char *key_pair_str, uint16_t key_buf_len, // an application restart is required now return ZTS_ERR_SERVICE; } - #ifdef SDK_JNI - _userEventCallbackFunc = callback; -#else - _userEventCallbackFunc = callback; -#endif + _userEventCallback = callback; if (!_isCallbackRegistered()) { // Must have a callback return ZTS_ERR_ARG; @@ -231,13 +243,20 @@ int zts_disable_local_storage(uint8_t disabled) return ZTS_ERR_SERVICE; } -#ifdef ZTS_PINVOKE +#ifdef ZTS_ENABLE_PYTHON +int zts_start(const char *path, PythonDirectorCallbackClass *callback, uint16_t port) +#endif +#ifdef ZTS_ENABLE_PINVOKE int zts_start(const char *path, CppCallback callback, uint16_t port) -#else +#endif +#ifdef ZTS_C_API_ONLY int zts_start(const char *path, void (*callback)(void *), uint16_t port) #endif { Mutex::Lock _l(serviceLock); +//#ifdef ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS + _install_signal_handlers(); +//#endif // ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS _lwip_driver_init(); if (service || _getState(ZTS_STATE_NODE_RUNNING)) { // Service is already initialized @@ -248,11 +267,7 @@ int zts_start(const char *path, void (*callback)(void *), uint16_t port) // an application restart is required now return ZTS_ERR_SERVICE; } -#ifdef SDK_JNI - _userEventCallbackFunc = callback; -#else - _userEventCallbackFunc = callback; -#endif + _userEventCallback = callback; if (!_isCallbackRegistered()) { // Must have a callback return ZTS_ERR_ARG; @@ -300,7 +315,7 @@ int zts_start(const char *path, void (*callback)(void *), uint16_t port) return retval; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_start( JNIEnv *env, jobject thisObj, jstring path, jobject callback, jint port) { @@ -344,7 +359,7 @@ int zts_stop() } return ZTS_ERR_SERVICE; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT void JNICALL Java_com_zerotier_libzt_ZeroTier_stop( JNIEnv *env, jobject thisObj) { @@ -357,11 +372,8 @@ int zts_restart() { serviceLock.lock(); // Store callback references -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA static jmethodID _tmpUserCallbackMethodRef = _userCallbackMethodRef; -#else - void (*_tmpUserEventCallbackFunc)(void *); - _tmpUserEventCallbackFunc = _userEventCallbackFunc; #endif int userProvidedPort = 0; std::string userProvidedPath; @@ -388,15 +400,14 @@ int zts_restart() } /* Some of the logic in Java_com_zerotier_libzt_ZeroTier_start is replicated here */ -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA _userCallbackMethodRef = _tmpUserCallbackMethodRef; return zts_start(userProvidedPath.c_str(), NULL, userProvidedPort); #else - return ZTS_ERR_OK; - //return zts_start(userProvidedPath.c_str(), _tmpUserEventCallbackFunc, userProvidedPort); + return ZTS_ERR_OK; #endif } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT void JNICALL Java_com_zerotier_libzt_ZeroTier_restart( JNIEnv *env, jobject thisObj) { @@ -415,7 +426,7 @@ int zts_free() _lwip_driver_shutdown(); return err; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT void JNICALL Java_com_zerotier_libzt_ZeroTier_free( JNIEnv *env, jobject thisObj) { @@ -423,7 +434,7 @@ JNIEXPORT void JNICALL Java_com_zerotier_libzt_ZeroTier_free( } #endif -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA /* * Called from Java, saves a static reference to the VM so it can be used * later to call a user-specified callback method from C. @@ -431,7 +442,7 @@ JNIEXPORT void JNICALL Java_com_zerotier_libzt_ZeroTier_free( JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_init( JNIEnv *env, jobject thisObj) { - jint rs = env->GetJavaVM(&jvm); + jint rs = env->GetJavaVM(&jvm); return rs != JNI_OK ? ZTS_ERR_GENERAL : ZTS_ERR_OK; } #endif @@ -447,7 +458,7 @@ int zts_join(const uint64_t networkId) } return ZTS_ERR_OK; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_join( JNIEnv *env, jobject thisObj, jlong networkId) { @@ -466,7 +477,7 @@ int zts_leave(const uint64_t networkId) } return ZTS_ERR_OK; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_leave( JNIEnv *env, jobject thisObj, jlong networkId) { @@ -485,7 +496,7 @@ int zts_orbit(uint64_t moonWorldId, uint64_t moonSeed) } return ZTS_ERR_OK; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #endif int zts_deorbit(uint64_t moonWorldId) @@ -499,7 +510,7 @@ int zts_deorbit(uint64_t moonWorldId) } return ZTS_ERR_OK; } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #endif int zts_get_6plane_addr(struct zts_sockaddr_storage *addr, const uint64_t networkId, const uint64_t nodeId) @@ -542,14 +553,14 @@ uint64_t zts_generate_adhoc_nwid_from_range(uint16_t startPortOfRange, uint16_t void zts_delay_ms(long milliseconds) { #ifdef __WINDOWS__ - Sleep(milliseconds); + Sleep(milliseconds); #elif _POSIX_C_SOURCE >= 199309L - struct timespec ts; - ts.tv_sec = milliseconds / 1000; - ts.tv_nsec = (milliseconds % 1000) * 1000000; - nanosleep(&ts, NULL); + struct timespec ts; + ts.tv_sec = milliseconds / 1000; + ts.tv_nsec = (milliseconds % 1000) * 1000000; + nanosleep(&ts, NULL); #else - usleep(milliseconds * 1000); + usleep(milliseconds * 1000); #endif } diff --git a/src/Events.cpp b/src/Events.cpp index d3f1154..049f9ee 100644 --- a/src/Events.cpp +++ b/src/Events.cpp @@ -19,7 +19,7 @@ #include "concurrentqueue.h" -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #include #endif @@ -40,6 +40,15 @@ #define ROUTE_EVENT_TYPE(code) code >= ZTS_EVENT_ROUTE_ADDED && code <= ZTS_EVENT_ROUTE_REMOVED #define ADDR_EVENT_TYPE(code) code >= ZTS_EVENT_ADDR_ADDED_IP4 && code <= ZTS_EVENT_ADDR_REMOVED_IP6 +#include +#include + +#ifdef ZTS_ENABLE_PYTHON + #include "Python.h" + PythonDirectorCallbackClass *_userEventCallback = NULL; + void PythonDirectorCallbackClass::on_zerotier_event(struct zts_callback_msg *msg) { } +#endif + namespace ZeroTier { extern NodeService *service; @@ -50,7 +59,12 @@ uint8_t _serviceStateFlags; // Lock to guard access to callback function pointers. Mutex _callbackLock; -void (*_userEventCallbackFunc)(void *); +#ifdef ZTS_ENABLE_PINVOKE + void (*_userEventCallback)(void *); +#endif +#ifdef ZTS_C_API_ONLY + void (*_userEventCallback)(void *); +#endif moodycamel::ConcurrentQueue _callbackMsgQueue; @@ -100,7 +114,12 @@ void _freeEvent(struct zts_callback_msg *msg) void _passDequeuedEventToUser(struct zts_callback_msg *msg) { bool bShouldStopCallbackThread = (msg->eventCode == ZTS_EVENT_STACK_DOWN); -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_PYTHON + PyGILState_STATE state = PyGILState_Ensure(); + _userEventCallback->on_zerotier_event(msg); + PyGILState_Release(state); +#endif +#ifdef ZTS_ENABLE_JAVA if(_userCallbackMethodRef) { JNIEnv *env; #if defined(__ANDROID__) @@ -121,14 +140,19 @@ void _passDequeuedEventToUser(struct zts_callback_msg *msg) id = msg->peer ? msg->peer->address : 0; } env->CallVoidMethod(objRef, _userCallbackMethodRef, id, msg->eventCode); - _freeEvent(msg); } -#else - if (_userEventCallbackFunc) { - _userEventCallbackFunc(msg); - _freeEvent(msg); +#endif // ZTS_ENABLE_JAVA +#ifdef ZTS_ENABLE_PINVOKE + if (_userEventCallback) { + _userEventCallback(msg); } #endif +#ifdef ZTS_C_API_ONLY + if (_userEventCallback) { + _userEventCallback(msg); + } +#endif + _freeEvent(msg); if (bShouldStopCallbackThread) { /* Ensure last possible callback ZTS_EVENT_STACK_DOWN is delivered before callback thread is finally stopped. */ @@ -140,10 +164,10 @@ bool _isCallbackRegistered() { _callbackLock.lock(); bool retval = false; -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA retval = (jvm && objRef && _userCallbackMethodRef); #else - retval = _userEventCallbackFunc; + retval = _userEventCallback; #endif _callbackLock.unlock(); return retval; @@ -152,11 +176,11 @@ bool _isCallbackRegistered() void _clearRegisteredCallback() { _callbackLock.lock(); -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA objRef = NULL; _userCallbackMethodRef = NULL; #else - _userEventCallbackFunc = NULL; + _userEventCallback = NULL; #endif _callbackLock.unlock(); } @@ -237,7 +261,7 @@ void *_runCallbacks(void *thread_id) } zts_delay_ms(ZTS_CALLBACK_PROCESSING_INTERVAL); } -#if SDK_JNI +#if ZTS_ENABLE_JAVA JNIEnv *env; jint rs = jvm->DetachCurrentThread(); pthread_exit(0); diff --git a/src/Events.hpp b/src/Events.hpp index fdb9bd7..a0c07ad 100644 --- a/src/Events.hpp +++ b/src/Events.hpp @@ -29,7 +29,7 @@ #include #endif -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #include #endif namespace ZeroTier { @@ -40,7 +40,7 @@ namespace ZeroTier { #define ZTS_STATE_CALLBACKS_RUNNING 0x08 #define ZTS_STATE_FREE_CALLED 0x10 -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA // References to JNI objects and VM kept for future callbacks extern JavaVM *jvm; extern jobject objRef; diff --git a/src/NodeService.cpp b/src/NodeService.cpp index fe237ec..4411afe 100644 --- a/src/NodeService.cpp +++ b/src/NodeService.cpp @@ -51,7 +51,7 @@ #define stat _stat #endif -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #include #endif diff --git a/src/Signals.cpp b/src/Signals.cpp new file mode 100644 index 0000000..8818898 --- /dev/null +++ b/src/Signals.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c)2013-2021 ZeroTier, Inc. + * + * Use of this software is governed by the Business Source License included + * in the LICENSE.TXT file in the project's root directory. + * + * Change Date: 2025-01-01 + * + * On the date above, in accordance with the Business Source License, use + * of this software will be governed by version 2.0 of the Apache License. + */ +/****/ + +/** + * @file + * + * Custom signal handler + */ + +#include "ZeroTierSockets.h" +#include "Signals.hpp" + +#ifdef ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS + +#include +#include +#include + +void _signal_handler(int signal) +{ + /* + switch(signal) + { + case SIGINT: + fprintf(stderr, "SIGINT\n"); + break; + case SIGABRT: + fprintf(stderr, "SIGABRT\n"); + break; + case SIGILL: + fprintf(stderr, "SIGILL\n"); + break; + case SIGSEGV: + fprintf(stderr, "SIGSEGV\n"); + break; + case SIGFPE: + fprintf(stderr, "SIGFPE\n"); + break; + case SIGTERM: + default: + fprintf(stderr, "SIGTERM\n"); + break; + } + */ + exit(signal); +} + +void _install_signal_handlers() +{ + signal(SIGINT, &_signal_handler); + /* + signal(SIGABRT, &_signal_handler); + signal(SIGFPE, &_signal_handler); + signal(SIGILL, &_signal_handler); + signal(SIGSEGV, &_signal_handler); + signal(SIGTERM, &_signal_handler); + */ +} + +#endif diff --git a/src/Signals.hpp b/src/Signals.hpp new file mode 100644 index 0000000..e1151ce --- /dev/null +++ b/src/Signals.hpp @@ -0,0 +1,37 @@ +/* + * Copyright (c)2013-2021 ZeroTier, Inc. + * + * Use of this software is governed by the Business Source License included + * in the LICENSE.TXT file in the project's root directory. + * + * Change Date: 2025-01-01 + * + * On the date above, in accordance with the Business Source License, use + * of this software will be governed by version 2.0 of the Apache License. + */ +/****/ + +/** + * @file + * + * Custom signal handler + */ + +#ifndef SIGNALS_HPP +#define SIGNALS_HPP + +#ifdef ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS + +/** + * + */ +void _signal_handler(int signal); + +/** + * + */ +void _install_signal_handlers(); + +#endif // ZTS_ENABLE_CUSTOM_SIGNAL_HANDLERS + +#endif // _H \ No newline at end of file diff --git a/src/Sockets.cpp b/src/Sockets.cpp index 29c4429..bef540a 100644 --- a/src/Sockets.cpp +++ b/src/Sockets.cpp @@ -23,15 +23,14 @@ #include "lwip/stats.h" #include "ZeroTierSockets.h" -//#include "Events.hpp" -#define ZTS_STATE_NODE_RUNNING 0x01 -#define ZTS_STATE_STACK_RUNNING 0x02 -#define ZTS_STATE_NET_SERVICE_RUNNING 0x04 -#define ZTS_STATE_CALLBACKS_RUNNING 0x08 -#define ZTS_STATE_FREE_CALLED 0x10 +#define ZTS_STATE_NODE_RUNNING 0x01 +#define ZTS_STATE_STACK_RUNNING 0x02 +#define ZTS_STATE_NET_SERVICE_RUNNING 0x04 +#define ZTS_STATE_CALLBACKS_RUNNING 0x08 +#define ZTS_STATE_FREE_CALLED 0x10 -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #include #endif @@ -45,7 +44,7 @@ extern uint8_t _serviceStateFlags; extern "C" { #endif -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA void ss2zta(JNIEnv *env, struct zts_sockaddr_storage *ss, jobject addr); void zta2ss(JNIEnv *env, struct zts_sockaddr_storage *ss, jobject addr); void ztfdset2fdset(JNIEnv *env, int nfds, jobject src_ztfd_set, zts_fd_set *dest_fd_set); @@ -59,7 +58,7 @@ int zts_socket(const int socket_family, const int socket_type, const int protoco } return lwip_socket(socket_family, socket_type, protocol); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_socket( JNIEnv *env, jobject thisObj, jint family, jint type, jint protocol) { @@ -81,7 +80,7 @@ int zts_connect(int fd, const struct zts_sockaddr *addr, zts_socklen_t addrlen) } return lwip_connect(fd, (sockaddr*)addr, addrlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_connect( JNIEnv *env, jobject thisObj, jint fd, jobject addr) { @@ -106,7 +105,8 @@ int zts_bind(int fd, const struct zts_sockaddr *addr, zts_socklen_t addrlen) } return lwip_bind(fd, (sockaddr*)addr, addrlen); } -#ifdef SDK_JNI + +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_bind( JNIEnv *env, jobject thisObj, jint fd, jobject addr) { @@ -125,7 +125,7 @@ int zts_listen(int fd, int backlog) } return lwip_listen(fd, backlog); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_listen( JNIEnv *env, jobject thisObj, jint fd, int backlog) { @@ -141,7 +141,7 @@ int zts_accept(int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen) } return lwip_accept(fd, (sockaddr*)addr, (socklen_t*)addrlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_accept( JNIEnv *env, jobject thisObj, jint fd, jobject addr, jint port) { @@ -162,7 +162,7 @@ int zts_accept4(int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen, int f return ZTS_ERR_SERVICE; // TODO } #endif -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #if defined(__linux__) JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_accept4( JNIEnv *env, jobject thisObj, jint fd, jobject addr, jint port, jint flags) @@ -183,7 +183,7 @@ int zts_setsockopt(int fd, int level, int optname, const void *optval,zts_sockle } return lwip_setsockopt(fd, level, optname, optval, optlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_setsockopt( JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jobject optval) { @@ -236,7 +236,7 @@ int zts_getsockopt(int fd, int level, int optname, void *optval, zts_socklen_t * } return lwip_getsockopt(fd, level, optname, optval, (socklen_t*)optlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_getsockopt( JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jobject optval) { @@ -300,7 +300,7 @@ int zts_getsockname(int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen) } return lwip_getsockname(fd, (sockaddr*)addr, (socklen_t*)addrlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jboolean JNICALL Java_com_zerotier_libzt_ZeroTier_getsockname(JNIEnv *env, jobject thisObj, jint fd, jobject addr) { @@ -325,7 +325,7 @@ int zts_getpeername(int fd, struct zts_sockaddr *addr, zts_socklen_t *addrlen) } return lwip_getpeername(fd, (sockaddr*)addr, (socklen_t*)addrlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_getpeername(JNIEnv *env, jobject thisObj, jint fd, jobject addr) { @@ -343,7 +343,7 @@ int zts_close(int fd) } return lwip_close(fd); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_close( JNIEnv *env, jobject thisObj, jint fd) { @@ -359,7 +359,7 @@ int zts_select(int nfds, zts_fd_set *readfds, zts_fd_set *writefds, zts_fd_set * } return lwip_select(nfds, (fd_set*)readfds, (fd_set*)writefds, (fd_set*)exceptfds, (timeval*)timeout); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_select(JNIEnv *env, jobject thisObj, jint nfds, jobject readfds, jobject writefds, jobject exceptfds, jint timeout_sec, jint timeout_usec) { @@ -403,7 +403,7 @@ int zts_fcntl(int fd, int cmd, int flags) } return lwip_fcntl(fd, cmd, flags); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_fcntl( JNIEnv *env, jobject thisObj, jint fd, jint cmd, jint flags) { @@ -431,7 +431,7 @@ int zts_ioctl(int fd, unsigned long request, void *argp) } return lwip_ioctl(fd, request, argp); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT int JNICALL Java_com_zerotier_libzt_ZeroTier_ioctl( JNIEnv *env, jobject thisObj, jint fd, jlong request, jobject argp) { @@ -466,7 +466,7 @@ ssize_t zts_send(int fd, const void *buf, size_t len, int flags) } return lwip_send(fd, buf, len, flags); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_send( JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf, int flags) { @@ -491,7 +491,7 @@ ssize_t zts_sendto(int fd, const void *buf, size_t len, int flags, } return lwip_sendto(fd, buf, len, flags, (sockaddr*)addr, addrlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_sendto( JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf, jint flags, jobject addr) { @@ -512,7 +512,7 @@ ssize_t zts_sendmsg(int fd, const struct msghdr *msg, int flags) } return lwip_sendmsg(fd, msg, flags); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #endif ssize_t zts_recv(int fd, void *buf, size_t len, int flags) @@ -525,7 +525,7 @@ ssize_t zts_recv(int fd, void *buf, size_t len, int flags) } return lwip_recv(fd, buf, len, flags); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_recv(JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf, jint flags) { @@ -547,7 +547,7 @@ ssize_t zts_recvfrom(int fd, void *buf, size_t len, int flags, } return lwip_recvfrom(fd, buf, len, flags, (sockaddr*)addr, (socklen_t*)addrlen); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_recvfrom( JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf, jint flags, jobject addr) { @@ -572,7 +572,7 @@ ssize_t zts_recvmsg(int fd, struct msghdr *msg, int flags) } return lwip_recvmsg(fd, msg, flags); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #endif ssize_t zts_read(int fd, void *buf, size_t len) @@ -596,7 +596,7 @@ ssize_t zts_read_offset(int fd, void *buf, size_t offset, size_t len) char *cbuf = (char*)buf; return lwip_read(fd, &(cbuf[offset]), len); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_read(JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf) { @@ -642,7 +642,7 @@ ssize_t zts_write(int fd, const void *buf, size_t len) } return lwip_write(fd, buf, len); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_write__IB(JNIEnv *env, jobject thisObj, jint fd, jbyteArray buf) { @@ -683,7 +683,7 @@ int zts_shutdown(int fd, int how) } return lwip_shutdown(fd, how); } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_shutdown( JNIEnv *env, jobject thisObj, int fd, int how) { @@ -698,7 +698,7 @@ int zts_add_dns_nameserver(struct zts_sockaddr *addr) } return ZTS_ERR_SERVICE; // TODO } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #endif int zts_del_dns_nameserver(struct zts_sockaddr *addr) @@ -708,7 +708,7 @@ int zts_del_dns_nameserver(struct zts_sockaddr *addr) } return ZTS_ERR_SERVICE; // TODO } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA #endif uint16_t zts_htons(uint16_t n) @@ -750,6 +750,8 @@ uint32_t zts_inet_addr(const char *cp) // Statistics // ////////////////////////////////////////////////////////////////////////////// +#ifdef ZTS_ENABLE_STATS + extern struct stats_ lwip_stats; int zts_get_all_stats(struct zts_stats *statsDest) @@ -785,7 +787,7 @@ int zts_get_all_stats(struct zts_stats *statsDest) return ZTS_ERR_NO_RESULT; #endif } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA // No implementation for JNI #endif @@ -836,7 +838,7 @@ int zts_get_protocol_stats(int protocolType, void *protoStatsDest) return ZTS_ERR_NO_RESULT; #endif } -#ifdef SDK_JNI +#ifdef ZTS_ENABLE_JAVA JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_get_1protocol_1stats( JNIEnv *env, jobject thisObj, jint protocolType, jobject protoStatsObj) { @@ -876,7 +878,9 @@ JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_get_1protocol_1stats( } #endif -#ifdef SDK_JNI +#endif // ZTS_ENABLE_STATS + +#ifdef ZTS_ENABLE_JAVA void ztfdset2fdset(JNIEnv *env, int nfds, jobject src_ztfd_set, zts_fd_set *dest_fd_set) { jclass c = env->GetObjectClass(src_ztfd_set);