FLOG to stop depending on the ffi

Prior to this commit, FLOG used the ffi bridge to get the output fd. Invert
this: have fish set the output fd within main. This allows FLOG to be used in
pure Rust tests.
This commit is contained in:
ridiculousfish
2023-07-03 12:57:41 -07:00
parent 052823c120
commit 37fed01642
4 changed files with 23 additions and 5 deletions

View File

@@ -71,7 +71,6 @@
generate!("make_pipes_ffi")
generate!("get_flog_file_fd")
generate!("log_extra_to_flog_file")
generate!("fish_wcwidth")

View File

@@ -13,6 +13,7 @@ mod ffi2 {
extern "Rust" {
fn rust_init();
fn rust_activate_flog_categories_by_pattern(wc_ptr: wcharz_t);
fn rust_set_flog_file_fd(fd: i32);
fn rust_invalidate_numeric_locale();
}
}
@@ -29,6 +30,11 @@ fn rust_activate_flog_categories_by_pattern(wc_ptr: wcharz_t) {
crate::flog::activate_flog_categories_by_pattern(wc_ptr.into());
}
/// FFI bridge for setting FLOG file descriptor.
fn rust_set_flog_file_fd(fd: i32) {
crate::flog::set_flog_file_fd(fd as libc::c_int);
}
/// FFI bridge to invalidate cached locale bits.
fn rust_invalidate_numeric_locale() {
locale::invalidate_numeric_locale();

View File

@@ -1,11 +1,12 @@
use crate::ffi::{get_flog_file_fd, wildcard_match};
use crate::ffi::wildcard_match;
use crate::parse_util::parse_util_unescape_wildcards;
use crate::wchar::{widestrs, wstr, WString};
use crate::wchar_ext::WExt;
use crate::wchar_ffi::WCharToFFI;
use libc::c_int;
use std::io::Write;
use std::os::unix::io::{FromRawFd, IntoRawFd, RawFd};
use std::sync::atomic::Ordering;
use std::os::unix::io::{FromRawFd, IntoRawFd};
use std::sync::atomic::{AtomicI32, Ordering};
#[rustfmt::skip::macros(category)]
#[widestrs]
@@ -162,7 +163,7 @@ fn to_flog_str(&self) -> String {
/// Write to our FLOG file.
pub fn flog_impl(s: &str) {
let fd = get_flog_file_fd().0 as RawFd;
let fd = get_flog_file_fd();
if fd < 0 {
return;
}
@@ -240,3 +241,14 @@ pub fn activate_flog_categories_by_pattern(wc_ptr: &wstr) {
}
}
}
/// The flog output fd. Defaults to stderr. A value < 0 disables flog.
static FLOG_FD: AtomicI32 = AtomicI32::new(libc::STDERR_FILENO);
pub fn set_flog_file_fd(fd: c_int) {
FLOG_FD.store(fd, Ordering::Relaxed);
}
pub fn get_flog_file_fd() -> c_int {
FLOG_FD.load(Ordering::Relaxed)
}

View File

@@ -467,6 +467,7 @@ int main(int argc, char **argv) {
set_cloexec(fileno(debug_output));
setlinebuf(debug_output);
set_flog_output_file(debug_output);
rust_set_flog_file_fd(get_flog_file_fd());
}
// No-exec is prohibited when in interactive mode.