diff --git a/Makefile b/Makefile index a578864da..6d2b0e49b 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ PROGS := \ tee \ true \ truncate \ + unlink \ wc \ yes \ hostname \ diff --git a/README.md b/README.md index 139ebf94b..ddf2ace6d 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,6 @@ To do - uname-uname - unexpand - uniq (in progress) -- unlink - who License diff --git a/unlink/unlink.rs b/unlink/unlink.rs new file mode 100644 index 000000000..e681e070e --- /dev/null +++ b/unlink/unlink.rs @@ -0,0 +1,87 @@ +#![crate_id(name="unlink", vers="1.0.0", author="zvms")] + +/* + * This file is part of the uutils coreutils package. + * + * (c) Colin Warren + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* last synced with: unlink (GNU coreutils) 8.21 */ + +#![feature(macro_rules)] + +extern crate getopts; +extern crate libc; + +use std::os; +use std::io; +use std::io::fs; +use std::io::print; + +#[path = "../common/util.rs"] +mod util; + +static NAME: &'static str = "unlink"; + +fn main() { + let args = os::args(); + let program = args.get(0).clone(); + 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") { + println!("unlink 1.0.0"); + println!(""); + println!("Usage:"); + println!(" {0:s} [FILE]... [OPTION]...", program); + println!(""); + print(getopts::usage("Unlink the file at [FILE].", opts)); + return; + } + + if matches.opt_present("version") { + println!("unlink 1.0.0"); + return; + } + + if matches.free.len() == 0 { + crash!(1, "missing operand\nTry '{0:s} --help' for more information.", program); + } else if matches.free.len() > 1 { + crash!(1, "extra operand: '{1}'\nTry '{0:s} --help' for more information.", program, matches.free.get(1)); + } + + let path = Path::new(matches.free.get(0).clone()); + + let result = path.lstat().and_then(|info| { + match info.kind { + io::TypeFile => Ok(()), + io::TypeSymlink => Ok(()), + _ => Err(io::IoError { + kind: io::OtherIoError, + desc: "is not a file or symlink", + detail: None + }) + } + }).and_then(|_| { + fs::unlink(&path) + }); + + match result { + Ok(_) => (), + Err(e) => { + crash!(1, "cannot unlink '{0}': {1}", path.display(), e.desc); + } + } +}