use crate::diagnostic_log::debug;
use crate::journald_native::{CLIENT_IDENTIFIER, Priority, TEST_SOCKET_VARIABLE, Target, datagram_as};
use std::os::unix::net::UnixDatagram;
const TAG: &str = "clientJournal";
fn target() -> Option<Target> {
return match std::env::var(TEST_SOCKET_VARIABLE) {
Ok(text) => Some(Target::parse(text.as_str())),
Err(_) if cfg!(test) => None,
Err(_) => Some(Target::journal()),
};
}
pub fn record_entry(priority: Priority, message: &str, fields: &[(&str, String)]) -> bool {
return record_entry_as(CLIENT_IDENTIFIER, priority, message, fields);
}
pub fn record_entry_as(identifier: &str, priority: Priority, message: &str, fields: &[(&str, String)]) -> bool {
let Some(found) = target() else { return false };
return send_entry_as(&found, identifier, priority, message, fields);
}
pub fn send_entry(target: &Target, priority: Priority, message: &str, fields: &[(&str, String)]) -> bool {
return send_entry_as(target, CLIENT_IDENTIFIER, priority, message, fields);
}
pub fn send_entry_as(target: &Target, identifier: &str, priority: Priority, message: &str, fields: &[(&str, String)]) -> bool {
let Some(address) = target.address() else {
debug(TAG, format!("the journal address {target:?} does not fit a socket name; no entry is sent").as_str());
return false;
};
let socket: UnixDatagram = match UnixDatagram::unbound() {
Ok(opened) => opened,
Err(error) => {
debug(TAG, format!("no socket for the journal entry ({error})").as_str());
return false;
}
};
if let Err(error) = socket.set_nonblocking(true) {
debug(TAG, format!("the journal socket cannot be made non-blocking ({error}); no entry is sent").as_str());
return false;
}
return match socket.send_to_addr(datagram_as(identifier, priority, message, fields).as_slice(), &address) {
Ok(_) => true,
Err(error) => {
debug(TAG, format!("the journal took no entry ({error})").as_str());
false
}
};
}
#[cfg(test)]
#[path = "client_journal_tests.rs"]
mod tests;