]> git.proxmox.com Git - pve-lxc-syscalld.git/blame - src/main.rs
also use pidfd_open for explicit pids
[pve-lxc-syscalld.git] / src / main.rs
CommitLineData
9aa2a15a 1use std::future::Future;
8dd26985 2use std::io as StdIo;
9cffeac4
WB
3
4use failure::{bail, format_err, Error};
5use nix::sys::socket::SockAddr;
6
9aa2a15a
WB
7#[macro_use]
8mod macros;
9
42f25756 10pub mod apparmor;
738dbfbe 11pub mod capability;
e420f6f9 12pub mod client;
d1b1deab 13pub mod error;
6d237718 14pub mod executor;
e420f6f9 15pub mod fork;
8dd26985 16pub mod io;
9cffeac4 17pub mod lxcseccomp;
e420f6f9 18pub mod nsfd;
a22aece0 19pub mod poll_fn;
3bbd1db0 20pub mod process;
9cffeac4 21pub mod seccomp;
e420f6f9 22pub mod sys_mknod;
3e69a521 23pub mod sys_quotactl;
c95be5f6 24pub mod syscall;
9cffeac4
WB
25pub mod tools;
26
8dd26985 27use crate::io::seq_packet::SeqPacketListener;
9aa2a15a 28
64d527ab 29static mut EXECUTOR: *mut executor::ThreadPool = std::ptr::null_mut();
9aa2a15a 30
64d527ab 31pub fn executor() -> &'static executor::ThreadPool {
9aa2a15a
WB
32 unsafe { &*EXECUTOR }
33}
34
35pub fn spawn(fut: impl Future<Output = ()> + Send + 'static) {
36 executor().spawn_ok(fut)
37}
38
39fn main() {
64d527ab 40 let mut executor = executor::ThreadPool::new().expect("spawning worker threadpool");
9aa2a15a
WB
41 unsafe {
42 EXECUTOR = &mut executor;
43 }
44 std::sync::atomic::fence(std::sync::atomic::Ordering::Release);
e420f6f9 45
9aa2a15a 46 if let Err(err) = executor.run(do_main()) {
9cffeac4
WB
47 eprintln!("error: {}", err);
48 std::process::exit(1);
49 }
50}
51
a563caf2 52async fn do_main() -> Result<(), Error> {
571dbe03 53 let socket_path = std::env::args_os()
9486338a 54 .nth(1)
571dbe03 55 .ok_or_else(|| format_err!("missing parameter: socket path to listen on"))?;
9cffeac4 56
571dbe03 57 match std::fs::remove_file(&socket_path) {
9cffeac4 58 Ok(_) => (),
8dd26985 59 Err(ref e) if e.kind() == StdIo::ErrorKind::NotFound => (), // Ok
9cffeac4
WB
60 Err(e) => bail!("failed to remove previous socket: {}", e),
61 }
62
571dbe03
WB
63 let address =
64 SockAddr::new_unix(socket_path.as_os_str()).expect("cannot create struct sockaddr_un?");
9cffeac4 65
8dd26985 66 let mut listener = SeqPacketListener::bind(&address)
9cffeac4
WB
67 .map_err(|e| format_err!("failed to create listening socket: {}", e))?;
68 loop {
69 let client = listener.accept().await?;
e420f6f9 70 let client = client::Client::new(client);
9aa2a15a 71 spawn(client.main());
9cffeac4
WB
72 }
73}