From 1c454e8b0b6d1c9dd0c8086cf53f017a4ca7d2bd Mon Sep 17 00:00:00 2001 From: KokaKiwi Date: Fri, 18 Oct 2013 14:00:38 +0200 Subject: [PATCH] Add whoami implementation. --- Makefile | 1 + whoami/whoami.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 whoami/whoami.rs diff --git a/Makefile b/Makefile index d43b21f12..5345e8bbb 100644 --- a/Makefile +++ b/Makefile @@ -6,5 +6,6 @@ build: sh -c 'rustc --out-dir build/ printenv/printenv.rs' sh -c 'rustc --out-dir build/ true/true.rs' sh -c 'rustc --out-dir build/ yes/yes.rs' + sh -c 'rustc --out-dir build/ whoami/whoami.rs' .PHONY: build diff --git a/whoami/whoami.rs b/whoami/whoami.rs new file mode 100644 index 000000000..089dc8372 --- /dev/null +++ b/whoami/whoami.rs @@ -0,0 +1,75 @@ +#[link(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 */ + +extern mod extra; + +use std::os; +use std::str; +use std::libc; +use extra::getopts::groups; + +struct c_passwd { + pw_name: *libc::c_char, + // Maybe I should put here others struct members, but...Well, maybe. +} + +extern { + pub fn geteuid() -> libc::c_int; + pub fn getpwuid(uid: libc::c_int) -> *c_passwd; +} + +#[fixed_stack_segment] +#[deny(cstack)] +unsafe fn getusername() -> ~str { + 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 +} + +fn main() { + let args = os::args(); + let program = args[0].as_slice(); + let opts = ~[ + groups::optflag("h", "help", "display this help and exit"), + groups::optflag("V", "version", "output version information and exit"), + ]; + let matches = match groups::getopts(args.tail(), opts) { + Ok(m) => m, + Err(f) => fail2!(f.to_err_msg()), + }; + if matches.opt_present("h") || matches.opt_present("help") { + println("whoami 1.0.0"); + println(""); + println("Usage:"); + println!(" {:s}", program); + println(""); + print(groups::usage("print effective userid", opts)); + return; + } + if matches.opt_present("V") || matches.opt_present("version") { + println("whoami 1.0.0"); + return; + } + + exec(); +} + +pub fn exec() { + unsafe { + let username = getusername(); + println!("{:s}", username); + } +}