@@ -5,23 +5,35 @@ use crate::device::errno_str;
5
5
use crate :: device:: Error ;
6
6
use libc:: * ;
7
7
8
+ #[ cfg( target_os = "macos" ) ]
9
+ use nix:: unistd:: User ;
10
+
8
11
pub fn get_saved_ids ( ) -> Result < ( uid_t , gid_t ) , Error > {
9
12
// Get the user name of the sudoer
10
- let uname = unsafe { getlogin ( ) } ;
11
- if uname. is_null ( ) {
12
- return Err ( Error :: DropPrivileges ( "NULL from getlogin" . to_owned ( ) ) ) ;
13
+ #[ cfg( target_os = "macos" ) ]
14
+ {
15
+ let uname: & ' static str = env ! ( "USER" ) ;
16
+ let user = User :: from_name ( uname) . unwrap ( ) . expect ( "a user" ) ;
17
+ return Ok ( ( uid_t:: from ( user. uid ) , gid_t:: from ( user. gid ) ) ) ;
13
18
}
14
- let userinfo = unsafe { getpwnam ( uname) } ;
15
- if userinfo. is_null ( ) {
16
- return Err ( Error :: DropPrivileges ( "NULL from getpwnam" . to_owned ( ) ) ) ;
19
+ #[ cfg( not( target_os = "macos" ) ) ]
20
+ {
21
+ let uname = unsafe { getlogin ( ) } ;
22
+ if uname. is_null ( ) {
23
+ return Err ( Error :: DropPrivileges ( "NULL from getlogin" . to_owned ( ) ) ) ;
24
+ }
25
+ let userinfo = unsafe { getpwnam ( uname) } ;
26
+ if userinfo. is_null ( ) {
27
+ return Err ( Error :: DropPrivileges ( "NULL from getpwnam" . to_owned ( ) ) ) ;
28
+ }
29
+
30
+ // Saved group ID
31
+ let saved_gid = unsafe { ( * userinfo) . pw_gid } ;
32
+ // Saved user ID
33
+ let saved_uid = unsafe { ( * userinfo) . pw_uid } ;
34
+
35
+ return Ok ( ( saved_uid, saved_gid) ) ;
17
36
}
18
-
19
- // Saved group ID
20
- let saved_gid = unsafe { ( * userinfo) . pw_gid } ;
21
- // Saved user ID
22
- let saved_uid = unsafe { ( * userinfo) . pw_uid } ;
23
-
24
- Ok ( ( saved_uid, saved_gid) )
25
37
}
26
38
27
39
pub fn drop_privileges ( ) -> Result < ( ) , Error > {
0 commit comments