Updated bindings

This commit is contained in:
Joseph Henry
2017-11-21 15:24:51 -08:00
parent d6fcdf5277
commit a4a5ea5c31
14 changed files with 636 additions and 33 deletions

View File

@@ -1,3 +1,29 @@
/*
* ZeroTier SDK - Network Virtualization Everywhere
* Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial closed-source software that incorporates or links
* directly against ZeroTier software without disclosing the source code
* of your own application.
*/
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@@ -40,7 +66,7 @@ int main(int argc, char **argv)
in4.sin_addr.s_addr = inet_addr(remote_addr.c_str()); in4.sin_addr.s_addr = inet_addr(remote_addr.c_str());
in4.sin_family = AF_INET; in4.sin_family = AF_INET;
// --- BEGIN // --- BEGIN EXAMPLE CODE
DEBUG_TEST("Waiting for libzt to come online...\n"); DEBUG_TEST("Waiting for libzt to come online...\n");
uint64_t nwid = strtoull(nwidstr.c_str(),NULL,16); uint64_t nwid = strtoull(nwidstr.c_str(),NULL,16);

View File

@@ -1,3 +1,29 @@
/*
* ZeroTier SDK - Network Virtualization Everywhere
* Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial closed-source software that incorporates or links
* directly against ZeroTier software without disclosing the source code
* of your own application.
*/
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@@ -36,7 +62,7 @@ int main(int argc, char **argv)
in4.sin_addr.s_addr = INADDR_ANY; in4.sin_addr.s_addr = INADDR_ANY;
in4.sin_family = AF_INET; in4.sin_family = AF_INET;
// --- BEGIN // --- BEGIN EXAMPLE CODE
DEBUG_TEST("Waiting for libzt to come online...\n"); DEBUG_TEST("Waiting for libzt to come online...\n");
uint64_t nwid = strtoull(nwidstr.c_str(),NULL,16); uint64_t nwid = strtoull(nwidstr.c_str(),NULL,16);

View File

