zt_get_address() implementation

This commit is contained in:
Joseph Henry
2016-08-08 12:31:06 -07:00
parent d4b88afa90
commit e1fb64bc6f
7 changed files with 77 additions and 17 deletions

View File

@@ -139,6 +139,8 @@ namespace ZeroTier {
bool addIp(const InetAddress &ip);
bool removeIp(const InetAddress &ip);
std::vector<InetAddress> ips() const;
std::vector<InetAddress> _ips;
void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len);
std::string deviceName() const;
void setFriendlyName(const char *friendlyName);
@@ -497,7 +499,6 @@ namespace ZeroTier {
std::vector<MulticastGroup> _multicastGroups;
Mutex _multicastGroups_m;
std::vector<InetAddress> _ips;
Mutex _ips_m, _tcpconns_m, _rx_buf_m, _close_m;
unsigned int _mtu;

View File

@@ -46,6 +46,7 @@
#include "Utils.hpp"
#include "OSUtils.hpp"
#include "SDK_EthernetTap.hpp"
#include "SDK.h"
#include "SDK_Debug.h"
#include "SDK_ServiceSetup.hpp"
@@ -111,6 +112,20 @@ void zts_leave_network(const char * nwid) { zt1Service->leave(nwid); }
bool zts_is_running() { return zt1Service->isRunning(); }
void zts_terminate() { zt1Service->terminate(); }
std::vector<std::string> zt_get_addresses(std::string nwid)
{
uint64_t nwid_int = strtoull(nwid.c_str(), NULL, 16);
ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int];
std::vector<std::string> ip_strings;
if(tap) {
for(int i=0; i<tap->_ips.size(); i++) {
ip_strings.push_back(tap->_ips[i].toString());
}
return ip_strings;
}
return ip_strings;
}
// Android JNI wrapper
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
@@ -138,9 +153,27 @@ void zts_terminate() { zt1Service->terminate(); }
if(zt1Service)
zts_terminate();
}
JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid) {
const char *nwid_str = env->GetStringUTFChars(nwid, NULL);
std::vector<std::string> address_strings = zt_get_addresses(nwid_str);
jclass clazz = (*env).FindClass("java/util/ArrayList");
jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V"));
if(address_strings.size()) {
for (int n=0;n<address_strings.size();n++) {
jstring _str = (*env).NewStringUTF(address_strings[n].c_str());
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
}
}
else { // Add dummy value
jstring _str = (*env).NewStringUTF("-1.-1.-1.-1/-1");
env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str);
}
return addresses;
}
#endif
// Typically used on iOS/OSX
#if !defined(__ANDROID__)
/*

View File

@@ -33,12 +33,14 @@ extern "C" {
#include <jni.h>
#endif
#include <vector>
#ifndef ONE_SERVICE_SETUP_HPP
#define ONE_SERVICE_SETUP_HPP
#define INTERCEPT_ENABLED 111
#define INTERCEPT_DISABLED 222
#if defined(__ANDROID__)
// JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME
/* If you define anything else in this file it that you wish to expose to your Android
@@ -47,6 +49,7 @@ extern "C" {
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid);
JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid);
JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1running(JNIEnv *env, jobject thisObj);
JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid);
#else
void init_service(int key, const char * path);
void init_service_and_rpc(int key, const char * path, const char * nwid);
@@ -64,7 +67,7 @@ void zts_join_network(const char * nwid);
void zts_leave_network(const char * nwid);
bool zts_is_running();
void zts_terminate();
std::vector<std::string> zt_get_addresses(std::string nwid);
#endif