Skip to content

Commit 5da7331

Browse files
authored
Rollup merge of rust-lang#91553 - devnexen:anc_data_dfbsd, r=yaahc
socket ancillary data implementation for dragonflybsd.
2 parents 27c791c + e68887e commit 5da7331

File tree

3 files changed

+92
-8
lines changed

3 files changed

+92
-8
lines changed

library/std/src/os/unix/net/ancillary.rs

+80-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ mod libc {
1616
pub use libc::c_int;
1717
pub struct ucred;
1818
pub struct cmsghdr;
19+
#[cfg(target_os = "dragonfly")]
20+
pub struct cmsgcred;
1921
pub type pid_t = i32;
2022
pub type gid_t = u32;
2123
pub type uid_t = u32;
@@ -183,6 +185,11 @@ impl<'a, T> Iterator for AncillaryDataIter<'a, T> {
183185
#[derive(Clone)]
184186
pub struct SocketCred(libc::ucred);
185187

188+
#[cfg(target_os = "dragonfly")]
189+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
190+
#[derive(Clone)]
191+
pub struct SocketCred(libc::cmsgcred);
192+
186193
#[cfg(any(doc, target_os = "android", target_os = "linux",))]
187194
impl SocketCred {
188195
/// Create a Unix credential struct.
@@ -234,6 +241,57 @@ impl SocketCred {
234241
}
235242
}
236243

244+
#[cfg(target_os = "dragonfly")]
245+
impl SocketCred {
246+
/// Create a Unix credential struct.
247+
///
248+
/// PID, UID and GID is set to 0.
249+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
250+
#[must_use]
251+
pub fn new() -> SocketCred {
252+
SocketCred(libc::cmsgcred { cmsgcred_pid: 0, cmsgcred_uid: 0, cmsgcred_gid: 0 })
253+
}
254+
255+
/// Set the PID.
256+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
257+
pub fn set_pid(&mut self, pid: libc::pid_t) {
258+
self.0.cmsgcred_pid = pid;
259+
}
260+
261+
/// Get the current PID.
262+
#[must_use]
263+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
264+
pub fn get_pid(&self) -> libc::pid_t {
265+
self.0.cmsgcred_pid
266+
}
267+
268+
/// Set the UID.
269+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
270+
pub fn set_uid(&mut self, uid: libc::uid_t) {
271+
self.0.cmsgcred_uid = uid;
272+
}
273+
274+
/// Get the current UID.
275+
#[must_use]
276+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
277+
pub fn get_uid(&self) -> libc::uid_t {
278+
self.0.cmsgcred_uid
279+
}
280+
281+
/// Set the GID.
282+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
283+
pub fn set_gid(&mut self, gid: libc::gid_t) {
284+
self.0.cmsgcred_gid = gid;
285+
}
286+
287+
/// Get the current GID.
288+
#[must_use]
289+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
290+
pub fn get_gid(&self) -> libc::gid_t {
291+
self.0.cmsgcred_gid
292+
}
293+
}
294+
237295
/// This control message contains file descriptors.
238296
///
239297
/// The level is equal to `SOL_SOCKET` and the type is equal to `SCM_RIGHTS`.
@@ -256,7 +314,11 @@ impl<'a> Iterator for ScmRights<'a> {
256314
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
257315
pub struct ScmCredentials<'a>(AncillaryDataIter<'a, libc::ucred>);
258316

259-
#[cfg(any(doc, target_os = "android", target_os = "linux",))]
317+
#[cfg(target_os = "dragonfly")]
318+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
319+
pub struct ScmCredentials<'a>(AncillaryDataIter<'a, libc::cmsgcred>);
320+
321+
#[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "dragonfly",))]
260322
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
261323
impl<'a> Iterator for ScmCredentials<'a> {
262324
type Item = SocketCred;
@@ -300,7 +362,7 @@ impl<'a> AncillaryData<'a> {
300362
/// # Safety
301363
///
302364
/// `data` must contain a valid control message and the control message must be type of
303-
/// `SOL_SOCKET` and level of `SCM_CREDENTIALS` or `SCM_CREDENTIALS`.
365+
/// `SOL_SOCKET` and level of `SCM_CREDENTIALS` or `SCM_CREDS`.
304366
#[cfg(any(doc, target_os = "android", target_os = "linux",))]
305367
unsafe fn as_credentials(data: &'a [u8]) -> Self {
306368
let ancillary_data_iter = AncillaryDataIter::new(data);
@@ -320,6 +382,9 @@ impl<'a> AncillaryData<'a> {
320382
libc::SCM_RIGHTS => Ok(AncillaryData::as_rights(data)),
321383
#[cfg(any(target_os = "android", target_os = "linux",))]
322384
libc::SCM_CREDENTIALS => Ok(AncillaryData::as_credentials(data)),
385+
#[cfg(target_os = "dragonfly")]
386+
libc::SCM_CREDS => Ok(AncillaryData::as_credentials(data)),
387+
323388
cmsg_type => {
324389
Err(AncillaryError::Unknown { cmsg_level: libc::SOL_SOCKET, cmsg_type })
325390
}
@@ -544,6 +609,19 @@ impl<'a> SocketAncillary<'a> {
544609
)
545610
}
546611

612+
#[cfg(target_os = "dragonfly")]
613+
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
614+
pub fn add_creds(&mut self, creds: &[SocketCred]) -> bool {
615+
self.truncated = false;
616+
add_to_ancillary_data(
617+
&mut self.buffer,
618+
&mut self.length,
619+
creds,
620+
libc::SOL_SOCKET,
621+
libc::SCM_CREDS,
622+
)
623+
}
624+
547625
/// Clears the ancillary data, removing all values.
548626
///
549627
/// # Example

library/std/src/os/unix/net/datagram.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,14 @@ impl UnixDatagram {
854854
///
855855
/// # Examples
856856
///
857-
#[cfg_attr(any(target_os = "android", target_os = "linux"), doc = "```no_run")]
858-
#[cfg_attr(not(any(target_os = "android", target_os = "linux")), doc = "```ignore")]
857+
#[cfg_attr(
858+
any(target_os = "android", target_os = "linux", target_os = "dragonfly"),
859+
doc = "```no_run"
860+
)]
861+
#[cfg_attr(
862+
not(any(target_os = "android", target_os = "linux", target_os = "dragonfly")),
863+
doc = "```ignore"
864+
)]
859865
/// #![feature(unix_socket_ancillary_data)]
860866
/// use std::os::unix::net::UnixDatagram;
861867
///
@@ -865,7 +871,7 @@ impl UnixDatagram {
865871
/// Ok(())
866872
/// }
867873
/// ```
868-
#[cfg(any(doc, target_os = "android", target_os = "linux",))]
874+
#[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "dragonfly",))]
869875
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
870876
pub fn set_passcred(&self, passcred: bool) -> io::Result<()> {
871877
self.0.set_passcred(passcred)
@@ -877,7 +883,7 @@ impl UnixDatagram {
877883
/// Get the socket option `SO_PASSCRED`.
878884
///
879885
/// [`set_passcred`]: UnixDatagram::set_passcred
880-
#[cfg(any(doc, target_os = "android", target_os = "linux",))]
886+
#[cfg(any(doc, target_os = "android", target_os = "linux", target_os = "dragonfly",))]
881887
#[unstable(feature = "unix_socket_ancillary_data", issue = "76915")]
882888
pub fn passcred(&self) -> io::Result<bool> {
883889
self.0.passcred()

library/std/src/sys/unix/net.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -408,12 +408,12 @@ impl Socket {
408408
Ok(raw != 0)
409409
}
410410

411-
#[cfg(any(target_os = "android", target_os = "linux",))]
411+
#[cfg(any(target_os = "android", target_os = "linux", target_os = "dragonfly",))]
412412
pub fn set_passcred(&self, passcred: bool) -> io::Result<()> {
413413
setsockopt(self, libc::SOL_SOCKET, libc::SO_PASSCRED, passcred as libc::c_int)
414414
}
415415

416-
#[cfg(any(target_os = "android", target_os = "linux",))]
416+
#[cfg(any(target_os = "android", target_os = "linux", target_os = "dragonfly",))]
417417
pub fn passcred(&self) -> io::Result<bool> {
418418
let passcred: libc::c_int = getsockopt(self, libc::SOL_SOCKET, libc::SO_PASSCRED)?;
419419
Ok(passcred != 0)

0 commit comments

Comments
 (0)