1 use std
::future
::Future
;
4 use failure
::{bail, format_err, Error}
;
5 use nix
::sys
::socket
::SockAddr
;
23 use io_uring
::socket
::SeqPacketListener
;
25 static mut EXECUTOR
: *mut futures_executor
::ThreadPool
= std
::ptr
::null_mut();
27 pub fn executor() -> &'
static futures_executor
::ThreadPool
{
31 pub fn spawn(fut
: impl Future
<Output
= ()> + Send
+ '
static) {
32 executor().spawn_ok(fut
)
36 let mut executor
= futures_executor
::ThreadPool
::new().expect("spawning worker threadpool");
38 EXECUTOR
= &mut executor
;
40 std
::sync
::atomic
::fence(std
::sync
::atomic
::Ordering
::Release
);
42 if let Err(err
) = executor
.run(do_main()) {
43 eprintln
!("error: {}", err
);
44 std
::process
::exit(1);
48 async
fn do_main() -> Result
<(), Error
> {
49 let socket_path
= std
::env
::args_os()
51 .ok_or_else(|| format_err
!("missing parameter: socket path to listen on"))?
;
53 match std
::fs
::remove_file(&socket_path
) {
55 Err(ref e
) if e
.kind() == io
::ErrorKind
::NotFound
=> (), // Ok
56 Err(e
) => bail
!("failed to remove previous socket: {}", e
),
60 SockAddr
::new_unix(socket_path
.as_os_str()).expect("cannot create struct sockaddr_un?");
62 let mut listener
= SeqPacketListener
::bind_default(&address
)
63 .map_err(|e
| format_err
!("failed to create listening socket: {}", e
))?
;
65 let client
= listener
.accept().await?
;
66 let client
= client
::Client
::new(client
);