rustpython_host_env/
syslog.rs1use alloc::boxed::Box;
2use core::ffi::CStr;
3use parking_lot::RwLock;
4use std::{os::raw::c_char, sync::OnceLock};
5
6pub use libc::{
7 LOG_ALERT, LOG_AUTH, LOG_CONS, LOG_CRIT, LOG_DAEMON, LOG_DEBUG, LOG_EMERG, LOG_ERR, LOG_INFO,
8 LOG_KERN, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6,
9 LOG_LOCAL7, LOG_LPR, LOG_MAIL, LOG_NDELAY, LOG_NEWS, LOG_NOTICE, LOG_NOWAIT, LOG_ODELAY,
10 LOG_PID, LOG_SYSLOG, LOG_USER, LOG_UUCP, LOG_WARNING,
11};
12
13#[cfg(not(target_os = "redox"))]
14pub use libc::{LOG_AUTHPRIV, LOG_CRON, LOG_PERROR};
15
16#[cfg(target_vendor = "apple")]
17pub use libc::{LOG_FTP, LOG_INSTALL, LOG_LAUNCHD, LOG_NETINFO, LOG_RAS, LOG_REMOTEAUTH};
18
19#[derive(Debug)]
20enum GlobalIdent {
21 Explicit(Box<CStr>),
22 Implicit,
23}
24
25impl GlobalIdent {
26 fn as_ptr(&self) -> *const c_char {
27 match self {
28 Self::Explicit(cstr) => cstr.as_ptr(),
29 Self::Implicit => core::ptr::null(),
30 }
31 }
32}
33
34fn global_ident() -> &'static RwLock<Option<GlobalIdent>> {
35 static IDENT: OnceLock<RwLock<Option<GlobalIdent>>> = OnceLock::new();
36 IDENT.get_or_init(|| RwLock::new(None))
37}
38
39#[must_use]
40pub fn is_open() -> bool {
41 global_ident().read().is_some()
42}
43
44pub fn openlog(ident: Option<Box<CStr>>, logoption: i32, facility: i32) {
45 let ident = match ident {
46 Some(ident) => GlobalIdent::Explicit(ident),
47 None => GlobalIdent::Implicit,
48 };
49 let mut locked_ident = global_ident().write();
50 unsafe { libc::openlog(ident.as_ptr(), logoption, facility) };
51 *locked_ident = Some(ident);
52}
53
54pub fn syslog(priority: i32, msg: &CStr) {
55 let _locked_ident = global_ident().read();
56 let cformat = c"%s";
57 unsafe { libc::syslog(priority, cformat.as_ptr(), msg.as_ptr()) };
58}
59
60pub fn closelog() {
61 let mut locked_ident = global_ident().write();
62 if locked_ident.is_some() {
63 unsafe { libc::closelog() };
64 *locked_ident = None;
65 }
66}
67
68#[must_use]
69pub fn setlogmask(maskpri: i32) -> i32 {
70 unsafe { libc::setlogmask(maskpri) }
71}
72
73#[must_use]
74pub const fn log_mask(pri: i32) -> i32 {
75 1 << pri
76}
77
78#[must_use]
79pub const fn log_upto(pri: i32) -> i32 {
80 (1 << (pri + 1)) - 1
81}