|
|
|
@ -186,7 +186,7 @@ int zts_setsockopt(int fd, int level, int optname, const void *optval, socklen_t |
|
|
|
JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_setsockopt( |
|
|
|
JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_setsockopt( |
|
|
|
JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jobject optval) |
|
|
|
JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jobject optval) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jclass c = (*env).GetObjectClass(optval); |
|
|
|
jclass c = env->GetObjectClass(optval); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return ZTS_ERR_INVALID_OP; |
|
|
|
return ZTS_ERR_INVALID_OP; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -198,8 +198,8 @@ JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_setsockopt( |
|
|
|
|| optname == SO_REUSEPORT |
|
|
|
|| optname == SO_REUSEPORT |
|
|
|
|| optname == TCP_NODELAY) |
|
|
|
|| optname == TCP_NODELAY) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "booleanValue", "Z"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "booleanValue", "Z"); |
|
|
|
optval_int = (int)(*env).GetBooleanField(optval, fid); |
|
|
|
optval_int = (int)(env->GetBooleanField(optval, fid)); |
|
|
|
} |
|
|
|
} |
|
|
|
if (optname == IP_TTL |
|
|
|
if (optname == IP_TTL |
|
|
|
|| optname == SO_RCVTIMEO |
|
|
|
|| optname == SO_RCVTIMEO |
|
|
|
@ -208,8 +208,8 @@ JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_setsockopt( |
|
|
|
|| optname == SO_RCVBUF |
|
|
|
|| optname == SO_RCVBUF |
|
|
|
|| optname == SO_SNDBUF) |
|
|
|
|| optname == SO_SNDBUF) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "integerValue", "I"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "integerValue", "I"); |
|
|
|
optval_int = (*env).GetIntField(optval, fid); |
|
|
|
optval_int = env->GetIntField(optval, fid); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int retval = ZTS_ERR_OK; |
|
|
|
int retval = ZTS_ERR_OK; |
|
|
|
@ -236,7 +236,7 @@ int zts_getsockopt(int fd, int level, int optname, void *optval, socklen_t *optl |
|
|
|
JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_getsockopt( |
|
|
|
JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_getsockopt( |
|
|
|
JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jobject optval) |
|
|
|
JNIEnv *env, jobject thisObj, jint fd, jint level, jint optname, jobject optval) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jclass c = (*env).GetObjectClass(optval); |
|
|
|
jclass c = env->GetObjectClass(optval); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return ZTS_ERR_INVALID_OP; |
|
|
|
return ZTS_ERR_INVALID_OP; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -262,10 +262,10 @@ JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_getsockopt( |
|
|
|
|| optname == SO_REUSEPORT |
|
|
|
|| optname == SO_REUSEPORT |
|
|
|
|| optname == TCP_NODELAY) |
|
|
|
|| optname == TCP_NODELAY) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "isBoolean", "Z"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "isBoolean", "Z"); |
|
|
|
(*env).SetBooleanField(optval, fid, true); |
|
|
|
env->SetBooleanField(optval, fid, true); |
|
|
|
fid = (*env).GetFieldID(c, "booleanValue", "Z"); |
|
|
|
fid = env->GetFieldID(c, "booleanValue", "Z"); |
|
|
|
(*env).SetBooleanField(optval, fid, (bool)optval_int); |
|
|
|
env->SetBooleanField(optval, fid, (bool)optval_int); |
|
|
|
} |
|
|
|
} |
|
|
|
if (optname == IP_TTL |
|
|
|
if (optname == IP_TTL |
|
|
|
|| optname == SO_RCVTIMEO |
|
|
|
|| optname == SO_RCVTIMEO |
|
|
|
@ -274,10 +274,10 @@ JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_getsockopt( |
|
|
|
|| optname == SO_RCVBUF |
|
|
|
|| optname == SO_RCVBUF |
|
|
|
|| optname == SO_SNDBUF) |
|
|
|
|| optname == SO_SNDBUF) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "isInteger", "Z"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "isInteger", "Z"); |
|
|
|
(*env).SetBooleanField(optval, fid, true); |
|
|
|
env->SetBooleanField(optval, fid, true); |
|
|
|
fid = (*env).GetFieldID(c, "integerValue", "I"); |
|
|
|
fid = env->GetFieldID(c, "integerValue", "I"); |
|
|
|
(*env).SetIntField(optval, fid, optval_int); |
|
|
|
env->SetIntField(optval, fid, optval_int); |
|
|
|
} |
|
|
|
} |
|
|
|
return retval > -1 ? retval : -(zts_errno); |
|
|
|
return retval > -1 ? retval : -(zts_errno); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -461,12 +461,12 @@ JNIEXPORT int JNICALL Java_com_zerotier_libzt_ZeroTier_ioctl( |
|
|
|
int bytesRemaining = 0; |
|
|
|
int bytesRemaining = 0; |
|
|
|
retval = zts_ioctl(fd, request, &bytesRemaining);
|
|
|
|
retval = zts_ioctl(fd, request, &bytesRemaining);
|
|
|
|
// set value in general object
|
|
|
|
// set value in general object
|
|
|
|
jclass c = (*env).GetObjectClass(argp); |
|
|
|
jclass c = env->GetObjectClass(argp); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return ZTS_ERR_INVALID_ARG; |
|
|
|
return ZTS_ERR_INVALID_ARG; |
|
|
|
} |
|
|
|
} |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "integer", "I"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "integer", "I"); |
|
|
|
(*env).SetIntField(argp, fid, bytesRemaining); |
|
|
|
env->SetIntField(argp, fid, bytesRemaining); |
|
|
|
} |
|
|
|
} |
|
|
|
if (request == FIONBIO) { |
|
|
|
if (request == FIONBIO) { |
|
|
|
// TODO: double check
|
|
|
|
// TODO: double check
|
|
|
|
@ -678,40 +678,40 @@ int zts_del_dns_nameserver(struct sockaddr *addr) |
|
|
|
#ifdef SDK_JNI |
|
|
|
#ifdef SDK_JNI |
|
|
|
void ztfdset2fdset(JNIEnv *env, int nfds, jobject src_ztfd_set, fd_set *dest_fd_set) |
|
|
|
void ztfdset2fdset(JNIEnv *env, int nfds, jobject src_ztfd_set, fd_set *dest_fd_set) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jclass c = (*env).GetObjectClass(src_ztfd_set); |
|
|
|
jclass c = env->GetObjectClass(src_ztfd_set); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
FD_ZERO(dest_fd_set); |
|
|
|
FD_ZERO(dest_fd_set); |
|
|
|
jfieldID fid = env->GetFieldID(c, "fds_bits", "[B"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "fds_bits", "[B"); |
|
|
|
jobject fdData = (*env).GetObjectField (src_ztfd_set, fid); |
|
|
|
jobject fdData = env->GetObjectField (src_ztfd_set, fid); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&fdData); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&fdData); |
|
|
|
char *data = (char*)(*env).GetByteArrayElements(*arr, NULL);
|
|
|
|
char *data = (char*)env->GetByteArrayElements(*arr, NULL); |
|
|
|
for (int i=0; i<nfds; i++) { |
|
|
|
for (int i=0; i<nfds; i++) { |
|
|
|
if (data[i] == 0x01) { |
|
|
|
if (data[i] == 0x01) { |
|
|
|
FD_SET(i, dest_fd_set); |
|
|
|
FD_SET(i, dest_fd_set); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
(*env).ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void fdset2ztfdset(JNIEnv *env, int nfds, fd_set *src_fd_set, jobject dest_ztfd_set) |
|
|
|
void fdset2ztfdset(JNIEnv *env, int nfds, fd_set *src_fd_set, jobject dest_ztfd_set) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jclass c = (*env).GetObjectClass(dest_ztfd_set); |
|
|
|
jclass c = env->GetObjectClass(dest_ztfd_set); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
jfieldID fid = env->GetFieldID(c, "fds_bits", "[B"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "fds_bits", "[B"); |
|
|
|
jobject fdData = (*env).GetObjectField (dest_ztfd_set, fid); |
|
|
|
jobject fdData = env->GetObjectField (dest_ztfd_set, fid); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&fdData); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&fdData); |
|
|
|
char *data = (char*)(*env).GetByteArrayElements(*arr, NULL); |
|
|
|
char *data = (char*)env->GetByteArrayElements(*arr, NULL); |
|
|
|
for (int i=0; i<nfds; i++) { |
|
|
|
for (int i=0; i<nfds; i++) { |
|
|
|
if (FD_ISSET(i, src_fd_set)) { |
|
|
|
if (FD_ISSET(i, src_fd_set)) { |
|
|
|
data[i] = 0x01; |
|
|
|
data[i] = 0x01; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
(*env).ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -721,78 +721,78 @@ void fdset2ztfdset(JNIEnv *env, int nfds, fd_set *src_fd_set, jobject dest_ztfd_ |
|
|
|
|
|
|
|
|
|
|
|
void ss2zta(JNIEnv *env, struct sockaddr_storage *ss, jobject addr) |
|
|
|
void ss2zta(JNIEnv *env, struct sockaddr_storage *ss, jobject addr) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jclass c = (*env).GetObjectClass(addr); |
|
|
|
jclass c = env->GetObjectClass(addr); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
if(ss->ss_family == AF_INET) |
|
|
|
if(ss->ss_family == AF_INET) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct sockaddr_in *in4 = (struct sockaddr_in*)ss; |
|
|
|
struct sockaddr_in *in4 = (struct sockaddr_in*)ss; |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "_port", "I"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "_port", "I"); |
|
|
|
(*env).SetIntField(addr, fid, lwip_ntohs(in4->sin_port)); |
|
|
|
env->SetIntField(addr, fid, lwip_ntohs(in4->sin_port)); |
|
|
|
fid = (*env).GetFieldID(c,"_family", "I"); |
|
|
|
fid = env->GetFieldID(c,"_family", "I"); |
|
|
|
(*env).SetIntField(addr, fid, (in4->sin_family)); |
|
|
|
env->SetIntField(addr, fid, (in4->sin_family)); |
|
|
|
fid = env->GetFieldID(c, "_ip4", "[B"); |
|
|
|
fid = env->GetFieldID(c, "_ip4", "[B"); |
|
|
|
jobject ipData = (*env).GetObjectField (addr, fid); |
|
|
|
jobject ipData = env->GetObjectField (addr, fid); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
char *data = (char*)(*env).GetByteArrayElements(*arr, NULL); |
|
|
|
char *data = (char*)env->GetByteArrayElements(*arr, NULL); |
|
|
|
memcpy(data, &(in4->sin_addr.s_addr), 4); |
|
|
|
memcpy(data, &(in4->sin_addr.s_addr), 4); |
|
|
|
(*env).ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
|
|
|
|
|
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
if(ss->ss_family == AF_INET6) |
|
|
|
if(ss->ss_family == AF_INET6) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)ss; |
|
|
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)ss; |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "_port", "I"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "_port", "I"); |
|
|
|
(*env).SetIntField(addr, fid, lwip_ntohs(in6->sin6_port)); |
|
|
|
env->SetIntField(addr, fid, lwip_ntohs(in6->sin6_port)); |
|
|
|
fid = (*env).GetFieldID(c,"_family", "I"); |
|
|
|
fid = env->GetFieldID(c,"_family", "I"); |
|
|
|
(*env).SetIntField(addr, fid, (in6->sin6_family)); |
|
|
|
env->SetIntField(addr, fid, (in6->sin6_family)); |
|
|
|
fid = env->GetFieldID(c, "_ip6", "[B"); |
|
|
|
fid = env->GetFieldID(c, "_ip6", "[B"); |
|
|
|
jobject ipData = (*env).GetObjectField (addr, fid); |
|
|
|
jobject ipData = env->GetObjectField (addr, fid); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
char *data = (char*)(*env).GetByteArrayElements(*arr, NULL); |
|
|
|
char *data = (char*)env->GetByteArrayElements(*arr, NULL); |
|
|
|
memcpy(data, &(in6->sin6_addr.s6_addr), 16); |
|
|
|
memcpy(data, &(in6->sin6_addr.s6_addr), 16); |
|
|
|
(*env).ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void zta2ss(JNIEnv *env, struct sockaddr_storage *ss, jobject addr) |
|
|
|
void zta2ss(JNIEnv *env, struct sockaddr_storage *ss, jobject addr) |
|
|
|
{ |
|
|
|
{ |
|
|
|
jclass c = (*env).GetObjectClass(addr); |
|
|
|
jclass c = env->GetObjectClass(addr); |
|
|
|
if (!c) { |
|
|
|
if (!c) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "_family", "I"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "_family", "I"); |
|
|
|
int family = (*env).GetIntField(addr, fid); |
|
|
|
int family = env->GetIntField(addr, fid); |
|
|
|
if (family == AF_INET) |
|
|
|
if (family == AF_INET) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct sockaddr_in *in4 = (struct sockaddr_in*)ss; |
|
|
|
struct sockaddr_in *in4 = (struct sockaddr_in*)ss; |
|
|
|
fid = (*env).GetFieldID(c, "_port", "I"); |
|
|
|
fid = env->GetFieldID(c, "_port", "I"); |
|
|
|
in4->sin_port = lwip_htons((*env).GetIntField(addr, fid)); |
|
|
|
in4->sin_port = lwip_htons(env->GetIntField(addr, fid)); |
|
|
|
in4->sin_family = AF_INET; |
|
|
|
in4->sin_family = AF_INET; |
|
|
|
fid = env->GetFieldID(c, "_ip4", "[B"); |
|
|
|
fid = env->GetFieldID(c, "_ip4", "[B"); |
|
|
|
jobject ipData = (*env).GetObjectField (addr, fid); |
|
|
|
jobject ipData = env->GetObjectField (addr, fid); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
char *data = (char*)(*env).GetByteArrayElements(*arr, NULL); |
|
|
|
char *data = (char*)env->GetByteArrayElements(*arr, NULL); |
|
|
|
memcpy(&(in4->sin_addr.s_addr), data, 4); |
|
|
|
memcpy(&(in4->sin_addr.s_addr), data, 4); |
|
|
|
(*env).ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
if (family == AF_INET6) |
|
|
|
if (family == AF_INET6) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)ss; |
|
|
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)ss; |
|
|
|
jfieldID fid = (*env).GetFieldID(c, "_port", "I"); |
|
|
|
jfieldID fid = env->GetFieldID(c, "_port", "I"); |
|
|
|
in6->sin6_port = lwip_htons((*env).GetIntField(addr, fid)); |
|
|
|
in6->sin6_port = lwip_htons(env->GetIntField(addr, fid)); |
|
|
|
fid = (*env).GetFieldID(c,"_family", "I"); |
|
|
|
fid = env->GetFieldID(c,"_family", "I"); |
|
|
|
in6->sin6_family = AF_INET6; |
|
|
|
in6->sin6_family = AF_INET6; |
|
|
|
fid = env->GetFieldID(c, "_ip6", "[B"); |
|
|
|
fid = env->GetFieldID(c, "_ip6", "[B"); |
|
|
|
jobject ipData = (*env).GetObjectField (addr, fid); |
|
|
|
jobject ipData = env->GetObjectField (addr, fid); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
jbyteArray * arr = reinterpret_cast<jbyteArray*>(&ipData); |
|
|
|
char *data = (char*)(*env).GetByteArrayElements(*arr, NULL); |
|
|
|
char *data = (char*)env->GetByteArrayElements(*arr, NULL); |
|
|
|
memcpy(&(in6->sin6_addr.s6_addr), data, 16); |
|
|
|
memcpy(&(in6->sin6_addr.s6_addr), data, 16); |
|
|
|
(*env).ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
env->ReleaseByteArrayElements(*arr, (jbyte*)data, 0); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|