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