#![crate_id(name="whoami", version="1.0.0", author="KokaKiwi")] /* * This file is part of the uutils coreutils package. * * (c) Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /* last synced with: whoami (GNU coreutils) 8.21 */ #![allow(non_camel_case_types)] #![feature(macro_rules)] extern crate getopts; extern crate libc; use std::io::print; use std::os; #[path = "../common/util.rs"] mod util; #[cfg(unix)] mod platform { use super::libc; use std::str; use self::c_types::{c_passwd, getpwuid}; #[path = "../../common/c_types.rs"] mod c_types; extern { pub fn geteuid() -> libc::c_int; } pub unsafe fn getusername() -> String { let passwd: *c_passwd = getpwuid(geteuid()); let pw_name: *libc::c_char = (*passwd).pw_name; let name = str::raw::from_c_str(pw_name); name } } #[cfg(windows)] mod platform { pub use super::libc; use std::mem; use std::str; extern "system" { pub fn GetUserNameA(out: *libc::c_char, len: *libc::uint32_t) -> libc::uint8_t; } #[allow(unused_unsafe)] pub unsafe fn getusername() -> String { let buffer: [libc::c_char, ..2048] = mem::uninitialized(); // XXX: it may be possible that this isn't long enough. I don't know if !GetUserNameA(buffer.as_ptr(), &(buffer.len() as libc::uint32_t)) == 0 { crash!(1, "username is too long"); } str::raw::from_c_str(buffer.as_ptr()) } } static NAME: &'static str = "whoami"; #[allow(dead_code)] fn main() { os::set_exit_status(uumain(os::args())); } pub fn uumain(args: Vec) -> int { let program = args.get(0).as_slice(); let opts = [ getopts::optflag("h", "help", "display this help and exit"), getopts::optflag("V", "version", "output version information and exit"), ]; let matches = match getopts::getopts(args.tail(), opts) { Ok(m) => m, Err(f) => crash!(1, "{}", f), }; if matches.opt_present("help") { println!("whoami 1.0.0"); println!(""); println!("Usage:"); println!(" {:s}", program); println!(""); print(getopts::usage("print effective userid", opts).as_slice()); return 0; } if matches.opt_present("version") { println!("whoami 1.0.0"); return 0; } exec(); 0 } pub fn exec() { unsafe { let username = platform::getusername(); println!("{:s}", username); } }