client: rustfmt
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
use std::collections::{HashSet, HashMap};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::ffi::{CStr, CString, OsStr};
|
||||
use std::fmt;
|
||||
use std::io::{self, Read, Write};
|
||||
@ -8,29 +8,29 @@ use std::path::{Path, PathBuf};
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use anyhow::{bail, format_err, Error};
|
||||
use futures::future::BoxFuture;
|
||||
use futures::FutureExt;
|
||||
use nix::dir::Dir;
|
||||
use nix::errno::Errno;
|
||||
use nix::fcntl::OFlag;
|
||||
use nix::sys::stat::{FileStat, Mode};
|
||||
use futures::future::BoxFuture;
|
||||
use futures::FutureExt;
|
||||
|
||||
use pathpatterns::{MatchEntry, MatchFlag, MatchList, MatchType, PatternFlag};
|
||||
use pxar::encoder::{LinkOffset, SeqWrite};
|
||||
use pxar::Metadata;
|
||||
use pxar::encoder::{SeqWrite, LinkOffset};
|
||||
|
||||
use proxmox_sys::error::SysError;
|
||||
use proxmox_sys::fd::RawFdNum;
|
||||
use proxmox_sys::fd::Fd;
|
||||
use proxmox_sys::fs::{self, acl, xattr};
|
||||
use proxmox_io::vec;
|
||||
use proxmox_lang::c_str;
|
||||
use proxmox_sys::error::SysError;
|
||||
use proxmox_sys::fd::Fd;
|
||||
use proxmox_sys::fd::RawFdNum;
|
||||
use proxmox_sys::fs::{self, acl, xattr};
|
||||
|
||||
use pbs_datastore::catalog::BackupCatalogWriter;
|
||||
|
||||
use crate::pxar::metadata::errno_is_unsupported;
|
||||
use crate::pxar::Flags;
|
||||
use crate::pxar::tools::assert_single_path_component;
|
||||
use crate::pxar::Flags;
|
||||
|
||||
/// Pxar options for creating a pxar archive/stream
|
||||
#[derive(Default, Clone)]
|
||||
@ -47,7 +47,6 @@ pub struct PxarCreateOptions {
|
||||
pub verbose: bool,
|
||||
}
|
||||
|
||||
|
||||
fn detect_fs_type(fd: RawFd) -> Result<i64, Error> {
|
||||
let mut fs_stat = std::mem::MaybeUninit::uninit();
|
||||
let res = unsafe { libc::fstatfs(fd, fs_stat.as_mut_ptr()) };
|
||||
@ -229,7 +228,9 @@ where
|
||||
file_copy_buffer: vec::undefined(4 * 1024 * 1024),
|
||||
};
|
||||
|
||||
archiver.archive_dir_contents(&mut encoder, source_dir, true).await?;
|
||||
archiver
|
||||
.archive_dir_contents(&mut encoder, source_dir, true)
|
||||
.await?;
|
||||
encoder.finish().await?;
|
||||
Ok(())
|
||||
}
|
||||
@ -285,13 +286,15 @@ impl Archiver {
|
||||
let file_name = file_entry.name.to_bytes();
|
||||
|
||||
if is_root && file_name == b".pxarexclude-cli" {
|
||||
self.encode_pxarexclude_cli(encoder, &file_entry.name, old_patterns_count).await?;
|
||||
self.encode_pxarexclude_cli(encoder, &file_entry.name, old_patterns_count)
|
||||
.await?;
|
||||
continue;
|
||||
}
|
||||
|
||||
(self.callback)(&file_entry.path)?;
|
||||
self.path = file_entry.path;
|
||||
self.add_entry(encoder, dir_fd, &file_entry.name, &file_entry.stat).await
|
||||
self.add_entry(encoder, dir_fd, &file_entry.name, &file_entry.stat)
|
||||
.await
|
||||
.map_err(|err| self.wrap_err(err))?;
|
||||
}
|
||||
self.path = old_path;
|
||||
@ -299,7 +302,8 @@ impl Archiver {
|
||||
self.patterns.truncate(old_patterns_count);
|
||||
|
||||
Ok(())
|
||||
}.boxed()
|
||||
}
|
||||
.boxed()
|
||||
}
|
||||
|
||||
/// openat() wrapper which allows but logs `EACCES` and turns `ENOENT` into `None`.
|
||||
@ -332,7 +336,11 @@ impl Archiver {
|
||||
Ok(None)
|
||||
}
|
||||
Err(nix::Error::Sys(Errno::EACCES)) => {
|
||||
writeln!(self.errors, "failed to open file: {:?}: access denied", file_name)?;
|
||||
writeln!(
|
||||
self.errors,
|
||||
"failed to open file: {:?}: access denied",
|
||||
file_name
|
||||
)?;
|
||||
Ok(None)
|
||||
}
|
||||
Err(nix::Error::Sys(Errno::EPERM)) if !noatime.is_empty() => {
|
||||
@ -341,7 +349,7 @@ impl Archiver {
|
||||
continue;
|
||||
}
|
||||
Err(other) => Err(Error::from(other)),
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@ -365,8 +373,7 @@ impl Archiver {
|
||||
let _ = writeln!(
|
||||
self.errors,
|
||||
"ignoring .pxarexclude after read error in {:?}: {}",
|
||||
self.path,
|
||||
err,
|
||||
self.path, err,
|
||||
);
|
||||
self.patterns.truncate(old_pattern_count);
|
||||
return Ok(());
|
||||
@ -422,13 +429,18 @@ impl Archiver {
|
||||
) -> Result<(), Error> {
|
||||
let content = generate_pxar_excludes_cli(&self.patterns[..patterns_count]);
|
||||
if let Some(ref catalog) = self.catalog {
|
||||
catalog.lock().unwrap().add_file(file_name, content.len() as u64, 0)?;
|
||||
catalog
|
||||
.lock()
|
||||
.unwrap()
|
||||
.add_file(file_name, content.len() as u64, 0)?;
|
||||
}
|
||||
|
||||
let mut metadata = Metadata::default();
|
||||
metadata.stat.mode = pxar::format::mode::IFREG | 0o600;
|
||||
|
||||
let mut file = encoder.create_file(&metadata, ".pxarexclude-cli", content.len() as u64).await?;
|
||||
let mut file = encoder
|
||||
.create_file(&metadata, ".pxarexclude-cli", content.len() as u64)
|
||||
.await?;
|
||||
file.write_all(&content).await?;
|
||||
|
||||
Ok(())
|
||||
@ -481,13 +493,16 @@ impl Archiver {
|
||||
|
||||
self.entry_counter += 1;
|
||||
if self.entry_counter > self.entry_limit {
|
||||
bail!("exceeded allowed number of file entries (> {})",self.entry_limit);
|
||||
bail!(
|
||||
"exceeded allowed number of file entries (> {})",
|
||||
self.entry_limit
|
||||
);
|
||||
}
|
||||
|
||||
file_list.push(FileListEntry {
|
||||
name: file_name,
|
||||
path: full_path,
|
||||
stat
|
||||
stat,
|
||||
});
|
||||
}
|
||||
|
||||
@ -497,7 +512,11 @@ impl Archiver {
|
||||
}
|
||||
|
||||
fn report_vanished_file(&mut self) -> Result<(), Error> {
|
||||
writeln!(self.errors, "warning: file vanished while reading: {:?}", self.path)?;
|
||||
writeln!(
|
||||
self.errors,
|
||||
"warning: file vanished while reading: {:?}",
|
||||
self.path
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -547,7 +566,13 @@ impl Archiver {
|
||||
None => return Ok(()),
|
||||
};
|
||||
|
||||
let metadata = get_metadata(fd.as_raw_fd(), stat, self.flags(), self.fs_magic, &mut self.fs_feature_flags)?;
|
||||
let metadata = get_metadata(
|
||||
fd.as_raw_fd(),
|
||||
stat,
|
||||
self.flags(),
|
||||
self.fs_magic,
|
||||
&mut self.fs_feature_flags,
|
||||
)?;
|
||||
|
||||
let match_path = PathBuf::from("/").join(self.path.clone());
|
||||
if self
|
||||
@ -580,14 +605,19 @@ impl Archiver {
|
||||
|
||||
let file_size = stat.st_size as u64;
|
||||
if let Some(ref catalog) = self.catalog {
|
||||
catalog.lock().unwrap().add_file(c_file_name, file_size, stat.st_mtime)?;
|
||||
catalog
|
||||
.lock()
|
||||
.unwrap()
|
||||
.add_file(c_file_name, file_size, stat.st_mtime)?;
|
||||
}
|
||||
|
||||
let offset: LinkOffset =
|
||||
self.add_regular_file(encoder, fd, file_name, &metadata, file_size).await?;
|
||||
let offset: LinkOffset = self
|
||||
.add_regular_file(encoder, fd, file_name, &metadata, file_size)
|
||||
.await?;
|
||||
|
||||
if stat.st_nlink > 1 {
|
||||
self.hardlinks.insert(link_info, (self.path.clone(), offset));
|
||||
self.hardlinks
|
||||
.insert(link_info, (self.path.clone(), offset));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@ -598,7 +628,9 @@ impl Archiver {
|
||||
if let Some(ref catalog) = self.catalog {
|
||||
catalog.lock().unwrap().start_directory(c_file_name)?;
|
||||
}
|
||||
let result = self.add_directory(encoder, dir, c_file_name, &metadata, stat).await;
|
||||
let result = self
|
||||
.add_directory(encoder, dir, c_file_name, &metadata, stat)
|
||||
.await;
|
||||
if let Some(ref catalog) = self.catalog {
|
||||
catalog.lock().unwrap().end_directory()?;
|
||||
}
|
||||
@ -749,15 +781,23 @@ impl Archiver {
|
||||
metadata: &Metadata,
|
||||
stat: &FileStat,
|
||||
) -> Result<(), Error> {
|
||||
Ok(encoder.add_device(
|
||||
metadata,
|
||||
file_name,
|
||||
pxar::format::Device::from_dev_t(stat.st_rdev),
|
||||
).await?)
|
||||
Ok(encoder
|
||||
.add_device(
|
||||
metadata,
|
||||
file_name,
|
||||
pxar::format::Device::from_dev_t(stat.st_rdev),
|
||||
)
|
||||
.await?)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_metadata(fd: RawFd, stat: &FileStat, flags: Flags, fs_magic: i64, fs_feature_flags: &mut Flags) -> Result<Metadata, Error> {
|
||||
fn get_metadata(
|
||||
fd: RawFd,
|
||||
stat: &FileStat,
|
||||
flags: Flags,
|
||||
fs_magic: i64,
|
||||
fs_feature_flags: &mut Flags,
|
||||
) -> Result<Metadata, Error> {
|
||||
// required for some of these
|
||||
let proc_path = Path::new("/proc/self/fd/").join(fd.to_string());
|
||||
|
||||
@ -779,7 +819,12 @@ fn get_metadata(fd: RawFd, stat: &FileStat, flags: Flags, fs_magic: i64, fs_feat
|
||||
Ok(meta)
|
||||
}
|
||||
|
||||
fn get_fcaps(meta: &mut Metadata, fd: RawFd, flags: Flags, fs_feature_flags: &mut Flags) -> Result<(), Error> {
|
||||
fn get_fcaps(
|
||||
meta: &mut Metadata,
|
||||
fd: RawFd,
|
||||
flags: Flags,
|
||||
fs_feature_flags: &mut Flags,
|
||||
) -> Result<(), Error> {
|
||||
if !flags.contains(Flags::WITH_FCAPS) {
|
||||
return Ok(());
|
||||
}
|
||||
@ -815,7 +860,7 @@ fn get_xattr_fcaps_acl(
|
||||
Err(Errno::EOPNOTSUPP) => {
|
||||
fs_feature_flags.remove(Flags::WITH_XATTRS);
|
||||
return Ok(());
|
||||
},
|
||||
}
|
||||
Err(Errno::EBADF) => return Ok(()), // symlinks
|
||||
Err(err) => bail!("failed to read xattrs: {}", err),
|
||||
};
|
||||
@ -932,7 +977,12 @@ fn get_quota_project_id(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_acl(metadata: &mut Metadata, proc_path: &Path, flags: Flags, fs_feature_flags: &mut Flags) -> Result<(), Error> {
|
||||
fn get_acl(
|
||||
metadata: &mut Metadata,
|
||||
proc_path: &Path,
|
||||
flags: Flags,
|
||||
fs_feature_flags: &mut Flags,
|
||||
) -> Result<(), Error> {
|
||||
if !flags.contains(Flags::WITH_ACL) {
|
||||
return Ok(());
|
||||
}
|
||||
|
@ -151,24 +151,35 @@ impl Default for Flags {
|
||||
}
|
||||
}
|
||||
|
||||
// form /usr/include/linux/fs.h
|
||||
const FS_APPEND_FL: c_long = 0x0000_0020;
|
||||
const FS_NOATIME_FL: c_long = 0x0000_0080;
|
||||
const FS_COMPR_FL: c_long = 0x0000_0004;
|
||||
const FS_NOCOW_FL: c_long = 0x0080_0000;
|
||||
const FS_NODUMP_FL: c_long = 0x0000_0040;
|
||||
const FS_DIRSYNC_FL: c_long = 0x0001_0000;
|
||||
const FS_IMMUTABLE_FL: c_long = 0x0000_0010;
|
||||
const FS_SYNC_FL: c_long = 0x0000_0008;
|
||||
const FS_NOCOMP_FL: c_long = 0x0000_0400;
|
||||
const FS_PROJINHERIT_FL: c_long = 0x2000_0000;
|
||||
#[rustfmt::skip]
|
||||
mod fs_flags {
|
||||
use libc::c_long;
|
||||
// form /usr/include/linux/fs.h
|
||||
pub const FS_APPEND_FL: c_long = 0x0000_0020;
|
||||
pub const FS_NOATIME_FL: c_long = 0x0000_0080;
|
||||
pub const FS_COMPR_FL: c_long = 0x0000_0004;
|
||||
pub const FS_NOCOW_FL: c_long = 0x0080_0000;
|
||||
pub const FS_NODUMP_FL: c_long = 0x0000_0040;
|
||||
pub const FS_DIRSYNC_FL: c_long = 0x0001_0000;
|
||||
pub const FS_IMMUTABLE_FL: c_long = 0x0000_0010;
|
||||
pub const FS_SYNC_FL: c_long = 0x0000_0008;
|
||||
pub const FS_NOCOMP_FL: c_long = 0x0000_0400;
|
||||
pub const FS_PROJINHERIT_FL: c_long = 0x2000_0000;
|
||||
|
||||
pub(crate) const INITIAL_FS_FLAGS: c_long =
|
||||
FS_NOATIME_FL
|
||||
| FS_COMPR_FL
|
||||
| FS_NOCOW_FL
|
||||
| FS_NOCOMP_FL
|
||||
| FS_PROJINHERIT_FL;
|
||||
// from /usr/include/linux/msdos_fs.h
|
||||
pub const ATTR_HIDDEN: u32 = 2;
|
||||
pub const ATTR_SYS: u32 = 4;
|
||||
pub const ATTR_ARCH: u32 = 32;
|
||||
|
||||
pub(crate) const INITIAL_FS_FLAGS: c_long =
|
||||
FS_NOATIME_FL
|
||||
| FS_COMPR_FL
|
||||
| FS_NOCOW_FL
|
||||
| FS_NOCOMP_FL
|
||||
| FS_PROJINHERIT_FL;
|
||||
|
||||
}
|
||||
use fs_flags::*; // for code formating/rusfmt
|
||||
|
||||
#[rustfmt::skip]
|
||||
const CHATTR_MAP: [(Flags, c_long); 10] = [
|
||||
@ -184,11 +195,6 @@ const CHATTR_MAP: [(Flags, c_long); 10] = [
|
||||
( Flags::WITH_FLAG_PROJINHERIT, FS_PROJINHERIT_FL ),
|
||||
];
|
||||
|
||||
// from /usr/include/linux/msdos_fs.h
|
||||
const ATTR_HIDDEN: u32 = 2;
|
||||
const ATTR_SYS: u32 = 4;
|
||||
const ATTR_ARCH: u32 = 32;
|
||||
|
||||
#[rustfmt::skip]
|
||||
const FAT_ATTR_MAP: [(Flags, u32); 3] = [
|
||||
( Flags::WITH_FLAG_HIDDEN, ATTR_HIDDEN ),
|
||||
@ -258,121 +264,117 @@ impl Flags {
|
||||
use proxmox_sys::linux::magic::*;
|
||||
match magic {
|
||||
MSDOS_SUPER_MAGIC => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_FAT_ATTRS
|
||||
},
|
||||
Flags::WITH_2SEC_TIME | Flags::WITH_READ_ONLY | Flags::WITH_FAT_ATTRS
|
||||
}
|
||||
EXT4_SUPER_MAGIC => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_PERMISSIONS |
|
||||
Flags::WITH_SYMLINKS |
|
||||
Flags::WITH_DEVICE_NODES |
|
||||
Flags::WITH_FIFOS |
|
||||
Flags::WITH_SOCKETS |
|
||||
Flags::WITH_FLAG_APPEND |
|
||||
Flags::WITH_FLAG_NOATIME |
|
||||
Flags::WITH_FLAG_NODUMP |
|
||||
Flags::WITH_FLAG_DIRSYNC |
|
||||
Flags::WITH_FLAG_IMMUTABLE |
|
||||
Flags::WITH_FLAG_SYNC |
|
||||
Flags::WITH_XATTRS |
|
||||
Flags::WITH_ACL |
|
||||
Flags::WITH_SELINUX |
|
||||
Flags::WITH_FCAPS |
|
||||
Flags::WITH_QUOTA_PROJID
|
||||
},
|
||||
Flags::WITH_2SEC_TIME
|
||||
| Flags::WITH_READ_ONLY
|
||||
| Flags::WITH_PERMISSIONS
|
||||
| Flags::WITH_SYMLINKS
|
||||
| Flags::WITH_DEVICE_NODES
|
||||
| Flags::WITH_FIFOS
|
||||
| Flags::WITH_SOCKETS
|
||||
| Flags::WITH_FLAG_APPEND
|
||||
| Flags::WITH_FLAG_NOATIME
|
||||
| Flags::WITH_FLAG_NODUMP
|
||||
| Flags::WITH_FLAG_DIRSYNC
|
||||
| Flags::WITH_FLAG_IMMUTABLE
|
||||
| Flags::WITH_FLAG_SYNC
|
||||
| Flags::WITH_XATTRS
|
||||
| Flags::WITH_ACL
|
||||
| Flags::WITH_SELINUX
|
||||
| Flags::WITH_FCAPS
|
||||
| Flags::WITH_QUOTA_PROJID
|
||||
}
|
||||
XFS_SUPER_MAGIC => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_PERMISSIONS |
|
||||
Flags::WITH_SYMLINKS |
|
||||
Flags::WITH_DEVICE_NODES |
|
||||
Flags::WITH_FIFOS |
|
||||
Flags::WITH_SOCKETS |
|
||||
Flags::WITH_FLAG_APPEND |
|
||||
Flags::WITH_FLAG_NOATIME |
|
||||
Flags::WITH_FLAG_NODUMP |
|
||||
Flags::WITH_FLAG_IMMUTABLE |
|
||||
Flags::WITH_FLAG_SYNC |
|
||||
Flags::WITH_XATTRS |
|
||||
Flags::WITH_ACL |
|
||||
Flags::WITH_SELINUX |
|
||||
Flags::WITH_FCAPS |
|
||||
Flags::WITH_QUOTA_PROJID
|
||||
},
|
||||
Flags::WITH_2SEC_TIME
|
||||
| Flags::WITH_READ_ONLY
|
||||
| Flags::WITH_PERMISSIONS
|
||||
| Flags::WITH_SYMLINKS
|
||||
| Flags::WITH_DEVICE_NODES
|
||||
| Flags::WITH_FIFOS
|
||||
| Flags::WITH_SOCKETS
|
||||
| Flags::WITH_FLAG_APPEND
|
||||
| Flags::WITH_FLAG_NOATIME
|
||||
| Flags::WITH_FLAG_NODUMP
|
||||
| Flags::WITH_FLAG_IMMUTABLE
|
||||
| Flags::WITH_FLAG_SYNC
|
||||
| Flags::WITH_XATTRS
|
||||
| Flags::WITH_ACL
|
||||
| Flags::WITH_SELINUX
|
||||
| Flags::WITH_FCAPS
|
||||
| Flags::WITH_QUOTA_PROJID
|
||||
}
|
||||
ZFS_SUPER_MAGIC => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_PERMISSIONS |
|
||||
Flags::WITH_SYMLINKS |
|
||||
Flags::WITH_DEVICE_NODES |
|
||||
Flags::WITH_FIFOS |
|
||||
Flags::WITH_SOCKETS |
|
||||
Flags::WITH_FLAG_APPEND |
|
||||
Flags::WITH_FLAG_NOATIME |
|
||||
Flags::WITH_FLAG_NODUMP |
|
||||
Flags::WITH_FLAG_DIRSYNC |
|
||||
Flags::WITH_FLAG_IMMUTABLE |
|
||||
Flags::WITH_FLAG_SYNC |
|
||||
Flags::WITH_XATTRS |
|
||||
Flags::WITH_ACL |
|
||||
Flags::WITH_SELINUX |
|
||||
Flags::WITH_FCAPS |
|
||||
Flags::WITH_QUOTA_PROJID
|
||||
},
|
||||
Flags::WITH_2SEC_TIME
|
||||
| Flags::WITH_READ_ONLY
|
||||
| Flags::WITH_PERMISSIONS
|
||||
| Flags::WITH_SYMLINKS
|
||||
| Flags::WITH_DEVICE_NODES
|
||||
| Flags::WITH_FIFOS
|
||||
| Flags::WITH_SOCKETS
|
||||
| Flags::WITH_FLAG_APPEND
|
||||
| Flags::WITH_FLAG_NOATIME
|
||||
| Flags::WITH_FLAG_NODUMP
|
||||
| Flags::WITH_FLAG_DIRSYNC
|
||||
| Flags::WITH_FLAG_IMMUTABLE
|
||||
| Flags::WITH_FLAG_SYNC
|
||||
| Flags::WITH_XATTRS
|
||||
| Flags::WITH_ACL
|
||||
| Flags::WITH_SELINUX
|
||||
| Flags::WITH_FCAPS
|
||||
| Flags::WITH_QUOTA_PROJID
|
||||
}
|
||||
BTRFS_SUPER_MAGIC => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_PERMISSIONS |
|
||||
Flags::WITH_SYMLINKS |
|
||||
Flags::WITH_DEVICE_NODES |
|
||||
Flags::WITH_FIFOS |
|
||||
Flags::WITH_SOCKETS |
|
||||
Flags::WITH_FLAG_APPEND |
|
||||
Flags::WITH_FLAG_NOATIME |
|
||||
Flags::WITH_FLAG_COMPR |
|
||||
Flags::WITH_FLAG_NOCOW |
|
||||
Flags::WITH_FLAG_NODUMP |
|
||||
Flags::WITH_FLAG_DIRSYNC |
|
||||
Flags::WITH_FLAG_IMMUTABLE |
|
||||
Flags::WITH_FLAG_SYNC |
|
||||
Flags::WITH_FLAG_NOCOMP |
|
||||
Flags::WITH_XATTRS |
|
||||
Flags::WITH_ACL |
|
||||
Flags::WITH_SELINUX |
|
||||
Flags::WITH_SUBVOLUME |
|
||||
Flags::WITH_SUBVOLUME_RO |
|
||||
Flags::WITH_FCAPS
|
||||
},
|
||||
Flags::WITH_2SEC_TIME
|
||||
| Flags::WITH_READ_ONLY
|
||||
| Flags::WITH_PERMISSIONS
|
||||
| Flags::WITH_SYMLINKS
|
||||
| Flags::WITH_DEVICE_NODES
|
||||
| Flags::WITH_FIFOS
|
||||
| Flags::WITH_SOCKETS
|
||||
| Flags::WITH_FLAG_APPEND
|
||||
| Flags::WITH_FLAG_NOATIME
|
||||
| Flags::WITH_FLAG_COMPR
|
||||
| Flags::WITH_FLAG_NOCOW
|
||||
| Flags::WITH_FLAG_NODUMP
|
||||
| Flags::WITH_FLAG_DIRSYNC
|
||||
| Flags::WITH_FLAG_IMMUTABLE
|
||||
| Flags::WITH_FLAG_SYNC
|
||||
| Flags::WITH_FLAG_NOCOMP
|
||||
| Flags::WITH_XATTRS
|
||||
| Flags::WITH_ACL
|
||||
| Flags::WITH_SELINUX
|
||||
| Flags::WITH_SUBVOLUME
|
||||
| Flags::WITH_SUBVOLUME_RO
|
||||
| Flags::WITH_FCAPS
|
||||
}
|
||||
TMPFS_MAGIC => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_PERMISSIONS |
|
||||
Flags::WITH_SYMLINKS |
|
||||
Flags::WITH_DEVICE_NODES |
|
||||
Flags::WITH_FIFOS |
|
||||
Flags::WITH_SOCKETS |
|
||||
Flags::WITH_ACL |
|
||||
Flags::WITH_SELINUX
|
||||
},
|
||||
Flags::WITH_2SEC_TIME
|
||||
| Flags::WITH_READ_ONLY
|
||||
| Flags::WITH_PERMISSIONS
|
||||
| Flags::WITH_SYMLINKS
|
||||
| Flags::WITH_DEVICE_NODES
|
||||
| Flags::WITH_FIFOS
|
||||
| Flags::WITH_SOCKETS
|
||||
| Flags::WITH_ACL
|
||||
| Flags::WITH_SELINUX
|
||||
}
|
||||
// FUSE mounts are special as the supported feature set
|
||||
// is not clear a priori.
|
||||
FUSE_SUPER_MAGIC => {
|
||||
Flags::WITH_FUSE
|
||||
},
|
||||
FUSE_SUPER_MAGIC => Flags::WITH_FUSE,
|
||||
_ => {
|
||||
Flags::WITH_2SEC_TIME |
|
||||
Flags::WITH_READ_ONLY |
|
||||
Flags::WITH_PERMISSIONS |
|
||||
Flags::WITH_SYMLINKS |
|
||||
Flags::WITH_DEVICE_NODES |
|
||||
Flags::WITH_FIFOS |
|
||||
Flags::WITH_SOCKETS |
|
||||
Flags::WITH_XATTRS |
|
||||
Flags::WITH_ACL |
|
||||
Flags::WITH_FCAPS
|
||||
},
|
||||
Flags::WITH_2SEC_TIME
|
||||
| Flags::WITH_READ_ONLY
|
||||
| Flags::WITH_PERMISSIONS
|
||||
| Flags::WITH_SYMLINKS
|
||||
| Flags::WITH_DEVICE_NODES
|
||||
| Flags::WITH_FIFOS
|
||||
| Flags::WITH_SOCKETS
|
||||
| Flags::WITH_XATTRS
|
||||
| Flags::WITH_ACL
|
||||
| Flags::WITH_FCAPS
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -503,7 +503,9 @@ impl SessionImpl {
|
||||
|
||||
async fn getattr(&self, inode: u64) -> Result<libc::stat, Error> {
|
||||
let entry = unsafe {
|
||||
self.accessor.open_file_at_range(&self.get_lookup(inode)?.entry_range_info).await?
|
||||
self.accessor
|
||||
.open_file_at_range(&self.get_lookup(inode)?.entry_range_info)
|
||||
.await?
|
||||
};
|
||||
to_stat(inode, &entry)
|
||||
}
|
||||
@ -584,11 +586,7 @@ impl SessionImpl {
|
||||
|
||||
async fn listxattrs(&self, inode: u64) -> Result<Vec<pxar::format::XAttr>, Error> {
|
||||
let lookup = self.get_lookup(inode)?;
|
||||
let metadata = self
|
||||
.open_entry(&lookup)
|
||||
.await?
|
||||
.into_entry()
|
||||
.into_metadata();
|
||||
let metadata = self.open_entry(&lookup).await?.into_entry().into_metadata();
|
||||
|
||||
let mut xattrs = metadata.xattrs;
|
||||
|
||||
|
@ -358,7 +358,10 @@ fn apply_quota_project_id(flags: Flags, fd: RawFd, metadata: &Metadata) -> Resul
|
||||
}
|
||||
|
||||
pub(crate) fn errno_is_unsupported(errno: Errno) -> bool {
|
||||
matches!(errno, Errno::ENOTTY | Errno::ENOSYS | Errno::EBADF | Errno::EOPNOTSUPP | Errno::EINVAL)
|
||||
matches!(
|
||||
errno,
|
||||
Errno::ENOTTY | Errno::ENOSYS | Errno::EBADF | Errno::EOPNOTSUPP | Errno::EINVAL
|
||||
)
|
||||
}
|
||||
|
||||
fn apply_chattr(fd: RawFd, chattr: libc::c_long, mask: libc::c_long) -> Result<(), Error> {
|
||||
|
@ -8,7 +8,7 @@ use std::path::Path;
|
||||
use anyhow::{bail, format_err, Error};
|
||||
use nix::sys::stat::Mode;
|
||||
|
||||
use pxar::{mode, Entry, EntryKind, Metadata, format::StatxTimestamp};
|
||||
use pxar::{format::StatxTimestamp, mode, Entry, EntryKind, Metadata};
|
||||
|
||||
/// Get the file permissions as `nix::Mode`
|
||||
pub fn perms_from_metadata(meta: &Metadata) -> Result<Mode, Error> {
|
||||
|
Reference in New Issue
Block a user