Mercurial > crates > systemd-socket
comparison src/lib.rs @ 30:e15210d1e534
Set socket to nonblocking before passing it to tokio.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sat, 19 Apr 2025 01:41:25 -0400 |
parents | 0feab4f4c2ce |
children |
comparison
equal
deleted
inserted
replaced
27:85b0f4a7303d | 30:e15210d1e534 |
---|---|
332 | 332 |
333 /// Creates `tokio::net::TcpListener` | 333 /// Creates `tokio::net::TcpListener` |
334 /// | 334 /// |
335 /// To be specific, it binds the socket or converts systemd socket to `tokio` 1.0 socket. | 335 /// To be specific, it binds the socket or converts systemd socket to `tokio` 1.0 socket. |
336 /// | 336 /// |
337 /// This method either `binds` the socket, if the address was provided or uses systemd socket | 337 /// This method either `bind`s the socket, if the address was provided or uses systemd socket |
338 /// if the socket name was provided. | 338 /// if the socket name was provided. |
339 #[cfg(feature = "tokio")] | 339 #[cfg(feature = "tokio")] |
340 pub async fn bind_tokio(self) -> Result<tokio::net::TcpListener, TokioBindError> { | 340 pub async fn bind_tokio(self) -> Result<tokio::net::TcpListener, TokioBindError> { |
341 match self.0 { | 341 match self.0 { |
342 SocketAddrInner::Ordinary(addr) => match tokio::net::TcpListener::bind(addr).await { | 342 SocketAddrInner::Ordinary(addr) => match tokio::net::TcpListener::bind(addr).await { |
347 Ok(socket) => Ok(socket), | 347 Ok(socket) => Ok(socket), |
348 Err(error) => Err(TokioBindError::Bind(BindErrorInner::BindOrResolvFailed { addr, error, }.into())), | 348 Err(error) => Err(TokioBindError::Bind(BindErrorInner::BindOrResolvFailed { addr, error, }.into())), |
349 }, | 349 }, |
350 SocketAddrInner::Systemd(socket_name) => { | 350 SocketAddrInner::Systemd(socket_name) => { |
351 let (socket, addr) = Self::get_systemd(socket_name, true)?; | 351 let (socket, addr) = Self::get_systemd(socket_name, true)?; |
352 socket.try_into().map_err(|error| TokioConversionError { addr, error, }.into()) | 352 Self::wrap_tokio(socket) |
353 }, | 353 .map_err(|error| TokioConversionError { addr, error }.into()) |
354 } | |
354 SocketAddrInner::SystemdNoPrefix(socket_name) => { | 355 SocketAddrInner::SystemdNoPrefix(socket_name) => { |
355 let (socket, addr) = Self::get_systemd(socket_name, false)?; | 356 let (socket, addr) = Self::get_systemd(socket_name, false)?; |
356 socket.try_into().map_err(|error| TokioConversionError { addr, error, }.into()) | 357 Self::wrap_tokio(socket) |
357 }, | 358 .map_err(|error| TokioConversionError { addr, error }.into()) |
358 } | 359 } |
360 } | |
361 } | |
362 | |
363 #[cfg(feature = "tokio")] | |
364 fn wrap_tokio(socket: std::net::TcpListener) -> Result<tokio::net::TcpListener, std::io::Error> { | |
365 socket.set_nonblocking(true)?; | |
366 socket.try_into() | |
359 } | 367 } |
360 | 368 |
361 /// Creates `tokio::net::TcpListener` | 369 /// Creates `tokio::net::TcpListener` |
362 /// | 370 /// |
363 /// To be specific, it binds the socket or converts systemd socket to `tokio` 0.2 socket. | 371 /// To be specific, it binds the socket or converts systemd socket to `tokio` 0.2 socket. |