How do I create a Rust callback function to pass to a FFI function?

The Rust Programming Language, first edition, has a section about FFI titled Callbacks from C code to Rust functions.

The example from there is

extern "C" fn callback(a: i32) {
    println!("I'm called from C with value {0}", a);
}

#[link(name = "extlib")]
extern "C" {
    fn register_callback(cb: extern "C" fn(i32)) -> i32;
    fn trigger_callback();
}

fn main() {
    unsafe {
        register_callback(callback);
        trigger_callback(); // Triggers the callback
    }
}

For your specific case, you already know the specific type of function you need:

extern "C" fn mycallback(
    arg1: *mut Struct_mosquitto,
    arg2: *mut ::libc::c_void,
    arg3: ::libc::c_int,
) -> () {
    println!("I'm in Rust!");
}

And then use it like

mosquitto_connect_callback_set(mosq, Some(mycallback));

Leave a Comment