summaryrefslogtreecommitdiff
path: root/examples/java/ZeroTierHelloWorld
diff options
context:
space:
mode:
Diffstat (limited to 'examples/java/ZeroTierHelloWorld')
-rw-r--r--examples/java/ZeroTierHelloWorld/.classpath10
-rw-r--r--examples/java/ZeroTierHelloWorld/.project17
-rw-r--r--examples/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs11
-rw-r--r--examples/java/ZeroTierHelloWorld/README.md2
-rw-r--r--examples/java/ZeroTierHelloWorld/bin/.gitignore2
-rw-r--r--examples/java/ZeroTierHelloWorld/bin/MyClass.classbin0 -> 1176 bytes
-rw-r--r--examples/java/ZeroTierHelloWorld/src/MyClass.java40
-rw-r--r--examples/java/ZeroTierHelloWorld/src/zerotier/Address.java84
-rw-r--r--examples/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java205
9 files changed, 371 insertions, 0 deletions
diff --git a/examples/java/ZeroTierHelloWorld/.classpath b/examples/java/ZeroTierHelloWorld/.classpath
new file mode 100644
index 0000000..ac1a9db
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="/Users/Joseph/op/code/zerotier/ZeroTierSDK/examples/java/ZeroTierHelloWorld/lib"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/examples/java/ZeroTierHelloWorld/.project b/examples/java/ZeroTierHelloWorld/.project
new file mode 100644
index 0000000..424ba61
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>ZeroTierHelloWorld</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs b/examples/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a21537
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/java/ZeroTierHelloWorld/README.md b/examples/java/ZeroTierHelloWorld/README.md
new file mode 100644
index 0000000..a670a6d
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/README.md
@@ -0,0 +1,2 @@
+ZeroTierSDK Java API
+====== \ No newline at end of file
diff --git a/examples/java/ZeroTierHelloWorld/bin/.gitignore b/examples/java/ZeroTierHelloWorld/bin/.gitignore
new file mode 100644
index 0000000..0d2fe9b
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/bin/.gitignore
@@ -0,0 +1,2 @@
+/MyClass$1.class
+/zerotier/
diff --git a/examples/java/ZeroTierHelloWorld/bin/MyClass.class b/examples/java/ZeroTierHelloWorld/bin/MyClass.class
new file mode 100644
index 0000000..fff559f
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/bin/MyClass.class
Binary files differ
diff --git a/examples/java/ZeroTierHelloWorld/src/MyClass.java b/examples/java/ZeroTierHelloWorld/src/MyClass.java
new file mode 100644
index 0000000..d71377d
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/src/MyClass.java
@@ -0,0 +1,40 @@
+// Hello World example for the ZeroTierSDK
+
+import zerotier.*;
+
+public class MyClass {
+
+ public native int loadsymbols();
+ public native void startOneService();
+
+ static {
+ System.loadLibrary("zt");
+ }
+
+ public static void main(String[] args) {
+
+ System.out.println("Welcome to the Machine");
+
+ final ZeroTier z = new ZeroTier();
+
+ new Thread(new Runnable() {
+ public void run() {
+ // Calls to JNI code
+ z.start("/Users/Joseph/op/code/zerotier/ZeroTierSDK/zt1");
+ }
+ }).start();
+
+ //while(!z.running()) { }
+
+ while(true)
+ {
+ try {
+ System.out.println("Welcome to the Machine");
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/examples/java/ZeroTierHelloWorld/src/zerotier/Address.java b/examples/java/ZeroTierHelloWorld/src/zerotier/Address.java
new file mode 100644
index 0000000..2400c91
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/src/zerotier/Address.java
@@ -0,0 +1,84 @@
+package zerotier;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.regex.Pattern;
+
+/*
+
+The ZTAddress object is merely a convenience object for moving address information
+across the JNI memory border.
+
+*/
+
+public class Address
+{
+ // int -> byte array
+ static public byte[] toIPByteArray(long addr){
+ return new byte[]{(byte)addr,(byte)(addr>>>8),(byte)(addr>>>16),(byte)(addr>>>24)};
+ }
+
+ // byte array -> int
+ long toIPInt(String _addr) {
+ long result = 0;
+ for(String part: _addr.split(Pattern.quote("."))) {
+ result = result << 8;
+ result |= Integer.parseInt(part);
+ }
+ return result;
+ }
+
+ public int port;
+ public int Port() {
+ return port;
+ }
+
+ public long _rawAddr;
+ public String Address()
+ {
+ try {
+ return InetAddress.getByAddress(toIPByteArray(_rawAddr)).getHostAddress();
+ } catch (UnknownHostException e) {
+ // should never happen
+ return null;
+ }
+ }
+
+ public String toString() {
+ return Address() + ":" + Port();
+ }
+
+ public Address()
+ {
+ port = -1;
+ _rawAddr = -1;
+ }
+
+ public Address(String _addr, int _port)
+ {
+ _rawAddr = toIPInt(_addr);
+ port = _port;
+ }
+
+ public void ZTAddress(InetSocketAddress ins)
+ {
+ port = ins.getPort();
+ _rawAddr = toIPInt(ins.getAddress().getHostAddress());
+ }
+
+ public InetSocketAddress ToInetSocketAddress() throws IllegalArgumentException {
+ InetSocketAddress sock_addr = null;
+ try {
+ sock_addr = new InetSocketAddress(Address(), port);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ }
+ return sock_addr;
+ }
+
+ public boolean isValid() {
+ return port != -1 && !Address().startsWith("-1.-1.-1.-1/-1");
+ }
+} \ No newline at end of file
diff --git a/examples/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java b/examples/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java
new file mode 100644
index 0000000..b312f25
--- /dev/null
+++ b/examples/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java
@@ -0,0 +1,205 @@
+/*
+ * ZeroTier One - Network Virtualization Everywhere
+ * Copyright (C) 2011-2015 ZeroTier, Inc.
+ *
+ * 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/>.
+ *
+ * --
+ *
+ * ZeroTier may be used and distributed under the terms of the GPLv3, which
+ * are available at: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * If you would like to embed ZeroTier into a commercial application or
+ * redistribute it in a modified binary form, please contact ZeroTier Networks
+ * LLC. Start here: http://www.zerotier.com/
+ */
+
+package zerotier;
+
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.zip.ZipError;
+
+public class ZeroTier {
+
+ public static String Version()
+ {
+ return "1.2.2";
+ }
+
+ // Socket families
+ public static int AF_UNIX = 1;
+ public static int AF_INET = 2;
+
+ // Socket types
+ public static int SOCK_STREAM = 1;
+ public static int SOCK_DGRAM = 2;
+
+ // fcntl flags
+ public static int O_APPEND = 1024;
+ public static int O_NONBLOCK = 2048;
+ public static int O_ASYNC = 8192;
+ public static int O_DIRECT = 65536;
+ public static int O_NOATIME = 262144;
+
+ // fcntl cmds
+ public static int F_GETFL = 3;
+ public static int F_SETFL = 4;
+
+ // Loads JNI code
+ static { System.loadLibrary("zt"); }
+
+ // ZeroTier service controls
+ public native void ztjni_start(String homeDir);
+ public void start(String homeDir) {
+ ztjni_start(homeDir);
+ }
+
+ public native void ztjni_join(String nwid);
+ public void join(String nwid) {
+ ztjni_join(nwid);
+ }
+
+ public native void ztjni_leave(String nwid);
+ public void leave(String nwid) {
+ ztjni_leave(nwid);
+ }
+
+ public native ArrayList<String> ztjni_get_addresses(String nwid);
+ public ArrayList<String> get_addresses(String nwid) {
+ int err = -1;
+ ArrayList<String> addresses;
+ while (err < 0) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ addresses = ztjni_get_addresses(nwid);
+ if (addresses.size() > 0) {
+ return addresses;
+ }
+ }
+ return null;
+ }
+
+ public native boolean ztjni_running();
+ public boolean running() {
+ return ztjni_running();
+ }
+
+ public native int ztjni_socket(int family, int type, int protocol);
+ public int socket(int family, int type, int protocol) {
+ return ztjni_socket(family, type, protocol);
+ }
+
+ public native int ztjni_connect(int fd, String addr, int port);
+
+ public int connect(int sock, Address zaddr, String nwid) {
+ return connect(sock, zaddr.Address(), zaddr.Port(), nwid);
+ }
+
+ public int connect(int sock, String addr, int port, String nwid)
+ {
+ int err = -1;
+ ArrayList<String> addresses;
+ while (err < 0) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ addresses = ztjni_get_addresses(nwid);
+ if (addresses.size() > 0) {
+ if(!addresses.get(0).startsWith("-1.-1.-1.-1/-1")) {
+ err = ztjni_connect(sock, addr, port);
+ }
+ }
+ }
+ return err;
+ }
+
+ public native int ztjni_bind(int fd, String addr, int port);
+
+ public int bind(int sock, Address zaddr, String nwid) {
+ return bind(sock, zaddr.Address(), zaddr.Port(), nwid);
+ }
+ public int bind(int sock, String addr, int port, String nwid) {
+ int err = -1;
+ ArrayList<String> addresses;
+ while (err < 0) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ addresses = ztjni_get_addresses(nwid);
+ if (addresses.size() > 0) {
+ if(!addresses.get(0).startsWith("-1.-1.-1.-1/-1")) {
+ err = ztjni_bind(sock, addr, port);
+ }
+ }
+ }
+ return err;
+ }
+
+ public native int ztjni_accept4(int fd, String addr, int port);
+ public int accept4(int fd, String addr, int port) {
+ return ztjni_accept4(fd,addr,port);
+ }
+
+ public native int ztjni_accept(int fd, zerotier.Address addr);
+ public int accept(int fd, zerotier.Address addr) {
+ return ztjni_accept(fd, addr);
+ }
+
+ public native int ztjni_listen(int fd, int backlog);
+ public int listen(int fd, int backlog) {
+ return ztjni_listen(fd,backlog);
+ }
+
+ public native int ztjni_close(int fd);
+ public int close(int fd) {
+ return ztjni_close(fd);
+ }
+
+ public native int ztjni_read(int fd, byte[] buf, int len);
+ public int read(int fd, byte[] buf, int len) {
+ return ztjni_read(fd, buf, len);
+ }
+
+ public native int ztjni_write(int fd, byte[] buf, int len);
+ public int write(int fd, byte[] buf, int len) {
+ return ztjni_write(fd, buf, len);
+ }
+
+ public native int ztjni_sendto(int fd, byte[] buf, int len, int flags, zerotier.Address addr);
+ public int sendto(int fd, byte[] buf, int len, int flags, zerotier.Address addr){
+ return ztjni_sendto(fd,buf,len,flags,addr);
+ }
+
+ public native int ztjni_send(int fd, byte[] buf, int len, int flags);
+ public int send(int fd, byte[] buf, int len, int flags) {
+ return ztjni_send(fd, buf, len, flags);
+ }
+
+ public native int ztjni_recvfrom(int fd, byte[] buf, int len, int flags, zerotier.Address addr);
+ public int recvfrom(int fd, byte[] buf, int len, int flags, zerotier.Address addr){
+ return ztjni_recvfrom(fd,buf,len,flags,addr);
+ }
+
+ public native int ztjni_fcntl(int sock, int cmd, int flag);
+ public int fcntl(int sock, int cmd, int flag) {
+ return ztjni_fcntl(sock, F_SETFL, O_NONBLOCK);
+ }
+} \ No newline at end of file