summaryrefslogtreecommitdiff
path: root/src/rexmpp_dns.rs
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2023-06-20 21:49:53 +0300
committerdefanor <defanor@uberspace.net>2023-06-20 21:49:53 +0300
commitc3cb19dec32ffae9e4f93c269b4e1d3504321643 (patch)
treed5c5bc4fc9582b01b68a4056a52a00692d77f5da /src/rexmpp_dns.rs
parentc12a24ef337889ed1f980cce2baf78ac6bd0ee93 (diff)
Add Rust versions of the TCP module and of a few structures
Diffstat (limited to 'src/rexmpp_dns.rs')
-rw-r--r--src/rexmpp_dns.rs62
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..8ea8f31
--- /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: c_int
+}
+
+#[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);
+}