mirror of
https://github.com/uutils/coreutils
synced 2024-11-17 02:08:09 +00:00
Added support for preserving timestamps.
This commit is contained in:
parent
48ae9b64ba
commit
03432db951
1 changed files with 19 additions and 3 deletions
22
src/cp/cp.rs
22
src/cp/cp.rs
|
@ -10,6 +10,7 @@
|
|||
* that was distributed with this source code.
|
||||
*/
|
||||
|
||||
extern crate libc;
|
||||
extern crate clap;
|
||||
extern crate walkdir;
|
||||
#[cfg(target_os = "linux")]
|
||||
|
@ -17,6 +18,8 @@ extern crate walkdir;
|
|||
#[macro_use] extern crate uucore;
|
||||
#[macro_use] extern crate quick_error;
|
||||
|
||||
use std::mem;
|
||||
use std::ffi::CString;
|
||||
use clap::{Arg, App, ArgMatches};
|
||||
use quick_error::ResultExt;
|
||||
use std::collections::HashSet;
|
||||
|
@ -516,7 +519,6 @@ impl Options {
|
|||
OPT_DEREFERENCE,
|
||||
OPT_NO_DEREFERENCE,
|
||||
OPT_PRESERVE_DEFUALT_ATTRIBUTES,
|
||||
OPT_PRESERVE,
|
||||
OPT_NO_PRESERVE,
|
||||
OPT_PARENTS,
|
||||
OPT_SPARSE,
|
||||
|
@ -787,7 +789,21 @@ fn copy_attribute(source: &Path, dest: &Path, attribute: &Attribute) -> CopyResu
|
|||
let metadata = fs::metadata(source).context(context)?;
|
||||
fs::set_permissions(dest, metadata.permissions()).context(context)?;
|
||||
},
|
||||
Attribute::Timestamps => return Err(Error::NotImplemented("preserving timestamp not implemented".to_string())),
|
||||
Attribute::Timestamps => {
|
||||
let meta = fs::metadata(source)?;
|
||||
let modified = meta.modified()?;
|
||||
let accessed = meta.accessed()?;
|
||||
let src_path = CString::new(source.as_os_str().to_str().unwrap()).unwrap();
|
||||
let dest_path = CString::new(dest.as_os_str().to_str().unwrap()).unwrap();
|
||||
unsafe {
|
||||
let mut stat: libc::stat = mem::zeroed();
|
||||
libc::stat(src_path.as_ptr(), &mut stat);
|
||||
libc::utime(dest_path.as_ptr(), &libc::utimbuf{
|
||||
actime: stat.st_atime,
|
||||
modtime: stat.st_mtime
|
||||
});
|
||||
}
|
||||
},
|
||||
Attribute::Context => return Err(Error::NotImplemented("preserving context not implemented".to_string())),
|
||||
Attribute::Links => return Err(Error::NotImplemented("preserving links not implemented".to_string())),
|
||||
Attribute::Xattr => return Err(Error::NotImplemented("preserving xattr not implemented".to_string())),
|
||||
|
@ -892,7 +908,7 @@ fn copy_file(source: &Path, dest: &Path, options: &Options) -> CopyResult<()> {
|
|||
}
|
||||
},
|
||||
CopyMode::AttrOnly => {
|
||||
let dst_file = OpenOptions::new()
|
||||
OpenOptions::new()
|
||||
.write(true)
|
||||
.truncate(false)
|
||||
.create(true)
|
||||
|
|
Loading…
Reference in a new issue