diff --git a/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate
index bf2c8bb..9707871 100644
Binary files a/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate and b/integrations/apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/integrations/apple/example_app/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/apple/example_app/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate
index 0db74a7..39c8cf1 100644
Binary files a/integrations/apple/example_app/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate and b/integrations/apple/example_app/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/integrations/apple/example_app/Example_OSX_App.xcodeproj/xcuserdata/Joseph.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/integrations/apple/example_app/Example_OSX_App.xcodeproj/xcuserdata/Joseph.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 0000000..1b3ff4f
--- /dev/null
+++ b/integrations/apple/example_app/Example_OSX_App.xcodeproj/xcuserdata/Joseph.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
diff --git a/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard b/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard
index 0a00bd1..e5fe78e 100644
--- a/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard
+++ b/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard
@@ -767,6 +767,9 @@
+
+
+
@@ -775,6 +778,9 @@
+
+
+
@@ -950,6 +956,7 @@
+
diff --git a/integrations/apple/example_app/Example_OSX_App/Example_OSX_App-Bridging-Header.h b/integrations/apple/example_app/Example_OSX_App/Example_OSX_App-Bridging-Header.h
index d2012ca..311657b 100644
--- a/integrations/apple/example_app/Example_OSX_App/Example_OSX_App-Bridging-Header.h
+++ b/integrations/apple/example_app/Example_OSX_App/Example_OSX_App-Bridging-Header.h
@@ -19,15 +19,16 @@ void zt_leave_network(const char *nwid);
// Direct Call ZT API
// These functions will provide direct access to ZT-enabled sockets with no hassle
+int zts_init_rpc(const char *path, const char *nwid);
int zts_connect(CONNECT_SIG);
-int zt_bind(BIND_SIG);
-int zt_accept(ACCEPT_SIG);
-int zt_listen(LISTEN_SIG);
+int zts_bind(BIND_SIG);
+int zts_accept(ACCEPT_SIG);
+int zts_listen(LISTEN_SIG);
int zts_socket(SOCKET_SIG);
-int zt_setsockopt(SETSOCKOPT_SIG);
-int zt_getsockopt(GETSOCKOPT_SIG);
-int zt_close(CLOSE_SIG);
-int zt_getsockname(GETSOCKNAME_SIG);
+int zts_setsockopt(SETSOCKOPT_SIG);
+int zts_getsockopt(GETSOCKOPT_SIG);
+int zts_close(CLOSE_SIG);
+int zts_getsockname(GETSOCKNAME_SIG);
#endif /* Example_OSX_Bridging_Header_h */
diff --git a/integrations/apple/example_app/Example_OSX_App/ViewController.swift b/integrations/apple/example_app/Example_OSX_App/ViewController.swift
index 723aeb5..af0a4ed 100644
--- a/integrations/apple/example_app/Example_OSX_App/ViewController.swift
+++ b/integrations/apple/example_app/Example_OSX_App/ViewController.swift
@@ -23,30 +23,108 @@ class ViewController: NSViewController {
@IBOutlet weak var txtRX: NSScrollView!
@IBOutlet weak var btnSend: NSButton!
-
+ var serverPort:Int32 = 4545
+ var serverAddr:String = "10.147.18.5"
+
+ @IBAction func txtAddrChanged(sender: AnyObject) {
+ if(sender.value != nil) {
+ serverAddr = sender.value
+ }
+ }
+
+ @IBAction func txtPortChanged(sender: AnyObject) {
+ serverPort = sender.intValue!
+ }
+
+ // Join a ZeroTier network
@IBAction func UI_JoinNetwork(sender: AnyObject) {
zt_join_network(txtNWID.stringValue);
}
+ // Leave a ZeroTier network
@IBAction func UI_LeaveNetwork(sender: AnyObject) {
zt_leave_network(txtNWID.stringValue);
}
+ // Select an API
+ var selectedShim:Int32 = 0
@IBAction func UI_SelectAPI(sender: AnyObject) {
+ selectedShim = sender.intValue // 0 = BSD-style, 1 = SOCKS5 Proxy, etc
}
+ // Select a protocol
+ // Protocol { TCP / UDP }
+ var selectedProtocol:Int32 = 0
@IBAction func UI_SelectProtocol(sender: AnyObject) {
- }
+ switch sender.intValue
+ {
+ case 0:
+ print("Selected TCP (SOCK_STREAM)\n");
+ selectedProtocol = SOCK_STREAM
+ case 1:
+ print("Selected UDP (SOCK_DGRAM)\n");
+ selectedProtocol = SOCK_DGRAM
+ default:
+ break;
+ } }
+ // Connect to remote host on ZeroTier virtual network
@IBAction func UI_Connect(sender: AnyObject) {
+ // TCP
+ if(selectedProtocol == SOCK_STREAM)
+ {
+ let sd = zts_socket(AF_INET, SOCK_STREAM, 0)
+ var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
+ sin_family: UInt8(AF_INET),
+ sin_port: UInt16(serverPort).bigEndian,
+ sin_addr: in_addr(s_addr: 0),
+ sin_zero: (0,0,0,0,0,0,0,0))
+
+ inet_pton(AF_INET, serverAddr, &(addr.sin_addr));
+
+ let connect_fd = zts_connect(sd, UnsafePointer([addr]), UInt32(addr.sin_len))
+ print("connect_fd = \(connect_fd),\(errno)")
+
+ if connect_fd < 0 {
+ let err = errno
+ print("Error connecting IPv4 socket \(err)")
+ return
+ }
+ }
+
+ // UDP
+ if(selectedProtocol == SOCK_DGRAM)
+ {
+
+ }
}
@IBAction func UI_Bind(sender: AnyObject) {
}
@IBAction func UI_SendData(sender: AnyObject) {
+
}
+ /*
+ // Mode { Client / Server }
+ @IBOutlet weak var ModeControl: UISegmentedControl!
+ var selectedMode:UInt16 = 0
+ @IBAction func ModeControlSelected(sender: AnyObject) {
+ switch sender.selectedSegmentIndex
+ {
+ case 0:
+ print("Selected client\n");
+ selectedMode = 0
+ case 1:
+ print("Selected server\n");
+ selectedMode = 1
+ default:
+ break;
+ }
+ }
+
+ */
var service_thread : NSThread!
@@ -67,7 +145,9 @@ class ViewController: NSViewController {
self.service_thread = NSThread(target:self, selector:"ztnc_start_service", object:nil)
self.service_thread.start()
});
- // Do any additional setup after loading the view.
+
+ // Set RPC path for this thread
+ zts_init_rpc("/Users/Joseph/utest3/nc_","e5cd7a9e1c2e194f");
}
override var representedObject: AnyObject? {
diff --git a/src/SDK_RPC.c b/src/SDK_RPC.c
index a47eb41..a0b8573 100644
--- a/src/SDK_RPC.c
+++ b/src/SDK_RPC.c
@@ -107,7 +107,7 @@ int get_retval(int rpc_sock)
int load_symbols_rpc()
{
-#if defined(SDK_INTERCEPT) || defined(__IOS__) || defined(__UNITY_3D__)
+#if defined(SDK_BUNDLED) || defined(__IOS__) || defined(__UNITY_3D__)
realsocket = dlsym(RTLD_NEXT, "socket");
realconnect = dlsym(RTLD_NEXT, "connect");
if(!realconnect || !realsocket)
@@ -157,7 +157,9 @@ int rpc_send_command(char *path, int cmd, int forfd, void *data, int len)
memcpy(CANARY+CANARY_SZ, padding, sizeof(padding));
uint64_t canary_num;
// ephemeral RPC socket used only for this command
+ printf("calling rpc_join");
int rpc_sock = rpc_join(path);
+ printf("fin\n");
// Generate token
int fdrand = open("/dev/urandom", O_RDONLY);
if(read(fdrand, &CANARY, CANARY_SZ) < 0) {
diff --git a/src/SDK_Sockets.c b/src/SDK_Sockets.c
index 1f835e2..c32d4b0 100644
--- a/src/SDK_Sockets.c
+++ b/src/SDK_Sockets.c
@@ -88,7 +88,7 @@ int (*realclose)(CLOSE_SIG);
dwr(MSG_DEBUG, "zt_init_rpc\n");
// Just double check we have
if(!realconnect) {
- //load_symbols();
+ load_symbols_rpc();
}
if(!api_netpath) {
@@ -353,6 +353,7 @@ int (*realclose)(CLOSE_SIG);
#endif
#endif
/* -1 is passed since we we're generating the new socket in this call */
+ printf("path = %s\n", api_netpath);
int err = rpc_send_command(api_netpath, RPC_SOCKET, -1, &rpc_st, sizeof(struct socket_st));
dwr(MSG_DEBUG," socket() = %d\n", err);
return err;
diff --git a/src/SDK_XcodeWrapper.cpp b/src/SDK_XcodeWrapper.cpp
index 9b06bfd..3c8a136 100755
--- a/src/SDK_XcodeWrapper.cpp
+++ b/src/SDK_XcodeWrapper.cpp
@@ -32,30 +32,33 @@ extern "C" void zt_leave_network(const char * nwid){
}
// Explicit ZT API wrappers
-extern "C" int zt_socket(SOCKET_SIG) {
+extern "C" void zts_init_rpc(const char *path, const char *nwid) {
+ zt_init_rpc(path, nwid);
+}
+extern "C" int zts_socket(SOCKET_SIG) {
return zt_socket(socket_family, socket_type, protocol);
}
extern "C" int zts_connect(CONNECT_SIG) {
return zt_connect(__fd, __addr, __len);
}
-extern "C" int zt_bind(BIND_SIG){
+extern "C" int zts_bind(BIND_SIG){
return zt_bind(sockfd, addr, addrlen);
}
-extern "C" int zt_accept(ACCEPT_SIG) {
+extern "C" int zts_accept(ACCEPT_SIG) {
return zt_accept(sockfd, addr, addrlen);
}
-extern "C" int zt_listen(LISTEN_SIG) {
+extern "C" int zts_listen(LISTEN_SIG) {
return zt_listen(sockfd, backlog);
}
-extern "C" int zt_setsockopt(SETSOCKOPT_SIG) {
+extern "C" int zts_setsockopt(SETSOCKOPT_SIG) {
return zt_setsockopt(socket, level, option_name, option_value, option_len);
}
-extern "C" int zt_getsockopt(GETSOCKOPT_SIG) {
+extern "C" int zts_getsockopt(GETSOCKOPT_SIG) {
return zt_getsockopt(sockfd, level, optname, optval, optlen);
}
-extern "C" int zt_close(CLOSE_SIG) {
+extern "C" int zts_close(CLOSE_SIG) {
return zt_close(fd);
}
-extern "C" int zt_getsockname(GETSOCKNAME_SIG) {
+extern "C" int zts_getsockname(GETSOCKNAME_SIG) {
return zt_getsockname(sockfd, addr, addrlen);
}