@@ -0,0 +1,116 @@
/*
* ZeroTier SDK - Network Virtualization Everywhere
* Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial closed-source software that incorporates or links
* directly against ZeroTier software without disclosing the source code
* of your own application.
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <string>
#include <inttypes.h>
#if defined(__linux__) || defined(__APPLE__)
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#if defined(__MINGW32__) || defined(__MINGW64__)
#include <WinSock2.h>
#include <stdint.h>
#endif
#include "libzt.h"
char *msg = (char*)"welcome to the machine";
uint64_t generate_adhoc_nwid_from_port(int port)
{
std::string padding;
if(port < 10) {
padding = "000";
} else if(port < 100) {
padding = "00";
} else if(port < 1000) {
padding = "0";
}
// We will join ad-hoc network ffSSSSEEEE000000
// Where SSSS = start port
// EEEE = end port
padding = padding + std::to_string(port); // SSSS
std::string nwidstr = "ff" + padding + padding + "000000"; // ff + SSSS + EEEE + 000000
return strtoull(nwidstr.c_str(), NULL, 16);
}
int main(int argc, char **argv)
{
if (argc != 5) {
printf("\nlibzt example client\n");
printf("client [config_file_path] [nwid] [remote_addr] [remote_port]\n");
exit(0);
}
std::string path = argv[1];
std::string nwidstr = argv[2];
std::string remote_addr = argv[3];
int remote_port = atoi(argv[4]);
int r=0, w=0, err=0, sockfd;
char rbuf[32];
memset(rbuf, 0, sizeof rbuf);
struct sockaddr_in6 in6;
in6.sin6_port = htons(remote_port);
inet_pton(AF_INET6, remote_addr.c_str(), &(in6.sin6_addr));
in6.sin6_family = AF_INET6;
// --- BEGIN EXAMPLE CODE
DEBUG_TEST("Waiting for libzt to come online...\n");
uint64_t nwid = generate_adhoc_nwid_from_port(remote_port);
printf("nwid=%llx\n", nwid);
zts_startjoin(path.c_str(), nwid);
uint64_t nodeId = zts_get_node_id();
DEBUG_TEST("I am %llx", nodeId);
sleep(5);
if ((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = zts_connect(sockfd, (const struct sockaddr *)&in6, sizeof(in6))) < 0)
DEBUG_ERROR("error connecting to remote host (%d)", err);
DEBUG_TEST("sending to server...");
w = zts_write(sockfd, msg, strlen(msg));
DEBUG_TEST("reading from server...");
r = zts_read(sockfd, rbuf, strlen(msg));
DEBUG_TEST("Sent : %s", msg);
DEBUG_TEST("Received : %s", rbuf);
err = zts_close(sockfd);
return err;
}

View File

@@ -0,0 +1,124 @@
/*
* ZeroTier SDK - Network Virtualization Everywhere
* Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial closed-source software that incorporates or links
* directly against ZeroTier software without disclosing the source code
* of your own application.
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <string>
#if defined(__linux__) || defined(__APPLE__)
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#if defined(__MINGW32__) || defined(__MINGW64__)
#include <WinSock2.h>
#include <stdint.h>
#endif
#include "libzt.h"
uint64_t generate_adhoc_nwid_from_port(int port)
{
std::string padding;
if(port < 10) {
padding = "000";
} else if(port < 100) {
padding = "00";
} else if(port < 1000) {
padding = "0";
}
// We will join ad-hoc network ffSSSSEEEE000000
// Where SSSS = start port
// EEEE = end port
padding = padding + std::to_string(port); // SSSS
std::string nwidstr = "ff" + padding + padding + "000000"; // ff + SSSS + EEEE + 000000
return strtoull(nwidstr.c_str(), NULL, 16);
}
int main(int argc, char **argv)
{
if (argc != 4) {
printf("\nlibzt example server\n");
printf("server [config_file_path] [bind_port]\n");
exit(0);
}
std::string path = argv[1];
int bind_port = atoi(argv[2]);
uint64_t nwid = generate_adhoc_nwid_from_port(bind_port);
int w=0, r=0, err=0, sockfd, accfd;
char rbuf[32];
memset(rbuf, 0, sizeof rbuf);
struct sockaddr_in6 in6, acc_in6;
in6.sin6_port = htons(bind_port);
in6.sin6_family = AF_INET6;
in6.sin6_addr = in6addr_any;
fprintf(stderr, "nwid=%llx\n", nwid);
exit(-1);
// --- BEGIN EXAMPLE CODE
DEBUG_TEST("Waiting for libzt to come online...\n");
nwid = generate_adhoc_nwid_from_port(bind_port);
printf("nwid=%llx\n", nwid);
zts_startjoin(path.c_str(), nwid);
uint64_t nodeId = zts_get_node_id();
DEBUG_TEST("I am %llx", nodeId);
if ((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = zts_bind(sockfd, (struct sockaddr *)&in6, sizeof(struct sockaddr_in6)) < 0))
DEBUG_ERROR("error binding to interface (%d)", err);
if ((err = zts_listen(sockfd, 100)) < 0)
DEBUG_ERROR("error placing socket in LISTENING state (%d)", err);
socklen_t client_addrlen = sizeof(sockaddr_in6);
if ((accfd = zts_accept(sockfd, (struct sockaddr *)&acc_in6, &client_addrlen)) < 0)
DEBUG_ERROR("error accepting connection (%d)", err);
socklen_t peer_addrlen = sizeof(struct sockaddr_storage);
zts_getpeername(accfd, (struct sockaddr*)&acc_in6, &peer_addrlen);
//DEBUG_INFO("accepted connection from %s : %d", inet_ntoa(acc_in6.sin6_addr), ntohs(acc_in6.sin6_port));
DEBUG_TEST("reading from client...");
r = zts_read(accfd, rbuf, sizeof rbuf);
DEBUG_TEST("sending to client...");
w = zts_write(accfd, rbuf, strlen(rbuf));
DEBUG_TEST("Received : %s", rbuf);
err = zts_close(sockfd);
err = zts_close(accfd);
return err;
}

View File

@@ -0,0 +1,98 @@
/*
* ZeroTier SDK - Network Virtualization Everywhere
* Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial closed-source software that incorporates or links
* directly against ZeroTier software without disclosing the source code
* of your own application.
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <string>
#include <inttypes.h>
#if defined(__linux__) || defined(__APPLE__)
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#if defined(__MINGW32__) || defined(__MINGW64__)
#include <WinSock2.h>
#include <stdint.h>
#endif
#include "libzt.h"
char *msg = (char*)"welcome to the machine";
int main(int argc, char **argv)
{
if (argc != 5) {
printf("\nlibzt example client\n");
printf("client [config_file_path] [nwid] [remote_addr] [remote_port]\n");
exit(0);
}
std::string path = argv[1];
std::string nwidstr = argv[2];
std::string remote_addr = argv[3];
int remote_port = atoi(argv[4]);
int r=0, w=0, err=0, sockfd;
char rbuf[32];
memset(rbuf, 0, sizeof rbuf);
struct sockaddr_in6 in6;
in6.sin6_port = htons(remote_port);
inet_pton(AF_INET6, remote_addr.c_str(), &(in6.sin6_addr));
in6.sin6_family = AF_INET6;
// --- BEGIN EXAMPLE CODE
DEBUG_TEST("Waiting for libzt to come online...\n");
uint64_t nwid = strtoull(nwidstr.c_str(),NULL,16);
printf("nwid=%llx\n", nwid);
zts_startjoin(path.c_str(), nwid);
uint64_t nodeId = zts_get_node_id();
DEBUG_TEST("I am %llx", nodeId);
sleep(5);
if ((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = zts_connect(sockfd, (const struct sockaddr *)&in6, sizeof(in6))) < 0)
DEBUG_ERROR("error connecting to remote host (%d)", err);
DEBUG_TEST("sending to server...");
w = zts_write(sockfd, msg, strlen(msg));
DEBUG_TEST("reading from server...");
r = zts_read(sockfd, rbuf, strlen(msg));
DEBUG_TEST("Sent : %s", msg);
DEBUG_TEST("Received : %s", rbuf);
err = zts_close(sockfd);
return err;
}

View File

@@ -0,0 +1,103 @@
/*
* ZeroTier SDK - Network Virtualization Everywhere
* Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* --
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial closed-source software that incorporates or links
* directly against ZeroTier software without disclosing the source code
* of your own application.
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <string>
#if defined(__linux__) || defined(__APPLE__)
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#if defined(__MINGW32__) || defined(__MINGW64__)
#include <WinSock2.h>
#include <stdint.h>
#endif
#include "libzt.h"
int main(int argc, char **argv)
{
if (argc != 4) {
printf("\nlibzt example server\n");
printf("server [config_file_path] [nwid] [bind_port]\n");
exit(0);
}
std::string path = argv[1];
std::string nwidstr = argv[2];
int bind_port = atoi(argv[3]);
int w=0, r=0, err=0, sockfd, accfd;
char rbuf[32];
memset(rbuf, 0, sizeof rbuf);
struct sockaddr_in6 in6, acc_in6;
in6.sin6_port = htons(bind_port);
in6.sin6_family = AF_INET6;
in6.sin6_addr = in6addr_any;
// --- BEGIN EXAMPLE CODE
DEBUG_TEST("Waiting for libzt to come online...\n");
uint64_t nwid = strtoull(nwidstr.c_str(),NULL,16);
printf("nwid=%llx\n", nwid);
zts_startjoin(path.c_str(), nwid);
uint64_t nodeId = zts_get_node_id();
DEBUG_TEST("I am %llx", nodeId);
if ((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = zts_bind(sockfd, (struct sockaddr *)&in6, sizeof(struct sockaddr_in6)) < 0))
DEBUG_ERROR("error binding to interface (%d)", err);
if ((err = zts_listen(sockfd, 100)) < 0)
DEBUG_ERROR("error placing socket in LISTENING state (%d)", err);
socklen_t client_addrlen = sizeof(sockaddr_in6);
if ((accfd = zts_accept(sockfd, (struct sockaddr *)&acc_in6, &client_addrlen)) < 0)
DEBUG_ERROR("error accepting connection (%d)", err);
socklen_t peer_addrlen = sizeof(struct sockaddr_storage);
zts_getpeername(accfd, (struct sockaddr*)&acc_in6, &peer_addrlen);
//DEBUG_INFO("accepted connection from %s : %d", inet_ntoa(acc_in6.sin6_addr), ntohs(acc_in6.sin6_port));
DEBUG_TEST("reading from client...");
r = zts_read(accfd, rbuf, sizeof rbuf);
DEBUG_TEST("sending to client...");
w = zts_write(accfd, rbuf, strlen(rbuf));
DEBUG_TEST("Received : %s", rbuf);
err = zts_close(sockfd);
err = zts_close(accfd);
return err;
}

View File

@@ -28,6 +28,7 @@
import zerotier.ZeroTier; import zerotier.ZeroTier;
import java.net.*; import java.net.*;
import java.lang.Thread;
public class ExampleApp { public class ExampleApp {
@@ -45,23 +46,108 @@ public class ExampleApp {
new Thread(new Runnable() { new Thread(new Runnable() {
public void run() { public void run() {
System.out.println("starting libzt"); String path = "/Users/joseph/op/zt/libzt/ztjni";
//libzt.startjoin("config_path", "123456789abcdeff"); long nwid = 0xa09acf0233ac70fdL;
libzt.startjoin("/Users/joseph/op/zt/libzt/ztjni", "17d709436c2c5367");
System.out.println("started."); // METHOD 1 (easy)
// Blocking call that waits for the core, userspace stack and IP assignment before unblocking
if (true)
{
libzt.startjoin(path, nwid);
}
// METHOD 2
// Optionally-nonblocking call. You'll have to use the below process to determine when you
// are allowed to stack making socket calls. The advantage of this method is that you can
// get your nodeId before joining the network.
if (false) {
libzt.start(path, true);
// Wait for core service to start
while(!libzt.core_running()) {
try {
Thread.sleep(1000);
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
System.out.println("core started");
long nodeId = libzt.get_node_id();
System.out.println("nodeId=" + Long.toHexString(nodeId));
libzt.join(nwid);
// Wait for userspace stack to start, we trigger this by joining a network
while(!libzt.stack_running()) {
try {
Thread.sleep(1000);
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
System.out.println("core and stack started, now ready for socket API calls");
int num_addresses = libzt.get_num_assigned_addresses(nwid);
System.out.println("number of assigned addresses for this node on this network = " + String.valueOf(num_addresses));
// get IPv4 address
//InetAddress assigned = libzt.get_address(nwid, libzt.AF_INET6);
//System.out.println("assigned address = " + assigned.toString());
// get address at arbitrary (index < num_addresses)
//assigned = libzt.get_address_at_index(nwid, 0);
//System.out.println("assigned address = " + assigned.toString());
// get IPv6 address
//assigned = libzt.get_address(nwid, libzt.AF_INET6);
//System.out.println("assigned address = " + assigned.toString());
String homePath = libzt.get_path();
System.out.println("homePath=" + homePath);
while(!libzt.has_address(nwid)) {
try {
Thread.sleep(1000);
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
//InetAddress assigned = libzt.get_address(nwid);
//System.out.println("assigned address = " + assigned.toString());
int fd = 0, err = 0; int fd = 0, err = 0;
if ((fd = libzt.socket(libzt.AF_INET, libzt.SOCK_STREAM, 0)) < 0) { if ((fd = libzt.socket(libzt.AF_INET, libzt.SOCK_STREAM, 0)) < 0) {
System.out.println("error creating socket"); System.out.println("error creating socket");
return; return;
} }
System.out.println("Created socket");
InetSocketAddress addr = new InetSocketAddress("0.0.0.0", 3434); while(true)
{
try { Thread.sleep(3000); }
catch (InterruptedException e) { e.printStackTrace(); }
}
/*
InetSocketAddress remoteAddr = new InetSocketAddress("172.27.54.9", 3434);
if ((err = libzt.connect(fd, remoteAddr)) < 0) {
System.out.println("error connecting");
return;
}
*/
/*
InetSocketAddress localAddr = new InetSocketAddress("0.0.0.0", 3434);
if ((err = libzt.bind(fd, addr)) < 0) { if ((err = libzt.bind(fd, addr)) < 0) {
System.out.println("error binding socket to virtual interface"); System.out.println("error binding socket to virtual interface");
return; return;
} }
*/
} }
}).start(); }).start();

