Skip to content

Commit 39c8130

Browse files
committed
activation: split Unix socket type into UnixStream and UnixDgram
1 parent 40470ed commit 39c8130

File tree

1 file changed

+45
-8
lines changed

1 file changed

+45
-8
lines changed

src/activation.rs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use crate::errors::SdError;
22
use nix::mqueue::mq_getattr;
3-
use nix::sys::socket::getsockname;
3+
use nix::sys::socket::sockopt::SockType;
44
use nix::sys::socket::SockAddr;
5+
use nix::sys::socket::{self, getsockname, getsockopt};
56
use nix::sys::stat::fstat;
67
use std::convert::TryFrom;
78
use std::env;
@@ -25,6 +26,12 @@ pub trait IsType {
2526
/// Returns true if a file descriptor is a `PF_UNIX` socket.
2627
fn is_unix(&self) -> bool;
2728

29+
/// Returns true if a file descriptor is a `SOCK_STREAM` socket.
30+
fn is_stream(&self) -> bool;
31+
32+
/// Returns true if a file descriptor is a `SOCK_DGRAM` socket.
33+
fn is_dgram(&self) -> bool;
34+
2835
/// Returns true if a file descriptor is a POSIX message queue descriptor.
2936
fn is_mq(&self) -> bool;
3037
}
@@ -45,8 +52,10 @@ enum SocketFd {
4552
Special(RawFd),
4653
/// A `PF_INET` socket, such as UDP/TCP sockets.
4754
Inet(RawFd),
48-
/// A `PF_UNIX` socket (see `man 7 unix`).
49-
Unix(RawFd),
55+
/// A `PF_UNIX` stream socket (see `man 7 unix`).
56+
UnixStream(RawFd),
57+
/// A `PF_UNIX` datagram socket (see `man 7 unix`).
58+
UnixDgram(RawFd),
5059
/// A POSIX message queue (see `man 7 mq_overview`).
5160
Mq(RawFd),
5261
/// An unknown descriptor (possibly invalid, use with caution).
@@ -70,7 +79,22 @@ impl IsType for FileDescriptor {
7079

7180
fn is_unix(&self) -> bool {
7281
match self.0 {
73-
SocketFd::Unix(_) => true,
82+
SocketFd::UnixStream(_) => true,
83+
SocketFd::UnixDgram(_) => true,
84+
_ => false,
85+
}
86+
}
87+
88+
fn is_stream(&self) -> bool {
89+
match self.0 {
90+
SocketFd::UnixStream(_) => true,
91+
_ => false,
92+
}
93+
}
94+
95+
fn is_dgram(&self) -> bool {
96+
match self.0 {
97+
SocketFd::UnixDgram(_) => true,
7498
_ => false,
7599
}
76100
}
@@ -225,6 +249,16 @@ impl IsType for RawFd {
225249
}
226250
}
227251

252+
fn is_stream(&self) -> bool {
253+
let sock_type = getsockopt(*self, SockType).expect("Getsockopt");
254+
sock_type == socket::SockType::Stream
255+
}
256+
257+
fn is_dgram(&self) -> bool {
258+
let sock_type = getsockopt(*self, SockType).expect("Getsockopt");
259+
sock_type == socket::SockType::Datagram
260+
}
261+
228262
fn is_mq(&self) -> bool {
229263
mq_getattr(*self).is_ok()
230264
}
@@ -240,8 +274,10 @@ impl TryFrom<RawFd> for FileDescriptor {
240274
return Ok(FileDescriptor(SocketFd::Special(value)));
241275
} else if value.is_inet() {
242276
return Ok(FileDescriptor(SocketFd::Inet(value)));
243-
} else if value.is_unix() {
244-
return Ok(FileDescriptor(SocketFd::Unix(value)));
277+
} else if value.is_unix() && value.is_stream() {
278+
return Ok(FileDescriptor(SocketFd::UnixStream(value)));
279+
} else if value.is_unix() && value.is_dgram() {
280+
return Ok(FileDescriptor(SocketFd::UnixDgram(value)));
245281
} else if value.is_mq() {
246282
return Ok(FileDescriptor(SocketFd::Mq(value)));
247283
}
@@ -261,7 +297,8 @@ impl IntoRawFd for FileDescriptor {
261297
SocketFd::Fifo(fd) => fd,
262298
SocketFd::Special(fd) => fd,
263299
SocketFd::Inet(fd) => fd,
264-
SocketFd::Unix(fd) => fd,
300+
SocketFd::UnixStream(fd) => fd,
301+
SocketFd::UnixDgram(fd) => fd,
265302
SocketFd::Mq(fd) => fd,
266303
SocketFd::Unknown(fd) => fd,
267304
}
@@ -274,7 +311,7 @@ mod tests {
274311

275312
#[test]
276313
fn test_socketype_is_unix() {
277-
let sock = FileDescriptor(SocketFd::Unix(0i32));
314+
let sock = FileDescriptor(SocketFd::UnixStream(0i32));
278315
assert!(sock.is_unix());
279316
}
280317

0 commit comments

Comments
 (0)