@@ -758,6 +758,56 @@ pub fn gethostname() -> Result<CString> {
758
758
} )
759
759
}
760
760
761
+ cfg_if ! {
762
+ if #[ cfg( any( target_os = "dragonfly" , target_os = "freebsd" ,
763
+ target_os = "ios" , target_os = "macos" ) ) ] {
764
+ type namelen_t = c_int;
765
+ } else {
766
+ type namelen_t = size_t;
767
+ }
768
+ }
769
+
770
+ /// Set the NIS domain name (see
771
+ /// [setdomainname(2)](http://man7.org/linux/man-pages/man2/setdomainname.2.html)).
772
+ #[ cfg( not( target_os = "android" ) ) ]
773
+ pub fn setdomainname < S : AsRef < OsStr > > ( name : S ) -> Result < ( ) > {
774
+ let ptr = name. as_ref ( ) . as_bytes ( ) . as_ptr ( ) as * const c_char ;
775
+ let len = name. as_ref ( ) . len ( ) as namelen_t ;
776
+ let res = unsafe { libc:: setdomainname ( ptr, len) } ;
777
+ Errno :: result ( res) . map ( drop)
778
+ }
779
+
780
+ /// Get the NIS domain name, returning a `CString` on success (see
781
+ /// [getdomainname(2)](http://man7.org/linux/man-pages/man2/getdomainname.2.html)).
782
+ ///
783
+ /// This function call attempts to get the NIS domain name for the running system
784
+ /// and return it as a NUL-terminated string.
785
+ ///
786
+ /// # Examples
787
+ ///
788
+ /// ```no_run
789
+ /// use nix::unistd;
790
+ ///
791
+ /// let domainname_cstr = unistd::getdomainname().expect("Failed getting domain name");
792
+ /// let domainname = domainname_cstr.into_string().expect("Domain name wasn't valid UTF-8");
793
+ /// println!("Domain name: {}", domainname);
794
+ /// ```
795
+ #[ cfg( not( target_os = "android" ) ) ]
796
+ pub fn getdomainname ( ) -> Result < CString > {
797
+ const MAXDOMAINNAMELEN : usize = 256 ;
798
+ let buf = vec ! [ 0 ; MAXDOMAINNAMELEN ] ;
799
+ let ptr = unsafe { CString :: from_vec_unchecked ( buf) . into_raw ( ) } ;
800
+
801
+ let res = unsafe { libc:: getdomainname ( ptr, MAXDOMAINNAMELEN as namelen_t ) } ;
802
+ Errno :: result ( res) . map ( |_| {
803
+ unsafe {
804
+ // Ensure returned string is always null-terminated
805
+ * ptr. offset ( ( MAXDOMAINNAMELEN - 1 ) as isize ) = 0 ;
806
+ CString :: from_raw ( ptr)
807
+ }
808
+ } )
809
+ }
810
+
761
811
/// Close a raw file descriptor
762
812
///
763
813
/// Be aware that many Rust types implicitly close-on-drop, including
0 commit comments