#![cfg(target_os = "linux")]
use libc::{c_char, c_int, dlsym, RTLD_NEXT};
use std::ffi::CStr;
static mut INTERCEPTING: bool = false;
static mut SEEN_SSL: bool = false;
#[no_mangle]
pub unsafe extern "C" fn open64(path: *const c_char, flags: c_int) -> c_int {
if unsafe { INTERCEPTING } {
let path_rust = CStr::from_ptr(path)
.to_str()
.expect("path is not valid utf-8");
if path_rust.contains("/ssl/") {
unsafe { SEEN_SSL = true };
}
println!("open64({path_rust:?}, ..)");
}
type Open64Fn = unsafe extern "C" fn(*const c_char, c_int) -> c_int;
let original_open64: Open64Fn = {
let ptr = dlsym(RTLD_NEXT, c"open64".as_ptr());
assert!(!ptr.is_null());
std::mem::transmute(ptr)
};
original_open64(path, flags)
}
pub fn have_seen_ssl_file() -> bool {
unsafe { SEEN_SSL }
}
pub fn reset_seen_ssl_file() {
unsafe {
SEEN_SSL = false;
INTERCEPTING = true;
}
}
pub fn assert_expected_seen_ssl_file() {
#[cfg(feature = "tls-native-roots")]
assert!(have_seen_ssl_file(), "Expected something to open a filename containing /ssl/ to load native certs, since `tls-native-roots` is enabled.");
#[cfg(not(feature = "tls-native-roots"))]
assert!(!have_seen_ssl_file(), "Did not expect anything to open a filename containing /ssl/ to load native certs, since `tls-native-roots` is not enabled.");
}