This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
zhangyang-libzt/src/bindings/java/JavaSockets.cxx

1102 lines
32 KiB
C++
Raw Normal View History

2021-04-29 19:51:07 -07:00
/*
* 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: 2026-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
*
* ZeroTier C Java Socket API
*/
#ifdef ZTS_ENABLE_JAVA
#include "Events.hpp"
#include "ZeroTierSockets.h"
#include "lwip/def.h"
#include "lwip/inet.h"
#include "lwip/sockets.h"
#include "lwip/stats.h"
#include <jni.h>
extern int zts_errno;
namespace ZeroTier {
extern uint8_t _state;
extern JavaVM* jvm;
void java_detach_from_thread()
{
jint rs = jvm->DetachCurrentThread();
}
#ifdef __cplusplus
extern "C" {
#endif
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);
void fdset2ztfdset(JNIEnv* env, int nfds, zts_fd_set* src_fd_set, jobject dest_ztfd_set);
/*
* 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.
*/
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init(JNIEnv* env, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
jint rs = env->GetJavaVM(&jvm);
return rs != JNI_OK ? ZTS_ERR_GENERAL : ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1socket(
JNIEnv* env,
jobject thisObj,
jint family,
jint type,
jint protocol)
2021-04-29 19:51:07 -07:00
{
int retval = zts_bsd_socket(family, type, protocol);
2021-04-29 19:51:07 -07:00
return retval > -1 ? retval : -(zts_errno); // Encode lwIP errno into return value for JNI functions only
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1listen(JNIEnv* env, jobject thisObj, jint fd, int backlog)
2021-04-29 19:51:07 -07:00
{
int retval = zts_bsd_listen(fd, backlog);
2021-04-29 19:51:07 -07:00
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1accept(
JNIEnv* env,
jobject thisObj,
jint fd,
jobject addr,
jint port)
2021-04-29 19:51:07 -07:00
{
struct zts_sockaddr_storage ss;
zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage);
int retval = zts_bsd_accept(fd, (zts_sockaddr*)&ss, &addrlen);
2021-04-29 19:51:07 -07:00
ss2zta(env, &ss, addr);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jboolean JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getsockname(JNIEnv* env, jobject thisObj, jint fd, jobject addr)
2021-04-29 19:51:07 -07:00
{
struct zts_sockaddr_storage ss;
zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage);
int retval = zts_bsd_getsockname(fd, (struct zts_sockaddr*)&ss, &addrlen);
2021-04-29 19:51:07 -07:00
ss2zta(env, &ss, addr);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getpeername(JNIEnv* env, jobject thisObj, jint fd, jobject addr)
2021-04-29 19:51:07 -07:00
{
struct zts_sockaddr_storage ss;
int retval =
zts_bsd_getpeername(fd, (struct zts_sockaddr*)&ss, (zts_socklen_t*)sizeof(struct zts_sockaddr_storage));
2021-04-29 19:51:07 -07:00
ss2zta(env, &ss, addr);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1close(JNIEnv* env, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_bsd_close(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1select(
2021-04-29 19:51:07 -07:00
JNIEnv* env,
jobject thisObj,
jint nfds,
jobject readfds,
jobject writefds,
jobject exceptfds,
jint timeout_sec,
jint timeout_usec)
{
struct zts_timeval _timeout;
_timeout.tv_sec = timeout_sec;
_timeout.tv_usec = timeout_usec;
zts_fd_set _readfds, _writefds, _exceptfds;
zts_fd_set* r = NULL;
zts_fd_set* w = NULL;
zts_fd_set* e = NULL;
if (readfds) {
r = &_readfds;
ztfdset2fdset(env, nfds, readfds, &_readfds);
}
if (writefds) {
w = &_writefds;
ztfdset2fdset(env, nfds, writefds, &_writefds);
}
if (exceptfds) {
e = &_exceptfds;
ztfdset2fdset(env, nfds, exceptfds, &_exceptfds);
}
int retval = zts_bsd_select(nfds, r, w, e, &_timeout);
2021-04-29 19:51:07 -07:00
if (readfds) {
fdset2ztfdset(env, nfds, &_readfds, readfds);
}
if (writefds) {
fdset2ztfdset(env, nfds, &_writefds, writefds);
}
if (exceptfds) {
fdset2ztfdset(env, nfds, &_exceptfds, exceptfds);
}
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1fcntl(JNIEnv* env, jobject thisObj, jint fd, jint cmd, jint flags)
2021-04-29 19:51:07 -07:00
{
int retval = zts_bsd_fcntl(fd, cmd, flags);
2021-04-29 19:51:07 -07:00
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT int JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1ioctl(
JNIEnv* env,
jobject thisObj,
jint fd,
jlong request,
jobject argp)
2021-04-29 19:51:07 -07:00
{
int retval = ZTS_ERR_OK;
if (request == FIONREAD) {
int bytesRemaining = 0;
retval = zts_bsd_ioctl(fd, request, &bytesRemaining);
2021-04-29 19:51:07 -07:00
// set value in general object
jclass c = env->GetObjectClass(argp);
if (! c) {
return ZTS_ERR_ARG;
}
jfieldID fid = env->GetFieldID(c, "integer", "I");
env->SetIntField(argp, fid, bytesRemaining);
}
if (request == FIONBIO) {
// TODO: double check
int meaninglessVariable = 0;
retval = zts_bsd_ioctl(fd, request, &meaninglessVariable);
2021-04-29 19:51:07 -07:00
}
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1send(
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
int flags)
2021-04-29 19:51:07 -07:00
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_send(fd, data, env->GetArrayLength(buf), flags);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1sendto(
2021-04-29 19:51:07 -07:00
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
jint flags,
jobject addr)
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
struct zts_sockaddr_storage ss;
zta2ss(env, &ss, addr);
zts_socklen_t addrlen =
ss.ss_family == ZTS_AF_INET ? sizeof(struct zts_sockaddr_in) : sizeof(struct zts_sockaddr_in6);
int retval = zts_bsd_sendto(fd, data, env->GetArrayLength(buf), flags, (struct zts_sockaddr*)&ss, addrlen);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recv(
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
jint flags)
2021-04-29 19:51:07 -07:00
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_recv(fd, data, env->GetArrayLength(buf), flags);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recvfrom(
2021-04-29 19:51:07 -07:00
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
jint flags,
jobject addr)
{
zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage);
struct zts_sockaddr_storage ss;
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_recvfrom(fd, data, env->GetArrayLength(buf), flags, (struct zts_sockaddr*)&ss, &addrlen);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
ss2zta(env, &ss, addr);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read(JNIEnv* env, jobject thisObj, jint fd, jbyteArray buf)
2021-04-29 19:51:07 -07:00
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_read(fd, data, env->GetArrayLength(buf));
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
ssize_t zts_bsd_read_offset(int fd, void* buf, size_t offset, size_t len)
2021-04-29 19:51:07 -07:00
{
char* cbuf = (char*)buf;
return zts_bsd_read(fd, &(cbuf[offset]), len);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1offset(
2021-04-29 19:51:07 -07:00
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
jint offset,
jint len)
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_read_offset(fd, data, offset, len);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1length(
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
jint len)
2021-04-29 19:51:07 -07:00
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_read(fd, data, len);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write__IB(JNIEnv* env, jobject thisObj, jint fd, jbyteArray buf)
2021-04-29 19:51:07 -07:00
{
void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_write(fd, data, env->GetArrayLength(buf));
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_1offset(
2021-04-29 19:51:07 -07:00
JNIEnv* env,
jobject thisObj,
jint fd,
jbyteArray buf,
jint offset,
jint len)
{
void* data = env->GetPrimitiveArrayCritical(&(buf[offset]), NULL); // PENDING: check?
int retval = zts_bsd_write(fd, data, len);
2021-04-29 19:51:07 -07:00
env->ReleasePrimitiveArrayCritical(buf, data, 0);
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_1byte(JNIEnv* env, jobject thisObj, jint fd, jbyte buf)
2021-04-29 19:51:07 -07:00
{
int retval = zts_bsd_write(fd, &buf, 1);
2021-04-29 19:51:07 -07:00
return retval > -1 ? retval : -(zts_errno);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1shutdown(JNIEnv* env, jobject thisObj, int fd, int how)
2021-04-29 19:51:07 -07:00
{
return zts_bsd_shutdown(fd, how);
2021-04-29 19:51:07 -07:00
}
void ztfdset2fdset(JNIEnv* env, int nfds, jobject src_ztfd_set, zts_fd_set* dest_fd_set)
{
jclass c = env->GetObjectClass(src_ztfd_set);
if (! c) {
return;
}
ZTS_FD_ZERO(dest_fd_set);
jfieldID fid = env->GetFieldID(c, "fds_bits", "[B");
jobject fdData = env->GetObjectField(src_ztfd_set, fid);
jbyteArray* arr = reinterpret_cast<jbyteArray*>(&fdData);
char* data = (char*)env->GetByteArrayElements(*arr, NULL);
for (int i = 0; i < nfds; i++) {
if (data[i] == 0x01) {
ZTS_FD_SET(i, dest_fd_set);
}
}
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0);
return;
}
void fdset2ztfdset(JNIEnv* env, int nfds, zts_fd_set* src_fd_set, jobject dest_ztfd_set)
{
jclass c = env->GetObjectClass(dest_ztfd_set);
if (! c) {
return;
}
jfieldID fid = env->GetFieldID(c, "fds_bits", "[B");
jobject fdData = env->GetObjectField(dest_ztfd_set, fid);
jbyteArray* arr = reinterpret_cast<jbyteArray*>(&fdData);
char* data = (char*)env->GetByteArrayElements(*arr, NULL);
for (int i = 0; i < nfds; i++) {
if (ZTS_FD_ISSET(i, src_fd_set)) {
data[i] = 0x01;
}
}
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0);
return;
}
//----------------------------------------------------------------------------//
// Helpers (for moving data across the JNI barrier) //
//----------------------------------------------------------------------------//
void ss2zta(JNIEnv* env, struct zts_sockaddr_storage* ss, jobject addr)
{
jclass c = env->GetObjectClass(addr);
if (! c) {
return;
}
if (ss->ss_family == ZTS_AF_INET) {
struct zts_sockaddr_in* in4 = (struct zts_sockaddr_in*)ss;
jfieldID fid = env->GetFieldID(c, "_port", "I");
env->SetIntField(addr, fid, lwip_ntohs(in4->sin_port));
fid = env->GetFieldID(c, "_family", "I");
env->SetIntField(addr, fid, (in4->sin_family));
fid = env->GetFieldID(c, "_ip4", "[B");
jobject ipData = env->GetObjectField(addr, fid);
jbyteArray* arr = reinterpret_cast<jbyteArray*>(&ipData);
char* data = (char*)env->GetByteArrayElements(*arr, NULL);
memcpy(data, &(in4->sin_addr.s_addr), 4);
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0);
return;
}
if (ss->ss_family == ZTS_AF_INET6) {
struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)ss;
jfieldID fid = env->GetFieldID(c, "_port", "I");
env->SetIntField(addr, fid, lwip_ntohs(in6->sin6_port));
fid = env->GetFieldID(c, "_family", "I");
env->SetIntField(addr, fid, (in6->sin6_family));
fid = env->GetFieldID(c, "_ip6", "[B");
jobject ipData = env->GetObjectField(addr, fid);
jbyteArray* arr = reinterpret_cast<jbyteArray*>(&ipData);
char* data = (char*)env->GetByteArrayElements(*arr, NULL);
memcpy(data, &(in6->sin6_addr.s6_addr), 16);
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0);
return;
}
}
void zta2ss(JNIEnv* env, struct zts_sockaddr_storage* ss, jobject addr)
{
jclass c = env->GetObjectClass(addr);
if (! c) {
return;
}
jfieldID fid = env->GetFieldID(c, "_family", "I");
int family = env->GetIntField(addr, fid);
if (family == ZTS_AF_INET) {
struct zts_sockaddr_in* in4 = (struct zts_sockaddr_in*)ss;
fid = env->GetFieldID(c, "_port", "I");
in4->sin_port = lwip_htons(env->GetIntField(addr, fid));
in4->sin_family = ZTS_AF_INET;
fid = env->GetFieldID(c, "_ip4", "[B");
jobject ipData = env->GetObjectField(addr, fid);
jbyteArray* arr = reinterpret_cast<jbyteArray*>(&ipData);
char* data = (char*)env->GetByteArrayElements(*arr, NULL);
memcpy(&(in4->sin_addr.s_addr), data, 4);
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0);
return;
}
if (family == ZTS_AF_INET6) {
struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)ss;
jfieldID fid = env->GetFieldID(c, "_port", "I");
in6->sin6_port = lwip_htons(env->GetIntField(addr, fid));
fid = env->GetFieldID(c, "_family", "I");
in6->sin6_family = ZTS_AF_INET6;
fid = env->GetFieldID(c, "_ip6", "[B");
jobject ipData = env->GetObjectField(addr, fid);
jbyteArray* arr = reinterpret_cast<jbyteArray*>(&ipData);
char* data = (char*)env->GetByteArrayElements(*arr, NULL);
memcpy(&(in6->sin6_addr.s6_addr), data, 16);
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0);
return;
}
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1port(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
return zts_node_get_port();
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1stop(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
int res = zts_node_stop();
java_detach_from_thread();
return res;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1free(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
int res = zts_node_free();
java_detach_from_thread();
return res;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1join(JNIEnv* env, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_join((uint64_t)net_id);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1leave(JNIEnv* env, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_leave((uint64_t)net_id);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1id_1new(JNIEnv* jenv, jobject thisObj, char* key, int* key_buf_len)
2021-04-29 19:51:07 -07:00
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1id_1pair_1is_1valid(JNIEnv* jenv, jobject thisObj, char* key, int len)
2021-04-29 19:51:07 -07:00
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1from_1storage(JNIEnv* jenv, jobject thisObj, jstring path)
2021-04-29 19:51:07 -07:00
{
if (! path) {
return ZTS_ERR_ARG;
}
const char* utf_string = jenv->GetStringUTFChars(path, NULL);
if (! utf_string) {
return ZTS_ERR_GENERAL;
}
int retval = zts_init_from_storage(utf_string);
jenv->ReleaseStringUTFChars(path, utf_string);
return retval;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1event_1handler(JNIEnv* env, jobject thisObj, jobject callback)
2021-04-29 19:51:07 -07:00
{
jclass eventListenerClass = env->GetObjectClass(callback);
if (eventListenerClass == NULL) {
fprintf(stderr, "Couldn't find class for ZeroTierEventListener instance");
return ZTS_ERR_ARG;
}
jmethodID eventListenerCallbackMethod = env->GetMethodID(eventListenerClass, "onZeroTierEvent", "(JI)V");
if (eventListenerCallbackMethod == NULL) {
fprintf(stderr, "Couldn't find onZeroTierEvent method");
return ZTS_ERR_ARG;
}
return zts_init_set_event_handler(env->NewGlobalRef(callback), eventListenerCallbackMethod);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1port(JNIEnv* jenv, jobject thisObj, short port)
2021-04-29 19:51:07 -07:00
{
return zts_init_set_port(port);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1from_1memory(JNIEnv* jenv, jobject thisObj, char* key, int len)
2021-04-29 19:51:07 -07:00
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1blacklist_1if(
JNIEnv* jenv,
jobject thisObj,
jstring prefix,
jint len)
2021-04-29 19:51:07 -07:00
{
if (! prefix) {
return ZTS_ERR_ARG;
}
const char* utf_string = jenv->GetStringUTFChars(prefix, NULL);
if (! utf_string) {
return ZTS_ERR_GENERAL;
}
int retval = zts_init_blacklist_if(utf_string, len);
jenv->ReleaseStringUTFChars(prefix, utf_string);
return retval;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_roots(JNIEnv* jenv, jobject thisObj, void* roots_data, jint len)
2021-04-29 19:51:07 -07:00
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1net_1cache(JNIEnv* jenv, jobject thisObj, jint allowed)
2021-04-29 19:51:07 -07:00
{
return zts_init_allow_net_cache(allowed);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1peer_1cache(JNIEnv* jenv, jobject thisObj, jint allowed)
2021-04-29 19:51:07 -07:00
{
return zts_init_allow_peer_cache(allowed);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1roots_1cache(JNIEnv* jenv, jobject thisObj, jint allowed)
2021-04-29 19:51:07 -07:00
{
return zts_init_allow_roots_cache(allowed);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1id_1cache(JNIEnv* jenv, jobject thisObj, jint allowed)
2021-04-29 19:51:07 -07:00
{
return zts_init_allow_id_cache(allowed);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1is_1assigned(
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jint family)
2021-04-29 19:51:07 -07:00
{
return zts_addr_is_assigned(net_id, family);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
long net_id,
jint family,
struct sockaddr_storage* addr)
{
// Use Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str instead
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jstring JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str(JNIEnv* jenv, jobject thisObj, long net_id, jint family)
2021-04-29 19:51:07 -07:00
{
char ip_str[ZTS_IP_MAX_STR_LEN] = { 0 };
zts_addr_get_str(net_id, family, ip_str, ZTS_IP_MAX_STR_LEN);
jstring result = jenv->NewStringUTF(ip_str);
return result;
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1all(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
long net_id,
struct sockaddr_storage* addr,
jint* count)
{
/* This feature will be implemented once the lower-level
limitation of one addr per family per network is removed. */
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_16plane(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jlong node_id,
struct sockaddr_storage* addr)
{
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_1rfc4193(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jlong node_id,
struct sockaddr_storage* addr)
{
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_1rfc4193_1str(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jlong node_id,
jstring dst,
jint len)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_16plane_1str(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jlong node_id,
jstring dst,
jint len)
{
return ZTS_ERR_OK;
}
JNIEXPORT uint64_t JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1compute_1adhoc_1id(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
short start_port,
short end_port)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1transport_1is_1ready(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_transport_is_ready(net_id);
}
JNIEXPORT uint64_t JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_get_mac(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_get_mac(net_id);
}
JNIEXPORT jstring JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mac_1str(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
char mac_str[ZTS_MAC_ADDRSTRLEN] = { 0 };
zts_net_get_mac_str(net_id, mac_str, ZTS_MAC_ADDRSTRLEN);
jstring result = jenv->NewStringUTF(mac_str);
return result;
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1broadcast(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_get_broadcast(net_id);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mtu(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_get_mtu(net_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1name(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jstring dst,
jint len)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1status(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_get_status(net_id);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1type(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_net_get_type(net_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1route_1is_1assigned(
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jint family)
2021-04-29 19:51:07 -07:00
{
return zts_route_is_assigned(net_id, family);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1start(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
return zts_node_start();
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1is_1online(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
return zts_node_is_online();
}
JNIEXPORT uint64_t JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1id(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
return zts_node_get_id();
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1id_1pair(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
char* key,
jint* key_buf_len)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1orbit(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong moon_roots_id,
jlong moon_seed)
{
return zts_moon_orbit(moon_roots_id, moon_seed);
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1deorbit(JNIEnv* jenv, jobject thisObj, jlong moon_roots_id)
2021-04-29 19:51:07 -07:00
{
return zts_moon_deorbit(moon_roots_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1connect(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jint fd,
jstring ipstr,
jint port,
jint timeout_ms)
{
if (! ipstr) {
return ZTS_ERR_ARG;
}
const char* utf_string = jenv->GetStringUTFChars(ipstr, NULL);
if (! utf_string) {
return ZTS_ERR_GENERAL;
}
int retval = zts_connect(fd, utf_string, port, timeout_ms);
2021-04-29 19:51:07 -07:00
jenv->ReleaseStringUTFChars(ipstr, utf_string);
return retval;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bind(JNIEnv* jenv, jobject thisObj, jint fd, jstring ipstr, jint port)
2021-04-29 19:51:07 -07:00
{
if (! ipstr) {
return ZTS_ERR_ARG;
}
const char* utf_string = jenv->GetStringUTFChars(ipstr, NULL);
if (! utf_string) {
return ZTS_ERR_GENERAL;
}
int retval = zts_bind(fd, utf_string, port);
2021-04-29 19:51:07 -07:00
jenv->ReleaseStringUTFChars(ipstr, utf_string);
return retval;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1accept(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
int fd,
jstring remote_addr,
jint len,
jint* port)
{
// Use Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1accept instead
2021-04-29 19:51:07 -07:00
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1udp_1client(JNIEnv* jenv, jobject thisObj, jstring remote_ipstr)
2021-04-29 19:51:07 -07:00
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1no_1delay(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled)
2021-04-29 19:51:07 -07:00
{
return zts_set_no_delay(fd, enabled);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1no_1delay(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_no_delay(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1linger(
JNIEnv* jenv,
jobject thisObj,
jint fd,
jint enabled,
jint value)
2021-04-29 19:51:07 -07:00
{
return zts_set_linger(fd, enabled, value);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1linger_1enabled(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_linger_enabled(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1linger_1value(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_linger_value(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1pending_1data_1size(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_pending_data_size(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1reuse_1addr(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled)
2021-04-29 19:51:07 -07:00
{
return zts_set_reuse_addr(fd, enabled);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1reuse_1addr(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_reuse_addr(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1timeout(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jint fd,
jint seconds,
jint microseconds)
{
return zts_set_recv_timeout(fd, seconds, microseconds);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1recv_1timeout(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_recv_timeout(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1timeout(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jint fd,
jint seconds,
jint microseconds)
{
return zts_set_send_timeout(fd, seconds, microseconds);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1send_1timeout(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_send_timeout(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd, jint size)
2021-04-29 19:51:07 -07:00
{
return zts_set_send_buf_size(fd, size);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1send_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_send_buf_size(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd, jint size)
2021-04-29 19:51:07 -07:00
{
return zts_set_recv_buf_size(fd, size);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1recv_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_recv_buf_size(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1ttl(JNIEnv* jenv, jobject thisObj, jint fd, jint ttl)
2021-04-29 19:51:07 -07:00
{
return zts_set_ttl(fd, ttl);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1ttl(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_ttl(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1blocking(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled)
2021-04-29 19:51:07 -07:00
{
return zts_set_blocking(fd, enabled);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1blocking(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_blocking(fd);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1keepalive(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled)
2021-04-29 19:51:07 -07:00
{
return zts_set_keepalive(fd, enabled);
2021-04-29 19:51:07 -07:00
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1keepalive(JNIEnv* jenv, jobject thisObj, jint fd)
2021-04-29 19:51:07 -07:00
{
return zts_get_keepalive(fd);
2021-04-29 19:51:07 -07:00
}
struct hostent*
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1gethostbyname(JNIEnv* jenv, jobject thisObj, jstring name)
2021-04-29 19:51:07 -07:00
{
return NULL;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1dns_1set_1server(
JNIEnv* jenv,
jobject thisObj,
uint8_t index,
ip_addr* addr)
2021-04-29 19:51:07 -07:00
{
return ZTS_ERR_OK;
}
JNIEXPORT ip_addr* JNICALL dns_1get_1server(JNIEnv* jenv, jobject thisObj, uint8_t index)
{
return NULL;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1lock_1obtain(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
return zts_core_lock_obtain();
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1lock_1release(JNIEnv* jenv, jobject thisObj)
2021-04-29 19:51:07 -07:00
{
return zts_core_lock_release();
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1addr_1count(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_core_query_addr_count(net_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1addr(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jint idx,
jstring addr,
jint len)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1route_1count(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_core_query_route_count(net_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1route(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong net_id,
jint idx,
jstring target,
jstring via,
jint len,
short* flags,
short* metric)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1path_1count(JNIEnv* jenv, jobject thisObj, jlong peer_id)
2021-04-29 19:51:07 -07:00
{
return zts_core_query_path_count(peer_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1path(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
jlong peer_id,
jint idx,
jstring dst,
jint len)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1mc_1count(JNIEnv* jenv, jobject thisObj, jlong net_id)
2021-04-29 19:51:07 -07:00
{
return zts_core_query_mc_count(net_id);
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1mc(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
long net_id,
jint idx,
jlong* mac,
uint32_t* adi)
{
return ZTS_ERR_OK;
}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1util_1roots_1new(
2021-04-29 19:51:07 -07:00
JNIEnv* jenv,
jobject thisObj,
char* roots_out,
jint* roots_len,
char* prev_key,
jint* prev_key_len,
char* curr_key,
jint* curr_key_len,
jlong id,
jlong ts,
zts_root_set_t* roots_spec)
{
return ZTS_ERR_OK;
}
JNIEXPORT void JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1util_1delay(JNIEnv* jenv, jobject thisObj, jlong milliseconds)
2021-04-29 19:51:07 -07:00
{
zts_util_delay(milliseconds);
}
#ifdef __cplusplus
}
#endif
} // namespace ZeroTier
#endif // ZTS_ENABLE_JAVA