Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ tokio-seqpacket = "0.7"
[dev-dependencies]
env_logger = "0.11"
tokio = { version = "1.37.0", features = [
"io-util",
"macros",
"rt-multi-thread"
"io-util",
"macros",
"rt-multi-thread",
] }
waitgroup = "0.1"

Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use std::{
use socket2::Socket;
#[cfg(target_os = "linux")]
#[cfg(feature = "tokio_ecdysis")]
pub use tokio_seqpacket::UnixSeqpacketListener;
pub use {crate::seqpacket::UnixSeqpacketListenerStream, tokio_seqpacket::UnixSeqpacketListener};

use executioner::{upgrade, UpgradeFinished};
use inheriter::{init_child, InheritError};
Expand Down
8 changes: 4 additions & 4 deletions src/listener.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
use std::{
io,
net::{TcpListener, UdpSocket},
os::{
fd::{FromRawFd, RawFd},
unix::{io::AsRawFd, net::UnixListener},
},
os::unix::{io::AsRawFd, net::UnixListener},
path::PathBuf,
};

#[cfg(feature = "systemd_sockets")]
use std::os::fd::{FromRawFd, RawFd};

use crate::registry::{ListenerInfo, SockInfo};

pub trait Listener: AsRawFd {
Expand Down
21 changes: 20 additions & 1 deletion src/seqpacket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ use std::{
task::{Context, Poll},
};

#[cfg(feature = "systemd_sockets")]
use std::os::fd::RawFd;

use futures::Stream;

use tokio_seqpacket::{UnixSeqpacket, UnixSeqpacketListener};

use crate::{
Expand All @@ -27,7 +31,7 @@ impl Listener for UnixSeqpacketListener {

#[cfg(feature = "systemd_sockets")]
impl TryFromRawFd for UnixSeqpacketListener {
unsafe fn try_from_raw_fd(fd: std::os::unix::prelude::RawFd) -> io::Result<Self>
unsafe fn try_from_raw_fd(fd: RawFd) -> io::Result<Self>
where
Self: Sized,
{
Expand All @@ -50,3 +54,18 @@ impl Stream for UnixSeqpacketListenerStream {
self.get_mut().0.poll_accept(cx).map(Some)
}
}

/// Set or unset nonblocking flag on socket file descriptor.
///
/// UnixSeqpacketListener does not provide a set_nonblocking method, so we
/// implement one here.
#[cfg(feature = "systemd_sockets")]
pub fn set_nonblocking(fd: RawFd, nonblocking: bool) -> io::Result<()> {
use nix::fcntl::{fcntl, FcntlArg, OFlag};

let mut oflags = OFlag::from_bits(fcntl(fd, FcntlArg::F_GETFL)?)
.ok_or(io::Error::other("fcntl F_GETFL returned invalid flags"))?;
oflags.set(OFlag::O_NONBLOCK, nonblocking);
fcntl(fd, FcntlArg::F_SETFL(oflags))?;
Ok(())
}
4 changes: 1 addition & 3 deletions src/tokio_ecdysis/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -612,9 +612,7 @@ impl TokioEcdysis {
let listener: UnixSeqpacketListener = self
.systemd_sock_of_proto(name, SockInfo::UnixSeqpacket(Some(path.as_ref().into())))
.await?;
// tokio-seqpacket sets O_NONBLOCK for us when we start accepting connections,
// so no need to set the nonblocking flag here.
// (see tokio_seqpacket::sys::accept)
crate::seqpacket::set_nonblocking(listener.as_raw_fd(), true)?;
let stream = UnixSeqpacketListenerStream::new(listener);
Ok(self
.supervisor
Expand Down
Loading