1 #![feature(async_await)]
3 use std
::ffi
::OsString
;
7 use failure
::{bail, format_err, Error}
;
8 use nix
::sys
::socket
::SockAddr
;
15 use socket
::{AsyncSeqPacketSocket, SeqPacketListener}
;
18 if let Err(err
) = run() {
19 eprintln
!("error: {}", err
);
20 std
::process
::exit(1);
24 fn run() -> Result
<(), Error
> {
25 let socket_path
= std
::env
::args_os()
28 .ok_or_else(|| format_err
!("missing parameter: socket path to listen on"))?
;
30 match std
::fs
::remove_file(&socket_path
) {
32 Err(ref e
) if e
.kind() == io
::ErrorKind
::NotFound
=> (), // Ok
33 Err(e
) => bail
!("failed to remove previous socket: {}", e
),
36 tokio
::run(async_run(socket_path
));
41 async
fn async_run(socket_path
: OsString
) {
42 if let Err(err
) = async_run_do(socket_path
).await
{
43 eprintln
!("error accepting clients, bailing out: {}", err
);
47 async
fn async_run_do(socket_path
: OsString
) -> Result
<(), Error
> {
49 SockAddr
::new_unix(socket_path
.as_os_str()).expect("cannot create struct sockaddr_un?");
51 let mut listener
= SeqPacketListener
::bind(&address
)
52 .map_err(|e
| format_err
!("failed to create listening socket: {}", e
))?
;
54 let client
= listener
.accept().await?
;
55 tokio
::spawn(handle_client(Arc
::new(client
)));
59 async
fn handle_client(client
: Arc
<AsyncSeqPacketSocket
>) {
60 if let Err(err
) = handle_client_do(client
).await
{
62 "error communicating with client, dropping connection: {}",
68 async
fn handle_client_do(client
: Arc
<AsyncSeqPacketSocket
>) -> Result
<(), Error
> {
69 let mut msgbuf
= lxcseccomp
::ProxyMessageBuffer
::new(64)
70 .map_err(|e
| format_err
!("failed to allocate proxy message buffer: {}", e
))?
;
74 let mut iovec
= msgbuf
.io_vec_mut();
75 client
.recv_fds_vectored(&mut iovec
, 1).await?
79 println
!("client disconnected");
83 msgbuf
.set_len(size
)?
;
85 let req
= msgbuf
.request();
86 println
!("Received request for syscall {}", req
.data
.nr
);
88 let resp
= msgbuf
.response_mut();
90 resp
.error
= -libc
::ENOENT
;
92 let iovec
= msgbuf
.io_vec_no_cookie();
93 client
.sendmsg_vectored(&iovec
).await?
;