1
0
mirror of https://github.com/fafhrd91/actix-net synced 2024-11-24 00:01:11 +01:00

Feature uds: Add listen_uds to ServerBuilder (#43)

Allows directly passing an Unix Listener instead of a path. Useful
for example when running as a daemon under systemd with the systemd
crate.
This commit is contained in:
karlri 2019-09-16 07:07:46 +02:00 committed by Nikolay Kim
parent 34a7b7f05a
commit b686b4c34e
2 changed files with 26 additions and 4 deletions

View File

@ -6,6 +6,7 @@
* Use new `Service<Request>` trait * Use new `Service<Request>` trait
* Add UDS listening support to `ServerBuilder`
## [0.2.4] - 2018-11-21 ## [0.2.4] - 2018-11-21

View File

@ -185,20 +185,41 @@ impl ServerBuilder {
#[cfg(all(unix, feature = "uds"))] #[cfg(all(unix, feature = "uds"))]
/// Add new unix domain service to the server. /// Add new unix domain service to the server.
pub fn bind_uds<F, U, N>(mut self, name: N, addr: U, factory: F) -> io::Result<Self> pub fn bind_uds<F, U, N>(self, name: N, addr: U, factory: F) -> io::Result<Self>
where where
F: ServiceFactory<tokio_uds::UnixStream>, F: ServiceFactory<tokio_uds::UnixStream>,
N: AsRef<str>, N: AsRef<str>,
U: AsRef<std::path::Path>, U: AsRef<std::path::Path>,
{ {
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::os::unix::net::UnixListener; use std::os::unix::net::UnixListener;
// TODO: need to do something with existing paths // The path must not exist when we try to bind.
let _ = std::fs::remove_file(addr.as_ref()); // Try to remove it to avoid bind error.
if let Err(e) = std::fs::remove_file(addr.as_ref()) {
// NotFound is expected and not an issue. Anything else is.
if e.kind() != std::io::ErrorKind::NotFound {
return Err(e);
}
}
let lst = UnixListener::bind(addr)?; let lst = UnixListener::bind(addr)?;
self.listen_uds(name, lst, factory)
}
#[cfg(all(unix, feature = "uds"))]
/// Add new unix domain service to the server.
/// Useful when running as a systemd service and
/// a socket FD can be acquired using the systemd crate.
pub fn listen_uds<F, N: AsRef<str>>(
mut self,
name: N,
lst: std::os::unix::net::UnixListener,
factory: F,
) -> io::Result<Self>
where
F: ServiceFactory<tokio_uds::UnixStream>,
{
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
let token = self.token.next(); let token = self.token.next();
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
self.services.push(StreamNewService::create( self.services.push(StreamNewService::create(