diff --git a/Makefile b/Makefile index d01d750fc..284e1c6a4 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,7 @@ PROGS := \ head \ UNIX_PROGS := \ + logname \ users \ whoami \ tty \ diff --git a/logname/logname.rs b/logname/logname.rs new file mode 100644 index 000000000..975f242d8 --- /dev/null +++ b/logname/logname.rs @@ -0,0 +1,85 @@ +#[crate_id(name="logname", version="1.0.0", author="Benoit Benedetti")]; + +/* + * This file is part of the uutils coreutils package. + * + * (c) Benoit Benedetti + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* last synced with: logname (GNU coreutils) 8.22 */ + +#[allow(non_camel_case_types)]; + +#[feature(macro_rules)]; + +extern crate extra; +extern crate getopts; + +use std::io::{print, println}; +use std::os; +use std::str; +use std::libc; + +#[path = "../common/util.rs"] mod util; + +extern { + // POSIX requires using getlogin (or equivalent code) + pub fn getlogin() -> *libc::c_char; +} + +unsafe fn get_userlogin() -> ~str { + let login: *libc::c_char = getlogin(); + + str::raw::from_c_str(login) +} + +static NAME: &'static str = "logname"; +static VERSION: &'static str = "1.0.0"; + +fn version() { + println(NAME + " " + VERSION); +} + +fn main() { + let args = os::args(); + let program = args[0].clone(); + + // + // Argument parsing + // + 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, "Invalid options\n{}", f.to_err_msg()) + }; + + if matches.opt_present("help") { + version(); + println!(""); + println!("Usage:"); + println!(" {:s}", program); + println!(""); + print(getopts::usage("print user's login name", opts)); + return; + } + if matches.opt_present("version") { + version(); + return; + } + + exec(); +} + +fn exec() { + unsafe { + let userlogin = get_userlogin(); + println!("{:s}", userlogin); + } +}