diff options
Diffstat (limited to 'openat/examples/exchange.rs')
-rw-r--r-- | openat/examples/exchange.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/openat/examples/exchange.rs b/openat/examples/exchange.rs new file mode 100644 index 0000000..21fdf0a --- /dev/null +++ b/openat/examples/exchange.rs @@ -0,0 +1,39 @@ +extern crate argparse; +extern crate openat; + +use std::process::exit; +use std::path::PathBuf; + +use argparse::{ArgumentParser, Parse}; +use openat::Dir; + +#[cfg(not(target_os="linux"))] +fn main() { + println!("Atomic exchange is not supported on this platform") +} + +#[cfg(target_os="linux")] +fn main() { + let mut path1 = PathBuf::new(); + let mut path2 = PathBuf::new(); + { + let mut ap = ArgumentParser::new(); + ap.refer(&mut path1) + .add_argument("path1", Parse, "First path of exchange operation") + .required(); + ap.refer(&mut path2) + .add_argument("path2", Parse, "Second path of exchange operation") + .required(); + ap.parse_args_or_exit(); + } + if path1.parent() != path2.parent() { + println!("Paths must be in the same directory"); + exit(1); + } + let parent = path1.parent().expect("path must have parent directory"); + let dir = Dir::open(parent).expect("can open directory"); + dir.local_exchange( + path1.file_name().expect("path1 must have filename"), + path2.file_name().expect("path2 must have filename"), + ).expect("can rename"); +} |