View File

@@ -11,8 +11,15 @@ endif
example_java_app: example_java_app:
javac *.java javac *.java
example_java_app_1.6:
javac -source 1.6 -bootclasspath /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64/jre/lib/rt.jar -target 1.6 *.java
copy_dynamic_lib: copy_dynamic_lib:
cp ../../../$(BUILD)/$(SHARED_LIB) . cp ../../../$(BUILD)/$(SHARED_LIB) .
jar:
jar cf libzt.jar libzt.dylib zerotier/ZeroTier.class
clean: clean:
-find . -type f \( -name '*.class' \) -delete -rm -rf *.jar *.dylib *.so
-find . -type f \( -name '*.class' \) -delete

View File

@@ -1,19 +1,24 @@
## ZeroTier with Java via JNI ## ZeroTier with Java via JNI
*** ***
To get this example project to work, do the following: ### Example App
- From libzt main directory, build shared library: `make shared_jni_lib` - From libzt main directory, build shared library: `make shared_jni_lib`
- Copy the resultant dynamic library (`*.so` or `*.dylib`) from `build/` to this current directory - Copy the resultant dynamic library (`*.so` or `*.dylib`) from `build/` to this current directory
- Change to this directory and `make example_java_app` - Change to this directory and `make example_java_app`
- Run: `java -cp "." ExampleApp` - Run: `java -cp "." ExampleApp`
### JAR file (with embedded C++ dynamic library)
```
make example_app
make jar
```
Notes: Notes:
Upon execution, it will load the libzt dynamic library via the `loadLibrary` method and begin generating an identity. Upon execution, it will load the libzt dynamic library via the `loadLibrary` method and begin generating an identity.
*** ***
More resources on JNI usage: More resources on JNI usage:

