@@ -14,6 +14,7 @@ use super::{peer_cred, UCred};
1414#[ cfg( any( doc, target_os = "android" , target_os = "linux" ) ) ]
1515use super :: { recv_vectored_with_ancillary_from, send_vectored_with_ancillary_to, SocketAncillary } ;
1616use super :: { sockaddr_un, SocketAddr } ;
17+ use crate :: ffi:: CStr ;
1718use crate :: fmt;
1819use crate :: io:: { self , IoSlice , IoSliceMut } ;
1920use crate :: net:: Shutdown ;
@@ -384,6 +385,85 @@ impl UnixStream {
384385 self . 0 . set_nonblocking ( nonblocking)
385386 }
386387
388+ /// Moves the socket to pass unix credentials as control message in [`SocketAncillary`].
389+ ///
390+ /// Set the socket option `SO_PASSCRED`.
391+ ///
392+ /// # Examples
393+ ///
394+ #[ cfg_attr(
395+ any(
396+ target_os = "android" ,
397+ target_os = "linux" ,
398+ target_os = "netbsd" ,
399+ target_os = "freebsd"
400+ ) ,
401+ doc = "```no_run"
402+ ) ]
403+ #[ cfg_attr(
404+ not( any(
405+ target_os = "android" ,
406+ target_os = "linux" ,
407+ target_os = "netbsd" ,
408+ target_os = "freebsd"
409+ ) ) ,
410+ doc = "```ignore"
411+ ) ]
412+ /// #![feature(unix_socket_ancillary_data)]
413+ /// use std::os::unix::net::UnixStream;
414+ ///
415+ /// fn main() -> std::io::Result<()> {
416+ /// let socket = UnixStream::connect("/tmp/sock")?;
417+ /// socket.set_passcred(true).expect("Couldn't set passcred");
418+ /// Ok(())
419+ /// }
420+ /// ```
421+ #[ cfg( any(
422+ doc,
423+ target_os = "android" ,
424+ target_os = "linux" ,
425+ target_os = "netbsd" ,
426+ target_os = "freebsd"
427+ ) ) ]
428+ #[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
429+ pub fn set_passcred ( & self , passcred : bool ) -> io:: Result < ( ) > {
430+ self . 0 . set_passcred ( passcred)
431+ }
432+
433+ /// Get the current value of the socket for passing unix credentials in [`SocketAncillary`].
434+ /// This value can be change by [`set_passcred`].
435+ ///
436+ /// Get the socket option `SO_PASSCRED`.
437+ ///
438+ /// [`set_passcred`]: UnixStream::set_passcred
439+ #[ cfg( any(
440+ doc,
441+ target_os = "android" ,
442+ target_os = "linux" ,
443+ target_os = "netbsd" ,
444+ target_os = "freebsd"
445+ ) ) ]
446+ #[ unstable( feature = "unix_socket_ancillary_data" , issue = "76915" ) ]
447+ pub fn passcred ( & self ) -> io:: Result < bool > {
448+ self . 0 . passcred ( )
449+ }
450+
451+ /// Set a filter name on the socket to filter incoming connections to defer it before accept(2)
452+ ///
453+ #[ cfg( any( doc, target_os = "netbsd" , target_os = "freebsd" ) ) ]
454+ #[ unstable( feature = "acceptfilter" , issue = "none" ) ]
455+ pub fn set_acceptfilter ( & self , name : & CStr ) -> io:: Result < ( ) > {
456+ self . 0 . set_acceptfilter ( name)
457+ }
458+
459+ /// Get a filter name if one had been set previously on the socket.
460+ ///
461+ #[ cfg( any( doc, target_os = "netbsd" , target_os = "freebsd" ) ) ]
462+ #[ unstable( feature = "acceptfilter" , issue = "none" ) ]
463+ pub fn acceptfilter ( & self ) -> io:: Result < & CStr > {
464+ self . 0 . acceptfilter ( )
465+ }
466+
387467 /// Set the id of the socket for network filtering purpose
388468 ///
389469 #[ cfg_attr(
0 commit comments