]>
Commit | Line | Data |
---|---|---|
9aa2a15a | 1 | use std::future::Future; |
8dd26985 | 2 | use std::io as StdIo; |
9cffeac4 WB |
3 | |
4 | use failure::{bail, format_err, Error}; | |
5 | use nix::sys::socket::SockAddr; | |
6 | ||
9aa2a15a WB |
7 | #[macro_use] |
8 | mod macros; | |
9 | ||
42f25756 | 10 | pub mod apparmor; |
738dbfbe | 11 | pub mod capability; |
e420f6f9 | 12 | pub mod client; |
d1b1deab | 13 | pub mod error; |
6d237718 | 14 | pub mod executor; |
e420f6f9 | 15 | pub mod fork; |
8dd26985 | 16 | pub mod io; |
9cffeac4 | 17 | pub mod lxcseccomp; |
e420f6f9 | 18 | pub mod nsfd; |
a22aece0 | 19 | pub mod poll_fn; |
3bbd1db0 | 20 | pub mod process; |
9cffeac4 | 21 | pub mod seccomp; |
e420f6f9 | 22 | pub mod sys_mknod; |
3e69a521 | 23 | pub mod sys_quotactl; |
c95be5f6 | 24 | pub mod syscall; |
9cffeac4 WB |
25 | pub mod tools; |
26 | ||
8dd26985 | 27 | use crate::io::seq_packet::SeqPacketListener; |
9aa2a15a | 28 | |
64d527ab | 29 | static mut EXECUTOR: *mut executor::ThreadPool = std::ptr::null_mut(); |
9aa2a15a | 30 | |
64d527ab | 31 | pub fn executor() -> &'static executor::ThreadPool { |
9aa2a15a WB |
32 | unsafe { &*EXECUTOR } |
33 | } | |
34 | ||
35 | pub fn spawn(fut: impl Future<Output = ()> + Send + 'static) { | |
36 | executor().spawn_ok(fut) | |
37 | } | |
38 | ||
39 | fn 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 | 52 | async 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 | } |