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