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.