| 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"); |
| } |