@@ -774,6 +774,63 @@ pub fn gethostname() -> Result<OsString> {
774
774
} )
775
775
}
776
776
777
+ cfg_if ! {
778
+ if #[ cfg( any( target_os = "dragonfly" , target_os = "freebsd" ,
779
+ target_os = "ios" , target_os = "macos" ) ) ] {
780
+ type namelen_t = c_int;
781
+ } else if #[ cfg( not( target_os = "android" ) ) ] {
782
+ type namelen_t = size_t;
783
+ }
784
+ }
785
+
786
+ /// Set the NIS domain name (see
787
+ /// [setdomainname(2)](http://man7.org/linux/man-pages/man2/setdomainname.2.html)).
788
+ #[ cfg( any( target_os = "dragonfly" , target_os = "freebsd" , target_os = "ios" ,
789
+ target_os = "linux" , target_os = "macos" ) ) ]
790
+ pub fn setdomainname < S : AsRef < OsStr > > ( name : S ) -> Result < ( ) > {
791
+ let ptr = name. as_ref ( ) . as_bytes ( ) . as_ptr ( ) as * const c_char ;
792
+ let len = name. as_ref ( ) . as_bytes ( ) . len ( ) as namelen_t ;
793
+ let res = unsafe { libc:: setdomainname ( ptr, len) } ;
794
+ Errno :: result ( res) . map ( drop)
795
+ }
796
+
797
+ /// Get the NIS domain name, returning a `OsString` on success (see
798
+ /// [getdomainname(2)](http://man7.org/linux/man-pages/man2/getdomainname.2.html)).
799
+ ///
800
+ /// This function call attempts to get the NIS domain name for the
801
+ /// running system.
802
+ ///
803
+ /// # Examples
804
+ ///
805
+ /// ```
806
+ /// use nix::unistd;
807
+ ///
808
+ /// let domainname_os = unistd::getdomainname().expect("Failed getting domain name");
809
+ /// let domainname = domainname_os.into_string().expect("Domain name wasn't valid UTF-8");
810
+ /// println!("Domain name: {}", domainname);
811
+ /// ```
812
+ #[ cfg( any( target_os = "dragonfly" , target_os = "freebsd" , target_os = "ios" ,
813
+ target_os = "linux" , target_os = "macos" ) ) ]
814
+ pub fn getdomainname ( ) -> Result < OsString > {
815
+ // Minimum hostname maximum length as defined by POSIX,
816
+ // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
817
+ const _POSIX_HOST_NAME_MAX: i64 = 255 ;
818
+ let buf_len = sysconf ( SysconfVar :: HOST_NAME_MAX )
819
+ . unwrap_or ( None ) . unwrap_or ( _POSIX_HOST_NAME_MAX + 1 ) ;
820
+ let buf = vec ! [ 0 ; buf_len as usize ] ;
821
+ let ptr = unsafe { CString :: from_vec_unchecked ( buf) . into_raw ( ) } ;
822
+
823
+ let res = unsafe { libc:: getdomainname ( ptr, buf_len as namelen_t ) } ;
824
+ Errno :: result ( res) . map ( |_| {
825
+ let cstr = unsafe {
826
+ // Ensure CString is null-terminated
827
+ * ptr. offset ( ( buf_len - 1 ) as isize ) = 0 ;
828
+ CString :: from_raw ( ptr)
829
+ } ;
830
+ OsString :: from_vec ( cstr. into_bytes ( ) )
831
+ } )
832
+ }
833
+
777
834
/// Close a raw file descriptor
778
835
///
779
836
/// Be aware that many Rust types implicitly close-on-drop, including
0 commit comments