1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use utils::{str_to_const_c, mut_c_to_string};
use libc::{malloc, free, c_char, c_void};
use ffi::{DNS_SERVICE_MAX_DOMAIN_NAME, DNSServiceConstructFullName};

pub fn dns_service_construct_fullname (service : &str,
                                       regtype : &str,
                                       domain  : &str) -> Option<String> {
    unsafe {
        let buffer = malloc (DNS_SERVICE_MAX_DOMAIN_NAME) as *mut c_char;
        let unsafe_service = str_to_const_c (service);
        let unsafe_regtype = str_to_const_c (regtype);
        let unsafe_domain = str_to_const_c (domain);

        match DNSServiceConstructFullName (buffer, unsafe_service, unsafe_regtype, unsafe_domain) {
            0 => {
                let fullname = mut_c_to_string (buffer);
                free (buffer as *mut c_void);
                Some (fullname)
            },
            _ => None,
        }
    }
}