1use tracing::error;
4
5use crate::ArtiConfig;
6
7#[cfg_attr(feature = "experimental-api", visibility::make(pub))]
16#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
17pub(crate) fn use_max_file_limit(config: &ArtiConfig) {
18 match rlimit::increase_nofile_limit(config.system.max_files) {
19 Ok(n) => tracing::debug!("Increased process file limit to {}", n),
20 Err(e) => tor_error::warn_report!(e, "Error while increasing file limit"),
21 }
22}
23
24#[cfg_attr(feature = "experimental-api", visibility::make(pub))]
35#[cfg(feature = "harden")]
36pub(crate) fn enable_process_hardening() -> anyhow::Result<()> {
37 use anyhow::Context as _;
38 use std::sync::atomic::{AtomicBool, Ordering};
39 static ENABLED: AtomicBool = AtomicBool::new(false);
41
42 if ENABLED.swap(true, Ordering::SeqCst) {
43 return Ok(());
45 }
46
47 secmem_proc::harden_process().context("Problem while hardening process")?;
48
49 Ok(())
50}
51
52pub(crate) fn exit_if_root() {
56 if running_as_root() {
57 error!(
58 "You are running Arti as root. You don't need to, and \
59 you probably shouldn't. \
60 To run as root anyway, set application.allow_running_as_root."
61 );
62 std::process::exit(1);
63 }
64}
65
66fn running_as_root() -> bool {
68 #[cfg(target_family = "unix")]
69 unsafe {
70 libc::geteuid() == 0
71 }
72 #[cfg(not(target_family = "unix"))]
73 false
74}
75
76#[cfg(target_family = "unix")]
81pub(crate) fn sighup_stream() -> crate::Result<impl futures::Stream<Item = ()>> {
82 cfg_if::cfg_if! {
83 if #[cfg(feature="tokio")] {
84 use tokio_crate::signal::unix as s;
85 let mut signal = s::signal(s::SignalKind::hangup())?;
86 Ok(futures::stream::poll_fn(move |ctx| signal.poll_recv(ctx)))
87 } else if #[cfg(feature="async-std")] {
88 use async_signal::{Signal, Signals};
89 use futures::stream::StreamExt as _;
90 let signals = Signals::new(&[Signal::Hup])?;
91 Ok(signals.map(|_| ()))
92 } else {
93 Ok(futures::stream::pending())
95 }
96 }
97}