#proxmox = { git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] }
#proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro", "websocket" ] }
proxmox-fuse = "0.1.0"
-pxar = { version = "0.2.1", features = [ "tokio-io", "futures-io" ] }
+pxar = { version = "0.3.0", features = [ "tokio-io", "futures-io" ] }
#pxar = { path = "../pxar", features = [ "tokio-io", "futures-io" ] }
regex = "1.2"
rustyline = "6"
use std::collections::{HashSet, HashMap};
-use std::convert::TryFrom;
use std::ffi::{CStr, CString, OsStr};
use std::fmt;
use std::io::{self, Read, Write};
// required for some of these
let proc_path = Path::new("/proc/self/fd/").join(fd.to_string());
- let mtime = u64::try_from(stat.st_mtime * 1_000_000_000 + stat.st_mtime_nsec)
- .map_err(|_| format_err!("file with negative mtime"))?;
-
let mut meta = Metadata {
stat: pxar::Stat {
mode: u64::from(stat.st_mode),
flags: 0,
uid: stat.st_uid,
gid: stat.st_gid,
- mtime,
+ mtime: pxar::format::StatxTimestamp {
+ secs: stat.st_mtime,
+ nanos: stat.st_mtime_nsec as u32,
+ },
},
..Default::default()
};
let metadata = entry.metadata();
- let time = i64::try_from(metadata.stat.mtime)
- .map_err(|_| format_err!("mtime does not fit into a signed 64 bit integer"))?;
- let sec = time / 1_000_000_000;
- let nsec = time % 1_000_000_000;
-
let mut stat: libc::stat = unsafe { mem::zeroed() };
stat.st_ino = inode;
stat.st_nlink = nlink;
.map_err(|err| format_err!("size does not fit into st_size field: {}", err))?;
stat.st_uid = metadata.stat.uid;
stat.st_gid = metadata.stat.gid;
- stat.st_atime = sec;
- stat.st_atime_nsec = nsec;
- stat.st_mtime = sec;
- stat.st_mtime_nsec = nsec;
- stat.st_ctime = sec;
- stat.st_ctime_nsec = nsec;
+ stat.st_atime = metadata.stat.mtime.secs;
+ stat.st_atime_nsec = metadata.stat.mtime.nanos as _;
+ stat.st_mtime = metadata.stat.mtime.secs;
+ stat.st_mtime_nsec = metadata.stat.mtime.nanos as _;
+ stat.st_ctime = metadata.stat.mtime.secs;
+ stat.st_ctime_nsec = metadata.stat.mtime.nanos as _;
Ok(stat)
}
}
}
-fn nsec_to_update_timespec(mtime_nsec: u64) -> [libc::timespec; 2] {
+fn timestamp_to_update_timespec(mtime: &pxar::format::StatxTimestamp) -> [libc::timespec; 2] {
// restore mtime
const UTIME_OMIT: i64 = (1 << 30) - 2;
- const NANOS_PER_SEC: i64 = 1_000_000_000;
- let sec = (mtime_nsec as i64) / NANOS_PER_SEC;
- let nsec = (mtime_nsec as i64) % NANOS_PER_SEC;
-
- let times: [libc::timespec; 2] = [
+ [
libc::timespec {
tv_sec: 0,
tv_nsec: UTIME_OMIT,
},
libc::timespec {
- tv_sec: sec,
- tv_nsec: nsec,
+ tv_sec: mtime.secs,
+ tv_nsec: mtime.nanos as _,
},
- ];
-
- times
+ ]
}
//
libc::utimensat(
libc::AT_FDCWD,
c_proc_path.as_ptr(),
- nsec_to_update_timespec(metadata.stat.mtime).as_ptr(),
+ timestamp_to_update_timespec(&metadata.stat.mtime).as_ptr(),
0,
)
});
let mode_string = mode_string(entry);
let meta = entry.metadata();
- let mtime = meta.mtime_as_duration();
- let mtime = chrono::Local.timestamp(mtime.as_secs() as i64, mtime.subsec_nanos());
+ let mtime = chrono::Local.timestamp(meta.stat.mtime.secs, meta.stat.mtime.nanos);
let (size, link) = match entry.kind() {
EntryKind::File { size, .. } => (format!("{}", *size), String::new()),
let mode_string = mode_string(entry);
let meta = entry.metadata();
- let mtime = meta.mtime_as_duration();
- let mtime = chrono::Local.timestamp(mtime.as_secs() as i64, mtime.subsec_nanos());
+ let mtime = chrono::Local.timestamp(meta.stat.mtime.secs, meta.stat.mtime.nanos);
let (size, link, type_name) = match entry.kind() {
EntryKind::File { size, .. } => (format!("{}", *size), String::new(), "file"),