1 #![feature(async_await)]
3 use std
::ffi
::OsString
;
6 use failure
::{bail, format_err, Error}
;
7 use nix
::sys
::socket
::SockAddr
;
20 use socket
::SeqPacketListener
;
23 if let Err(err
) = run() {
24 eprintln
!("error: {}", err
);
25 std
::process
::exit(1);
29 fn run() -> Result
<(), Error
> {
30 let socket_path
= std
::env
::args_os()
33 .ok_or_else(|| format_err
!("missing parameter: socket path to listen on"))?
;
35 match std
::fs
::remove_file(&socket_path
) {
37 Err(ref e
) if e
.kind() == io
::ErrorKind
::NotFound
=> (), // Ok
38 Err(e
) => bail
!("failed to remove previous socket: {}", e
),
41 tokio
::run(async_run(socket_path
));
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
);
52 async
fn async_run_do(socket_path
: OsString
) -> Result
<(), Error
> {
54 SockAddr
::new_unix(socket_path
.as_os_str()).expect("cannot create struct sockaddr_un?");
56 let mut listener
= SeqPacketListener
::bind(&address
)
57 .map_err(|e
| format_err
!("failed to create listening socket: {}", e
))?
;
59 let client
= listener
.accept().await?
;
60 let client
= client
::Client
::new(client
);
61 tokio
::spawn(client
.main());