Mercurial > crates > systemd-socket
comparison src/lib.rs @ 29:efc69e99db70
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 | cfef4593e207 |
children |
comparison
equal
deleted
inserted
replaced
28:cfef4593e207 | 29:efc69e99db70 |
---|---|
368 | 368 |
369 /// Creates `tokio::net::TcpListener` | 369 /// Creates `tokio::net::TcpListener` |
370 /// | 370 /// |
371 /// To be specific, it binds the socket or converts systemd socket to `tokio` 1.0 socket. | 371 /// To be specific, it binds the socket or converts systemd socket to `tokio` 1.0 socket. |
372 /// | 372 /// |
373 /// This method either `binds` the socket, if the address was provided or uses systemd socket | 373 /// This method either `bind`s the socket, if the address was provided or uses systemd socket |
374 /// if the socket name was provided. | 374 /// if the socket name was provided. |
375 #[cfg(feature = "tokio")] | 375 #[cfg(feature = "tokio")] |
376 pub async fn bind_tokio(self) -> Result<tokio::net::TcpListener, TokioBindError> { | 376 pub async fn bind_tokio(self) -> Result<tokio::net::TcpListener, TokioBindError> { |
377 match self.0 { | 377 match self.0 { |
378 SocketAddrInner::Ordinary(addr) => match tokio::net::TcpListener::bind(addr).await { | 378 SocketAddrInner::Ordinary(addr) => match tokio::net::TcpListener::bind(addr).await { |
389 )), | 389 )), |
390 } | 390 } |
391 } | 391 } |
392 SocketAddrInner::Systemd(socket_name) => { | 392 SocketAddrInner::Systemd(socket_name) => { |
393 let (socket, addr) = Self::get_systemd(socket_name, true)?; | 393 let (socket, addr) = Self::get_systemd(socket_name, true)?; |
394 socket | 394 Self::wrap_tokio(socket) |
395 .try_into() | |
396 .map_err(|error| TokioConversionError { addr, error }.into()) | 395 .map_err(|error| TokioConversionError { addr, error }.into()) |
397 } | 396 } |
398 SocketAddrInner::SystemdNoPrefix(socket_name) => { | 397 SocketAddrInner::SystemdNoPrefix(socket_name) => { |
399 let (socket, addr) = Self::get_systemd(socket_name, false)?; | 398 let (socket, addr) = Self::get_systemd(socket_name, false)?; |
400 socket | 399 Self::wrap_tokio(socket) |
401 .try_into() | |
402 .map_err(|error| TokioConversionError { addr, error }.into()) | 400 .map_err(|error| TokioConversionError { addr, error }.into()) |
403 } | 401 } |
404 } | 402 } |
403 } | |
404 | |
405 #[cfg(feature = "tokio")] | |
406 fn wrap_tokio(socket: std::net::TcpListener) -> Result<tokio::net::TcpListener, std::io::Error> { | |
407 socket.set_nonblocking(true)?; | |
408 socket.try_into() | |
405 } | 409 } |
406 | 410 |
407 /// Creates `tokio::net::TcpListener` | 411 /// Creates `tokio::net::TcpListener` |
408 /// | 412 /// |
409 /// To be specific, it binds the socket or converts systemd socket to `tokio` 0.2 socket. | 413 /// To be specific, it binds the socket or converts systemd socket to `tokio` 0.2 socket. |