diff options
Diffstat (limited to 'src/rexmpp_dns.rs')
-rw-r--r-- | src/rexmpp_dns.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/rexmpp_dns.rs b/src/rexmpp_dns.rs new file mode 100644 index 0000000..1489835 --- /dev/null +++ b/src/rexmpp_dns.rs @@ -0,0 +1,62 @@ +use std::os::raw::{c_int, c_void, c_char}; +use libc::*; +use std::ptr; + +use super::rexmpp; + +type DNSQueryCB = unsafe extern "C" +fn (s: *mut rexmpp::Rexmpp, ptr: *mut c_void, result: *mut RexmppDNSResult) -> (); + +extern { + pub fn rexmpp_dns_resolve (s: *mut rexmpp::Rexmpp, + query: *const c_char, + rrtype: c_int, + rrclass: c_int, + ptr: *mut c_void, + callback: DNSQueryCB) -> c_int; + pub fn rexmpp_dns_process (s: *mut rexmpp::Rexmpp, + read_fds: *mut fd_set, + write_fds: *mut fd_set) -> c_int; + pub fn rexmpp_dns_fds (s: *mut rexmpp::Rexmpp, + read_fds: *mut fd_set, + write_fds: *mut fd_set) -> c_int; + pub fn rexmpp_dns_timeout (s: *mut rexmpp::Rexmpp, + max_tv: *mut timespec, + tv: *mut timespec) -> *mut timespec; +} + +#[repr(C)] +pub struct RexmppDNSResult { + pub data: *mut *mut c_void, + pub len: *mut c_int, + pub secure: bool +} + +#[repr(C)] +pub struct RexmppDNSSRV { + pub priority: u16, + pub weight: u16, + pub port: u16, + pub target: [c_char; 256] +} + + +#[no_mangle] +pub unsafe extern "C" +fn rexmpp_dns_result_free (result: *mut RexmppDNSResult) { + if (*result).data != ptr::null_mut() { + let mut i = 0; + let data_ptr: *mut *mut c_void = (*result).data; + while *(data_ptr.offset(i)) != ptr::null_mut() { + free(*(data_ptr.offset(i))); + i += 1; + } + free((*result).data as *mut c_void); + (*result).data = ptr::null_mut(); + } + if (*result).len != ptr::null_mut() { + free((*result).len as *mut c_void); + (*result).len = ptr::null_mut(); + } + free(result as *mut c_void); +} |