From cbfa12a9213eb774b3a83bbbea0a52011e0469bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Mon, 21 Oct 2019 16:34:15 -0400 Subject: [PATCH] rust: add permanent put, get_id(), get_node_id(), get_public_addresses() --- rust/Cargo.toml | 3 ++- rust/examples/dhtnode.rs | 4 +++- rust/src/dhtrunner.rs | 48 +++++++++++++++++++++++++++++++++++++++- rust/src/ffi.rs | 9 ++++++++ rust/src/lib.rs | 1 + rust/src/value.rs | 6 +++++ 6 files changed, 68 insertions(+), 3 deletions(-) diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 7b21d7fd..666c8c14 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -7,4 +7,5 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -libc="0.2.0" \ No newline at end of file +libc="0.2.0" +os_socketaddr="0.1.0" \ No newline at end of file diff --git a/rust/examples/dhtnode.rs b/rust/examples/dhtnode.rs index c2eee7e1..39f222e9 100644 --- a/rust/examples/dhtnode.rs +++ b/rust/examples/dhtnode.rs @@ -49,12 +49,14 @@ fn main() { }; dht.put(&InfoHash::get("bob"), Value::new("hi!"), &mut put_done_cb); + println!("Start listening /foo"); let mut value_cb = |v, expired| { println!("LISTEN: DONE CB - data: {} - v: {} - expired: {}", data, v, expired); }; let token = dht.listen(&InfoHash::get("foo"), &mut value_cb); - let one_min = time::Duration::from_secs(60); + let one_min = time::Duration::from_secs(10); thread::sleep(one_min); dht.cancel_listen(&InfoHash::get("foo"), token); + println!("Public ips: {:#?}", dht.public_addresses()); } \ No newline at end of file diff --git a/rust/src/dhtrunner.rs b/rust/src/dhtrunner.rs index 051ca80c..697e20a4 100644 --- a/rust/src/dhtrunner.rs +++ b/rust/src/dhtrunner.rs @@ -23,6 +23,8 @@ use std::ffi::CString; use std::ptr; pub use crate::ffi::*; +use std::net::SocketAddr; +use os_socketaddr::OsSocketAddr; impl DhtRunnerConfig { @@ -154,7 +156,7 @@ extern fn listen_handler(v: *mut Value, expired: bool, ptr: *mut c_void) { extern fn listen_handler_done(ptr: *mut c_void) { unsafe { - let handler = Box::from_raw(ptr as *mut ListenHandler); + Box::from_raw(ptr as *mut ListenHandler); } } @@ -185,6 +187,18 @@ impl DhtRunner { } } + pub fn node_id(&self) -> InfoHash { + unsafe { + dht_runner_get_node_id(&*self) + } + } + + pub fn id(&self) -> InfoHash { + unsafe { + dht_runner_get_id(&*self) + } + } + pub fn get<'a>(&mut self, h: &InfoHash, get_cb: &'a mut(dyn FnMut(Box<Value>)), done_cb: &'a mut(dyn FnMut(bool))) { @@ -209,6 +223,23 @@ impl DhtRunner { } } + pub fn permanent_put<'a>(&mut self, h: &InfoHash, v: Box<Value>, + done_cb: &'a mut(dyn FnMut(bool))) { + let handler = Box::new(PutHandler { + done_cb, + }); + let handler = Box::into_raw(handler) as *mut c_void; + unsafe { + dht_runner_put_permanent(&mut *self, h, &*v, put_handler_done, handler) + } + } + + pub fn cancel_put<'a>(&mut self, h: &InfoHash, vid: u64) { + unsafe { + dht_runner_cancel_put(&mut *self, h, vid) + } + } + pub fn listen<'a>(&mut self, h: &InfoHash, cb: &'a mut(dyn FnMut(Box<Value>, bool))) -> Box<OpToken> { let handler = Box::new(ListenHandler { @@ -234,6 +265,21 @@ impl DhtRunner { dht_runner_shutdown(&mut *self, done_cb, cb_user_data) } } + + pub fn public_addresses(&self) -> Vec<SocketAddr> { + let mut result = Vec::new(); + unsafe { + let mut addresses = dht_runner_get_public_address(&*self); + while !addresses.is_null() && !(*addresses).is_null() { + let sock = (*(*addresses)).into_addr(); + if sock.is_some() { + result.push(sock.unwrap()); + } + addresses = (addresses as usize + std::mem::size_of::<*mut OsSocketAddr>()) as *mut *mut OsSocketAddr; + } + } + result + } } impl Drop for DhtRunner { diff --git a/rust/src/ffi.rs b/rust/src/ffi.rs index 1162ff31..7708f2c5 100644 --- a/rust/src/ffi.rs +++ b/rust/src/ffi.rs @@ -19,6 +19,7 @@ #![allow(dead_code)] use libc::{c_char, c_int, c_uint, c_void, in_port_t, size_t}; +use os_socketaddr::OsSocketAddr; const HASH_LEN: usize = 20; const PKID_LEN: usize = 32; @@ -126,6 +127,7 @@ pub struct DhtRunnerConfig #[link(name = "opendht-c")] extern { // dht::Value + pub fn dht_value_get_id(data: *const Value) -> u64; pub fn dht_value_get_data(data: *const Value) -> DataView; pub fn dht_value_new(data: *const u8, size: size_t) -> *mut Value; pub fn dht_value_ref(data: *const Value) -> *mut Value; @@ -166,6 +168,8 @@ extern { // dht::DhtRunner pub fn dht_runner_config_default(config: *mut DhtRunnerConfig); pub fn dht_runner_new() -> *mut DhtRunner; + pub fn dht_runner_get_id(dht: *const DhtRunner) -> InfoHash; + pub fn dht_runner_get_node_id(dht: *const DhtRunner) -> InfoHash; pub fn dht_runner_delete(dht: *mut DhtRunner); pub fn dht_runner_run(dht: *mut DhtRunner, port: in_port_t); pub fn dht_runner_run_config(dht: *mut DhtRunner, port: in_port_t, config: *const DhtRunnerConfig); @@ -177,6 +181,10 @@ extern { pub fn dht_runner_put(dht: *mut DhtRunner, h: *const InfoHash, v: *const Value, done_cb: extern fn(bool, *mut c_void), cb_user_data: *mut c_void); + pub fn dht_runner_put_permanent(dht: *mut DhtRunner, h: *const InfoHash, v: *const Value, + done_cb: extern fn(bool, *mut c_void), + cb_user_data: *mut c_void); + pub fn dht_runner_cancel_put(dht: *mut DhtRunner, h: *const InfoHash, vid: u64); pub fn dht_runner_listen(dht: *mut DhtRunner, h: *const InfoHash, cb: extern fn(*mut Value, bool, *mut c_void), done_cb: extern fn(*mut c_void), @@ -185,4 +193,5 @@ extern { token: *const OpToken); pub fn dht_runner_shutdown(dht: *mut DhtRunner, done_cb: extern fn(bool, *mut c_void), cb_user_data: *mut c_void); + pub fn dht_runner_get_public_address(dht: *const DhtRunner) -> *mut *mut OsSocketAddr; } \ No newline at end of file diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 4742e986..53005389 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -17,6 +17,7 @@ */ extern crate libc; +extern crate os_socketaddr; mod blob; pub mod crypto; diff --git a/rust/src/value.rs b/rust/src/value.rs index 6b3c0221..4ce880ab 100644 --- a/rust/src/value.rs +++ b/rust/src/value.rs @@ -31,6 +31,12 @@ impl Value { } } + pub fn id(&self) -> u64 { + unsafe { + dht_value_get_id(self) + } + } + fn dataview(&self) -> DataView { unsafe { dht_value_get_data(self) -- GitLab