]>
Commit | Line | Data |
---|---|---|
9cffeac4 WB |
1 | #![feature(async_await)] |
2 | ||
571dbe03 | 3 | use std::ffi::OsString; |
9cffeac4 WB |
4 | use std::io; |
5 | ||
6 | use failure::{bail, format_err, Error}; | |
7 | use nix::sys::socket::SockAddr; | |
8 | ||
42f25756 | 9 | pub mod apparmor; |
e420f6f9 WB |
10 | pub mod client; |
11 | pub mod fork; | |
9cffeac4 | 12 | pub mod lxcseccomp; |
e420f6f9 WB |
13 | pub mod nsfd; |
14 | pub mod pidfd; | |
9cffeac4 WB |
15 | pub mod seccomp; |
16 | pub mod socket; | |
e420f6f9 | 17 | pub mod sys_mknod; |
c95be5f6 | 18 | pub mod syscall; |
9cffeac4 WB |
19 | pub mod tools; |
20 | ||
e420f6f9 WB |
21 | use socket::SeqPacketListener; |
22 | ||
9cffeac4 WB |
23 | fn main() { |
24 | if let Err(err) = run() { | |
25 | eprintln!("error: {}", err); | |
26 | std::process::exit(1); | |
27 | } | |
28 | } | |
29 | ||
30 | fn run() -> Result<(), Error> { | |
571dbe03 WB |
31 | let socket_path = std::env::args_os() |
32 | .skip(1) | |
33 | .next() | |
34 | .ok_or_else(|| format_err!("missing parameter: socket path to listen on"))?; | |
9cffeac4 | 35 | |
571dbe03 | 36 | match std::fs::remove_file(&socket_path) { |
9cffeac4 WB |
37 | Ok(_) => (), |
38 | Err(ref e) if e.kind() == io::ErrorKind::NotFound => (), // Ok | |
39 | Err(e) => bail!("failed to remove previous socket: {}", e), | |
40 | } | |
41 | ||
571dbe03 | 42 | tokio::run(async_run(socket_path)); |
9cffeac4 WB |
43 | |
44 | Ok(()) | |
45 | } | |
46 | ||
571dbe03 WB |
47 | async fn async_run(socket_path: OsString) { |
48 | if let Err(err) = async_run_do(socket_path).await { | |
9cffeac4 WB |
49 | eprintln!("error accepting clients, bailing out: {}", err); |
50 | } | |
51 | } | |
52 | ||
571dbe03 WB |
53 | async fn async_run_do(socket_path: OsString) -> Result<(), Error> { |
54 | let address = | |
55 | SockAddr::new_unix(socket_path.as_os_str()).expect("cannot create struct sockaddr_un?"); | |
9cffeac4 WB |
56 | |
57 | let mut listener = SeqPacketListener::bind(&address) | |
58 | .map_err(|e| format_err!("failed to create listening socket: {}", e))?; | |
59 | loop { | |
60 | let client = listener.accept().await?; | |
e420f6f9 WB |
61 | let client = client::Client::new(client); |
62 | tokio::spawn(client.main()); | |
9cffeac4 WB |
63 | } |
64 | } |