View File

@@ -29,10 +29,9 @@ package zerotier;
import java.net.*; import java.net.*;
public class ZeroTier { public class ZeroTier {
// socket families // socket families
public static int AF_UNIX = 1;
public static int AF_INET = 2; public static int AF_INET = 2;
public static int AF_INET6 = 30;
// socket types // socket types
public static int SOCK_STREAM = 1; public static int SOCK_STREAM = 1;
public static int SOCK_DGRAM = 2; public static int SOCK_DGRAM = 2;
@@ -45,33 +44,38 @@ public class ZeroTier {
// fcntl cmds // fcntl cmds
public static int F_GETFL = 3; public static int F_GETFL = 3;
public static int F_SETFL = 4; public static int F_SETFL = 4;
// basic service controls // service controls
public native void start(String homeDir, boolean blocking); public native void start(String homePath, boolean blocking);
public native void startjoin(String homeDir, String nwid); public native void startjoin(String homePath, long nwid);
public native void stop(); public native void stop();
public native boolean running(); public native boolean core_running();
public native void join(String nwid); public native boolean stack_running();
public native void leave(String nwid); public native boolean ready();
// advanced service controls public native int join(long nwid);
public native void get_path(); public native int leave(long nwid);
public native int get_id(); public native String get_path();
public native long get_node_id();
public native int get_num_assigned_addresses(long nwid);
public native InetAddress get_address_at_index(long nwid, int index);
public native boolean has_address(long nwid);
public native InetAddress get_address(long nwid, int address_family);
public native void get_6plane_addr(); public native void get_6plane_addr();
public native void get_rfc4193_addr(); public native void get_rfc4193_addr();
// socket API // socket API
public native int socket(int family, int type, int protocol); public native int socket(int family, int type, int protocol);
public native int connect(int fd, String addr, int port); public native int connect(int fd, InetSocketAddress addr);
public native int bind(int fd, InetSocketAddress addr); public native int bind(int fd, InetSocketAddress addr);
public native int listen(int fd, int backlog); public native int listen(int fd, int backlog);
public native int accept(int fd, Address addr); public native int accept(int fd, InetSocketAddress addr);
public native int accept4(int fd, String addr, int port); public native int accept4(int fd, String addr, int port);
public native int close(int fd); public native int close(int fd);
//public native int setsockopt(); //public native int setsockopt();
//public native int getsockopt(); //public native int getsockopt();
public native int sendto(int fd, byte[] buf, int len, int flags, InetSocketAddress addr);
public native int send(int fd, byte[] buf, int len, int flags);
public native int recvfrom(int fd, byte[] buf, int len, int flags, InetSocketAddress addr);
public native int read(int fd, byte[] buf, int len); public native int read(int fd, byte[] buf, int len);
public native int write(int fd, byte[] buf, int len); public native int write(int fd, byte[] buf, int len);
public native int sendto(int fd, byte[] buf, int len, int flags, Address addr);
public native int send(int fd, byte[] buf, int len, int flags);
public native int recvfrom(int fd, byte[] buf, int len, int flags, Address addr);
public native int shutdown(int fd, int how); public native int shutdown(int fd, int how);
//public native int getsockname(); //public native int getsockname();
//public native int getpeername(); //public native int getpeername();

View File

@@ -0,0 +1,6 @@
## Processing
***
See the [Java](../java) eample.
*NOTE: Currently Processing requires that any JAR file contain only code compiled against JDK 1.6*

View File

@@ -30,7 +30,7 @@ object ExampleApp extends App {
// load libzt.dylib or libzt.so // load libzt.dylib or libzt.so
System.loadLibrary("zt") System.loadLibrary("zt")
val libzt = new ZeroTier val libzt = new ZeroTier
libzt.startjoin("/Users/joseph/op/zt/libzt/ztjni", "1212121212121212") libzt.startjoin("/Users/joseph/op/zt/libzt/ztjni", 0xa09acf0232a930f7L)
val fd = libzt.socket(2, 1, 0) val fd = libzt.socket(2, 1, 0)
println(s"libzt.socket(): $fd") println(s"libzt.socket(): $fd")
} }

View File

@@ -32,14 +32,14 @@ class ZeroTier {
// socket types // socket types
// basic service controls // basic service controls
@native def start(path: String, blocking: Boolean): Int @native def start(path: String, blocking: Boolean): Int
@native def startjoin(path: String, nwid: String): Int @native def startjoin(path: String, nwid: Long): Int
@native def stop(): Unit @native def stop(): Unit
@native def running(): Int @native def running(): Int
@native def join(nwid: String): Unit @native def join(nwid: Long): Unit
@native def leave(nwid: String): Unit @native def leave(nwid: Long): Unit
// advanced service controls // advanced service controls
//@native def get_path(): Unit //@native def get_path(): Unit
//@native def get_id(): Int @native def get_node_id(): Long
//@native def get_6plane_addr(): Unit //@native def get_6plane_addr(): Unit
//@native def get_rfc4193_addr(): Unit //@native def get_rfc4193_addr(): Unit
// socket API // socket API

View File

@@ -2697,9 +2697,11 @@ int main(int argc , char *argv[])
exit(-1); exit(-1);
} }
uint64_t nwid = strtoull(argv[2],NULL,16); uint64_t nwid = strtoull(argv[2],NULL,16);
zts_start(argv[3], true);
zts_join(nwid);
uint64_t nodeId = zts_get_node_id(); uint64_t nodeId = zts_get_node_id();
zts_start(argv[3], true);
//zts_join(nwid);
//sleep(5);
DEBUG_TEST("generated id: %llx", nodeId); DEBUG_TEST("generated id: %llx", nodeId);
exit(0); exit(0);
} }