1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-08-03 22:47:46 +00:00

Merge pull request #689 from dbrgn/whoami_fix

whoami fixes
This commit is contained in:
Michael Gehring 2015-09-18 12:48:14 +02:00
commit b18a2122ae
3 changed files with 26 additions and 8 deletions

View file

@ -7,6 +7,7 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
use std::io::{Result, Error};
use ::libc; use ::libc;
use self::c_types::{c_passwd, getpwuid}; use self::c_types::{c_passwd, getpwuid};
@ -16,9 +17,18 @@ extern {
pub fn geteuid() -> libc::uid_t; pub fn geteuid() -> libc::uid_t;
} }
pub unsafe fn getusername() -> String { pub unsafe fn getusername() -> Result<String> {
let passwd: *const c_passwd = getpwuid(geteuid()); // Get effective user id
let uid = geteuid();
let pw_name: *const libc::c_char = (*passwd).pw_name; // Try to find username for uid
String::from_utf8_lossy(::std::ffi::CStr::from_ptr(pw_name).to_bytes()).to_string() let passwd: *const c_passwd = getpwuid(uid);
if passwd.is_null() {
return Err(Error::last_os_error())
}
// Extract username from passwd struct
let pw_name: *const libc::c_char = (*passwd).pw_name;
let username = String::from_utf8_lossy(::std::ffi::CStr::from_ptr(pw_name).to_bytes()).to_string();
Ok(username)
} }

View file

@ -10,6 +10,8 @@
extern crate winapi; extern crate winapi;
extern crate advapi32; extern crate advapi32;
use std::io::{Result, Error};
#[path = "../../common/wide.rs"] #[macro_use] mod wide; #[path = "../../common/wide.rs"] #[macro_use] mod wide;
use std::mem; use std::mem;
@ -18,11 +20,12 @@ use std::ffi::OsString;
use std::os::windows::ffi::OsStringExt; use std::os::windows::ffi::OsStringExt;
use self::wide::FromWide; use self::wide::FromWide;
pub unsafe fn getusername() -> String { pub unsafe fn getusername() -> Result<String> {
let mut buffer: [winapi::WCHAR; winapi::UNLEN as usize + 1] = mem::uninitialized(); let mut buffer: [winapi::WCHAR; winapi::UNLEN as usize + 1] = mem::uninitialized();
let mut len = buffer.len() as winapi::DWORD; let mut len = buffer.len() as winapi::DWORD;
if advapi32::GetUserNameW(buffer.as_mut_ptr(), &mut len) == 0 { if advapi32::GetUserNameW(buffer.as_mut_ptr(), &mut len) == 0 {
crash!(1, "failed to get username"); return Err(Error::last_os_error())
} }
String::from_wide(&buffer[..len as usize - 1]) let username = String::from_wide(&buffer[..len as usize - 1]);
Ok(username)
} }

View file

@ -54,7 +54,12 @@ pub fn uumain(args: Vec<String>) -> i32 {
pub fn exec() { pub fn exec() {
unsafe { unsafe {
let username = platform::getusername(); match platform::getusername() {
println!("{}", username); Ok(username) => println!("{}", username),
Err(err) => match err.raw_os_error() {
Some(0) | None => crash!(1, "failed to get username"),
Some(_) => crash!(1, "failed to get username: {}", err),
}
}
} }
} }