pxar: cleanup: move feature flags to src/pxar/flags.rs and omit CA_FORMAT prefix on all of them
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						
						Dietmar Maurer
					
				
			
			
				
	
			
			
			
						parent
						
							91451c4355
						
					
				
				
					commit
					47651f9530
				
			@ -799,7 +799,7 @@ fn restore(
 | 
			
		||||
 | 
			
		||||
        if let Some(target) = target {
 | 
			
		||||
 | 
			
		||||
            let feature_flags = pxar::CA_FORMAT_DEFAULT;
 | 
			
		||||
            let feature_flags = pxar::flags::DEFAULT;
 | 
			
		||||
            let mut decoder = pxar::SequentialDecoder::new(&mut reader, feature_flags, |path| {
 | 
			
		||||
                if verbose {
 | 
			
		||||
                    println!("{:?}", path);
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,7 @@ fn dump_archive(
 | 
			
		||||
    let archive = tools::required_string_param(¶m, "archive")?;
 | 
			
		||||
    let verbose = param["verbose"].as_bool().unwrap_or(false);
 | 
			
		||||
 | 
			
		||||
    let feature_flags = pxar::CA_FORMAT_DEFAULT;
 | 
			
		||||
    let feature_flags = pxar::flags::DEFAULT;
 | 
			
		||||
 | 
			
		||||
    if archive == "-" {
 | 
			
		||||
        let stdin = std::io::stdin();
 | 
			
		||||
@ -102,24 +102,24 @@ fn extract_archive(
 | 
			
		||||
    let empty = Vec::new();
 | 
			
		||||
    let arg_pattern = param["pattern"].as_array().unwrap_or(&empty);
 | 
			
		||||
 | 
			
		||||
    let mut feature_flags = pxar::CA_FORMAT_DEFAULT;
 | 
			
		||||
    let mut feature_flags = pxar::flags::DEFAULT;
 | 
			
		||||
    if no_xattrs {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_XATTRS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_XATTRS;
 | 
			
		||||
    }
 | 
			
		||||
    if no_fcaps {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_FCAPS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_FCAPS;
 | 
			
		||||
    }
 | 
			
		||||
    if no_acls {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_ACL;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_ACL;
 | 
			
		||||
    }
 | 
			
		||||
    if no_device_nodes {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_DEVICE_NODES;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_DEVICE_NODES;
 | 
			
		||||
    }
 | 
			
		||||
    if no_fifos {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_FIFOS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_FIFOS;
 | 
			
		||||
    }
 | 
			
		||||
    if no_sockets {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_SOCKETS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_SOCKETS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut pattern_list = Vec::new();
 | 
			
		||||
@ -188,24 +188,24 @@ fn create_archive(
 | 
			
		||||
        .open(archive)?;
 | 
			
		||||
 | 
			
		||||
    let mut writer = std::io::BufWriter::with_capacity(1024*1024, file);
 | 
			
		||||
    let mut feature_flags = pxar::CA_FORMAT_DEFAULT;
 | 
			
		||||
    let mut feature_flags = pxar::flags::DEFAULT;
 | 
			
		||||
    if no_xattrs {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_XATTRS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_XATTRS;
 | 
			
		||||
    }
 | 
			
		||||
    if no_fcaps {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_FCAPS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_FCAPS;
 | 
			
		||||
    }
 | 
			
		||||
    if no_acls {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_ACL;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_ACL;
 | 
			
		||||
    }
 | 
			
		||||
    if no_device_nodes {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_DEVICE_NODES;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_DEVICE_NODES;
 | 
			
		||||
    }
 | 
			
		||||
    if no_fifos {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_FIFOS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_FIFOS;
 | 
			
		||||
    }
 | 
			
		||||
    if no_sockets {
 | 
			
		||||
        feature_flags ^= pxar::CA_FORMAT_WITH_SOCKETS;
 | 
			
		||||
        feature_flags ^= pxar::flags::WITH_SOCKETS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pxar::Encoder::encode(source, &mut dir, &mut writer, devices, verbose, false, feature_flags)?;
 | 
			
		||||
 | 
			
		||||
@ -49,7 +49,7 @@ impl PxarBackupStream {
 | 
			
		||||
 | 
			
		||||
        let child = thread::spawn(move|| {
 | 
			
		||||
            let mut writer = unsafe { std::fs::File::from_raw_fd(tx) };
 | 
			
		||||
            if let Err(err) = pxar::Encoder::encode(path, &mut dir, &mut writer, device_set, verbose, skip_lost_and_found, pxar::CA_FORMAT_DEFAULT) {
 | 
			
		||||
            if let Err(err) = pxar::Encoder::encode(path, &mut dir, &mut writer, device_set, verbose, skip_lost_and_found, pxar::flags::DEFAULT) {
 | 
			
		||||
                let mut error = error2.lock().unwrap();
 | 
			
		||||
                *error = Some(err.to_string());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,7 @@ impl PxarDecodeWriter {
 | 
			
		||||
        
 | 
			
		||||
        let child = thread::spawn(move|| {
 | 
			
		||||
            let mut reader = unsafe { std::fs::File::from_raw_fd(rx) };
 | 
			
		||||
            let mut decoder = pxar::SequentialDecoder::new(&mut reader, pxar::CA_FORMAT_DEFAULT, |path| {
 | 
			
		||||
            let mut decoder = pxar::SequentialDecoder::new(&mut reader, pxar::flags::DEFAULT, |path| {
 | 
			
		||||
                if verbose {
 | 
			
		||||
                    println!("{:?}", path);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -50,6 +50,9 @@
 | 
			
		||||
mod binary_search_tree;
 | 
			
		||||
pub use binary_search_tree::*;
 | 
			
		||||
 | 
			
		||||
pub mod flags;
 | 
			
		||||
pub use flags::*;
 | 
			
		||||
 | 
			
		||||
mod format_definition;
 | 
			
		||||
pub use format_definition::*;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@ impl <'a, R: Read + Seek, F: Fn(&Path) -> Result<(), Error>> Decoder<'a, R, F> {
 | 
			
		||||
        let root_end = reader.seek(SeekFrom::End(0))?;
 | 
			
		||||
 | 
			
		||||
        Ok(Self {
 | 
			
		||||
            inner: SequentialDecoder::new(reader, CA_FORMAT_DEFAULT, callback),
 | 
			
		||||
            inner: SequentialDecoder::new(reader, super::flags::DEFAULT, callback),
 | 
			
		||||
            root_start: 0,
 | 
			
		||||
            root_end: root_end,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ use failure::*;
 | 
			
		||||
use endian_trait::Endian;
 | 
			
		||||
use std::collections::{HashSet, HashMap};
 | 
			
		||||
 | 
			
		||||
use super::flags;
 | 
			
		||||
use super::format_definition::*;
 | 
			
		||||
use super::binary_search_tree::*;
 | 
			
		||||
use super::helper::*;
 | 
			
		||||
@ -110,7 +111,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
            bail!("backup virtual file systems is disabled!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let fs_feature_flags = feature_flags_from_magic(magic);
 | 
			
		||||
        let fs_feature_flags = flags::feature_flags_from_magic(magic);
 | 
			
		||||
 | 
			
		||||
        let mut me = Self {
 | 
			
		||||
            base_path: path,
 | 
			
		||||
@ -217,7 +218,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
            bail!("read_attr_fd failed for {:?} - {}", self.full_path(), err);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let flags = ca_feature_flags_from_chattr(attr as u32);
 | 
			
		||||
        let flags = flags::feature_flags_from_chattr(attr as u32);
 | 
			
		||||
        entry.flags = entry.flags | flags;
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
@ -240,7 +241,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
            bail!("read_fat_attr_fd failed for {:?} - {}", self.full_path(), err);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let flags = ca_feature_flags_from_fat_attr(attr);
 | 
			
		||||
        let flags = flags::feature_flags_from_fat_attr(attr);
 | 
			
		||||
        entry.flags = entry.flags | flags;
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
@ -260,7 +261,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
        let mut xattrs = Vec::new();
 | 
			
		||||
        let mut fcaps = None;
 | 
			
		||||
 | 
			
		||||
        let flags = CA_FORMAT_WITH_XATTRS | CA_FORMAT_WITH_FCAPS;
 | 
			
		||||
        let flags = flags::WITH_XATTRS | flags::WITH_FCAPS;
 | 
			
		||||
        if !self.has_some_features(flags) {
 | 
			
		||||
            return Ok((xattrs, fcaps));
 | 
			
		||||
        }
 | 
			
		||||
@ -292,13 +293,13 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            if xattr::is_security_capability(&name) {
 | 
			
		||||
                if self.has_features(CA_FORMAT_WITH_FCAPS) {
 | 
			
		||||
                if self.has_features(flags::WITH_FCAPS) {
 | 
			
		||||
                    // fcaps are stored in own format within the archive
 | 
			
		||||
                    fcaps = Some(CaFormatFCaps {
 | 
			
		||||
                        data: value,
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            } else if self.has_features(CA_FORMAT_WITH_XATTRS) {
 | 
			
		||||
            } else if self.has_features(flags::WITH_XATTRS) {
 | 
			
		||||
                xattrs.push(CaFormatXAttr {
 | 
			
		||||
                    name: name.to_vec(),
 | 
			
		||||
                    value: value,
 | 
			
		||||
@ -318,7 +319,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
            default: None,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if !self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
        if !self.has_features(flags::WITH_ACL) {
 | 
			
		||||
            return Ok(ret);
 | 
			
		||||
        }
 | 
			
		||||
        if is_symlink(&stat) {
 | 
			
		||||
@ -427,7 +428,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
        if !(is_directory(&stat) || is_reg_file(&stat)) {
 | 
			
		||||
            return Ok(None);
 | 
			
		||||
        }
 | 
			
		||||
        if !self.has_features(CA_FORMAT_WITH_QUOTA_PROJID) {
 | 
			
		||||
        if !self.has_features(flags::WITH_QUOTA_PROJID) {
 | 
			
		||||
            return Ok(None);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -598,7 +599,7 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
 | 
			
		||||
        // for each node in the directory tree, the filesystem features are
 | 
			
		||||
        // checked based on the fs magic number.
 | 
			
		||||
        self.fs_feature_flags = feature_flags_from_magic(magic);
 | 
			
		||||
        self.fs_feature_flags = flags::feature_flags_from_magic(magic);
 | 
			
		||||
 | 
			
		||||
        let (xattrs, fcaps) = self.read_xattrs(rawfd, &dir_stat)?;
 | 
			
		||||
        let acl_access = self.read_acl(rawfd, &dir_stat, acl::ACL_TYPE_ACCESS)?;
 | 
			
		||||
@ -815,21 +816,21 @@ impl <'a, W: Write> Encoder<'a, W> {
 | 
			
		||||
                    Err(err) => bail!("readlink {:?} failed - {}", self.full_path(), err),
 | 
			
		||||
                }
 | 
			
		||||
            } else if is_block_dev(&stat) || is_char_dev(&stat) {
 | 
			
		||||
                if self.has_features(CA_FORMAT_WITH_DEVICE_NODES) {
 | 
			
		||||
                if self.has_features(flags::WITH_DEVICE_NODES) {
 | 
			
		||||
                    self.write_filename(&filename)?;
 | 
			
		||||
                    self.encode_device(&stat)?;
 | 
			
		||||
                } else {
 | 
			
		||||
                    eprintln!("skip device node: {:?}", self.full_path());
 | 
			
		||||
                }
 | 
			
		||||
            } else if is_fifo(&stat) {
 | 
			
		||||
                if self.has_features(CA_FORMAT_WITH_FIFOS) {
 | 
			
		||||
                if self.has_features(flags::WITH_FIFOS) {
 | 
			
		||||
                    self.write_filename(&filename)?;
 | 
			
		||||
                    self.encode_special(&stat)?;
 | 
			
		||||
                } else {
 | 
			
		||||
                    eprintln!("skip fifo: {:?}", self.full_path());
 | 
			
		||||
                }
 | 
			
		||||
            } else if is_socket(&stat) {
 | 
			
		||||
                if self.has_features(CA_FORMAT_WITH_SOCKETS) {
 | 
			
		||||
                if self.has_features(flags::WITH_SOCKETS) {
 | 
			
		||||
                    self.write_filename(&filename)?;
 | 
			
		||||
                    self.encode_special(&stat)?;
 | 
			
		||||
                } else {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										320
									
								
								src/pxar/flags.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										320
									
								
								src/pxar/flags.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,320 @@
 | 
			
		||||
//! Feature flags for *pxar* allow to control what is stored/restored in/from the
 | 
			
		||||
//! archive.
 | 
			
		||||
//! Flags for known supported features for a given filesystem can be derived
 | 
			
		||||
//! from the superblocks magic number.
 | 
			
		||||
 | 
			
		||||
/// FAT-style 2s time granularity
 | 
			
		||||
pub const WITH_2SEC_TIME: u64                   = 0x40;
 | 
			
		||||
/// Preserve read only flag of files
 | 
			
		||||
pub const WITH_READ_ONLY: u64                   = 0x80;
 | 
			
		||||
/// Preserve unix permissions
 | 
			
		||||
pub const WITH_PERMISSIONS: u64                 = 0x100;
 | 
			
		||||
/// Include symbolik links
 | 
			
		||||
pub const WITH_SYMLINKS: u64                    = 0x200;
 | 
			
		||||
/// Include device nodes
 | 
			
		||||
pub const WITH_DEVICE_NODES: u64                = 0x400;
 | 
			
		||||
/// Include FIFOs
 | 
			
		||||
pub const WITH_FIFOS: u64                       = 0x800;
 | 
			
		||||
/// Include Sockets
 | 
			
		||||
pub const WITH_SOCKETS: u64                     = 0x1000;
 | 
			
		||||
 | 
			
		||||
/// Preserve DOS file flag `HIDDEN`
 | 
			
		||||
pub const WITH_FLAG_HIDDEN: u64                 = 0x2000;
 | 
			
		||||
/// Preserve DOS file flag `SYSTEM`
 | 
			
		||||
pub const WITH_FLAG_SYSTEM: u64                 = 0x4000;
 | 
			
		||||
/// Preserve DOS file flag `ARCHIVE`
 | 
			
		||||
pub const WITH_FLAG_ARCHIVE: u64                = 0x8000;
 | 
			
		||||
 | 
			
		||||
// chattr() flags
 | 
			
		||||
/// Linux file attribute `APPEND`
 | 
			
		||||
pub const WITH_FLAG_APPEND: u64                 = 0x10000;
 | 
			
		||||
/// Linux file attribute `NOATIME`
 | 
			
		||||
pub const WITH_FLAG_NOATIME: u64                = 0x20000;
 | 
			
		||||
/// Linux file attribute `COMPR`
 | 
			
		||||
pub const WITH_FLAG_COMPR: u64                  = 0x40000;
 | 
			
		||||
/// Linux file attribute `NOCOW`
 | 
			
		||||
pub const WITH_FLAG_NOCOW: u64                  = 0x80000;
 | 
			
		||||
/// Linux file attribute `NODUMP`
 | 
			
		||||
pub const WITH_FLAG_NODUMP: u64                 = 0x100000;
 | 
			
		||||
/// Linux file attribute `DIRSYNC`
 | 
			
		||||
pub const WITH_FLAG_DIRSYNC: u64                = 0x200000;
 | 
			
		||||
/// Linux file attribute `IMMUTABLE`
 | 
			
		||||
pub const WITH_FLAG_IMMUTABLE: u64              = 0x400000;
 | 
			
		||||
/// Linux file attribute `SYNC`
 | 
			
		||||
pub const WITH_FLAG_SYNC: u64                   = 0x800000;
 | 
			
		||||
/// Linux file attribute `NOCOMP`
 | 
			
		||||
pub const WITH_FLAG_NOCOMP: u64                 = 0x1000000;
 | 
			
		||||
/// Linux file attribute `PROJINHERIT`
 | 
			
		||||
pub const WITH_FLAG_PROJINHERIT: u64            = 0x2000000;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Preserve BTRFS subvolume flag
 | 
			
		||||
pub const WITH_SUBVOLUME: u64                   = 0x4000000;
 | 
			
		||||
/// Preserve BTRFS read-only subvolume flag
 | 
			
		||||
pub const WITH_SUBVOLUME_RO: u64                = 0x8000000;
 | 
			
		||||
 | 
			
		||||
/// Preserve Extended Attribute metadata
 | 
			
		||||
pub const WITH_XATTRS: u64                      = 0x10000000;
 | 
			
		||||
/// Preserve Access Control List metadata
 | 
			
		||||
pub const WITH_ACL: u64                         = 0x20000000;
 | 
			
		||||
/// Preserve SELinux security context
 | 
			
		||||
pub const WITH_SELINUX: u64                     = 0x40000000;
 | 
			
		||||
/// Preserve "security.capability" xattr
 | 
			
		||||
pub const WITH_FCAPS: u64                       = 0x80000000;
 | 
			
		||||
 | 
			
		||||
/// Preserve XFS/ext4/ZFS project quota ID
 | 
			
		||||
pub const WITH_QUOTA_PROJID: u64                = 0x100000000;
 | 
			
		||||
 | 
			
		||||
/// Support ".pxarexclude" files
 | 
			
		||||
pub const EXCLUDE_FILE: u64                     = 0x1000000000000000;
 | 
			
		||||
/// the purpose of this flag is still unclear
 | 
			
		||||
pub const SHA512_256: u64                       = 0x2000000000000000;
 | 
			
		||||
/// Exclude submounts
 | 
			
		||||
pub const EXCLUDE_SUBMOUNTS: u64                = 0x4000000000000000;
 | 
			
		||||
/// Exclude entries with chattr flag NODUMP
 | 
			
		||||
pub const EXCLUDE_NODUMP: u64                   = 0x8000000000000000;
 | 
			
		||||
 | 
			
		||||
/// Definitions of typical feature flags for the *pxar* encoder/decoder.
 | 
			
		||||
/// By this expensive syscalls for unsupported features are avoided.
 | 
			
		||||
 | 
			
		||||
/// All chattr file attributes
 | 
			
		||||
pub const WITH_CHATTR: u64 =
 | 
			
		||||
    WITH_FLAG_APPEND|
 | 
			
		||||
    WITH_FLAG_NOATIME|
 | 
			
		||||
    WITH_FLAG_COMPR|
 | 
			
		||||
    WITH_FLAG_NOCOW|
 | 
			
		||||
    WITH_FLAG_NODUMP|
 | 
			
		||||
    WITH_FLAG_DIRSYNC|
 | 
			
		||||
    WITH_FLAG_IMMUTABLE|
 | 
			
		||||
    WITH_FLAG_SYNC|
 | 
			
		||||
    WITH_FLAG_NOCOMP|
 | 
			
		||||
    WITH_FLAG_PROJINHERIT;
 | 
			
		||||
 | 
			
		||||
/// All FAT file attributes
 | 
			
		||||
pub const WITH_FAT_ATTRS: u64 =
 | 
			
		||||
    WITH_FLAG_HIDDEN|
 | 
			
		||||
    WITH_FLAG_SYSTEM|
 | 
			
		||||
    WITH_FLAG_ARCHIVE;
 | 
			
		||||
 | 
			
		||||
/// All bits that may also be exposed via fuse
 | 
			
		||||
pub const WITH_FUSE: u64 =
 | 
			
		||||
    WITH_2SEC_TIME|
 | 
			
		||||
    WITH_READ_ONLY|
 | 
			
		||||
    WITH_PERMISSIONS|
 | 
			
		||||
    WITH_SYMLINKS|
 | 
			
		||||
    WITH_DEVICE_NODES|
 | 
			
		||||
    WITH_FIFOS|
 | 
			
		||||
    WITH_SOCKETS|
 | 
			
		||||
    WITH_FAT_ATTRS|
 | 
			
		||||
    WITH_CHATTR|
 | 
			
		||||
    WITH_XATTRS;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Default feature flags for encoder/decoder
 | 
			
		||||
pub const DEFAULT: u64 =
 | 
			
		||||
    WITH_SYMLINKS|
 | 
			
		||||
    WITH_DEVICE_NODES|
 | 
			
		||||
    WITH_FIFOS|
 | 
			
		||||
    WITH_SOCKETS|
 | 
			
		||||
    WITH_FLAG_HIDDEN|
 | 
			
		||||
    WITH_FLAG_SYSTEM|
 | 
			
		||||
    WITH_FLAG_ARCHIVE|
 | 
			
		||||
    WITH_FLAG_APPEND|
 | 
			
		||||
    WITH_FLAG_NOATIME|
 | 
			
		||||
    WITH_FLAG_COMPR|
 | 
			
		||||
    WITH_FLAG_NOCOW|
 | 
			
		||||
    //WITH_FLAG_NODUMP|
 | 
			
		||||
    WITH_FLAG_DIRSYNC|
 | 
			
		||||
    WITH_FLAG_IMMUTABLE|
 | 
			
		||||
    WITH_FLAG_SYNC|
 | 
			
		||||
    WITH_FLAG_NOCOMP|
 | 
			
		||||
    WITH_FLAG_PROJINHERIT|
 | 
			
		||||
    WITH_SUBVOLUME|
 | 
			
		||||
    WITH_SUBVOLUME_RO|
 | 
			
		||||
    WITH_XATTRS|
 | 
			
		||||
    WITH_ACL|
 | 
			
		||||
    WITH_SELINUX|
 | 
			
		||||
    WITH_FCAPS|
 | 
			
		||||
    WITH_QUOTA_PROJID|
 | 
			
		||||
    EXCLUDE_NODUMP|
 | 
			
		||||
    EXCLUDE_FILE|
 | 
			
		||||
    SHA512_256;
 | 
			
		||||
 | 
			
		||||
// form /usr/include/linux/fs.h
 | 
			
		||||
const FS_APPEND_FL: u32 =      0x00000020;
 | 
			
		||||
const FS_NOATIME_FL: u32 =     0x00000080;
 | 
			
		||||
const FS_COMPR_FL: u32 =       0x00000004;
 | 
			
		||||
const FS_NOCOW_FL: u32 =       0x00800000;
 | 
			
		||||
const FS_NODUMP_FL: u32 =      0x00000040;
 | 
			
		||||
const FS_DIRSYNC_FL: u32 =     0x00010000;
 | 
			
		||||
const FS_IMMUTABLE_FL: u32 =   0x00000010;
 | 
			
		||||
const FS_SYNC_FL: u32 =        0x00000008;
 | 
			
		||||
const FS_NOCOMP_FL: u32 =      0x00000400;
 | 
			
		||||
const FS_PROJINHERIT_FL: u32 = 0x20000000;
 | 
			
		||||
 | 
			
		||||
static CHATTR_MAP: [(u64, u32); 10] = [
 | 
			
		||||
    ( WITH_FLAG_APPEND,      FS_APPEND_FL      ),
 | 
			
		||||
    ( WITH_FLAG_NOATIME,     FS_NOATIME_FL     ),
 | 
			
		||||
    ( WITH_FLAG_COMPR,       FS_COMPR_FL       ),
 | 
			
		||||
    ( WITH_FLAG_NOCOW,       FS_NOCOW_FL       ),
 | 
			
		||||
    ( WITH_FLAG_NODUMP,      FS_NODUMP_FL      ),
 | 
			
		||||
    ( WITH_FLAG_DIRSYNC,     FS_DIRSYNC_FL     ),
 | 
			
		||||
    ( WITH_FLAG_IMMUTABLE,   FS_IMMUTABLE_FL   ),
 | 
			
		||||
    ( WITH_FLAG_SYNC,        FS_SYNC_FL        ),
 | 
			
		||||
    ( WITH_FLAG_NOCOMP,      FS_NOCOMP_FL      ),
 | 
			
		||||
    ( WITH_FLAG_PROJINHERIT, FS_PROJINHERIT_FL ),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
pub fn feature_flags_from_chattr(attr: u32) -> u64 {
 | 
			
		||||
 | 
			
		||||
    let mut flags = 0u64;
 | 
			
		||||
 | 
			
		||||
    for (fe_flag, fs_flag) in &CHATTR_MAP {
 | 
			
		||||
        if (attr & fs_flag) != 0 { flags = flags | fe_flag; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// from /usr/include/linux/msdos_fs.h
 | 
			
		||||
const ATTR_HIDDEN: u32 =      2;
 | 
			
		||||
const ATTR_SYS: u32 =         4;
 | 
			
		||||
const ATTR_ARCH: u32 =       32;
 | 
			
		||||
 | 
			
		||||
static FAT_ATTR_MAP: [(u64, u32); 3] = [
 | 
			
		||||
    ( WITH_FLAG_HIDDEN,  ATTR_HIDDEN ),
 | 
			
		||||
    ( WITH_FLAG_SYSTEM,  ATTR_SYS    ),
 | 
			
		||||
    ( WITH_FLAG_ARCHIVE, ATTR_ARCH   ),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
pub fn feature_flags_from_fat_attr(attr: u32) -> u64 {
 | 
			
		||||
 | 
			
		||||
    let mut flags = 0u64;
 | 
			
		||||
 | 
			
		||||
    for (fe_flag, fs_flag) in &FAT_ATTR_MAP {
 | 
			
		||||
        if (attr & fs_flag) != 0 { flags = flags | fe_flag; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Return the supported *pxar* feature flags based on the magic number of the filesystem.
 | 
			
		||||
pub fn feature_flags_from_magic(magic: i64) -> u64 {
 | 
			
		||||
    use crate::tools::fs::magic::*;
 | 
			
		||||
    match magic {
 | 
			
		||||
        MSDOS_SUPER_MAGIC => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_FAT_ATTRS
 | 
			
		||||
        },
 | 
			
		||||
        EXT4_SUPER_MAGIC => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_PERMISSIONS|
 | 
			
		||||
            WITH_SYMLINKS|
 | 
			
		||||
            WITH_DEVICE_NODES|
 | 
			
		||||
            WITH_FIFOS|
 | 
			
		||||
            WITH_SOCKETS|
 | 
			
		||||
            WITH_FLAG_APPEND|
 | 
			
		||||
            WITH_FLAG_NOATIME|
 | 
			
		||||
            WITH_FLAG_NODUMP|
 | 
			
		||||
            WITH_FLAG_DIRSYNC|
 | 
			
		||||
            WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            WITH_FLAG_SYNC|
 | 
			
		||||
            WITH_XATTRS|
 | 
			
		||||
            WITH_ACL|
 | 
			
		||||
            WITH_SELINUX|
 | 
			
		||||
            WITH_FCAPS|
 | 
			
		||||
            WITH_QUOTA_PROJID
 | 
			
		||||
        },
 | 
			
		||||
        XFS_SUPER_MAGIC => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_PERMISSIONS|
 | 
			
		||||
            WITH_SYMLINKS|
 | 
			
		||||
            WITH_DEVICE_NODES|
 | 
			
		||||
            WITH_FIFOS|
 | 
			
		||||
            WITH_SOCKETS|
 | 
			
		||||
            WITH_FLAG_APPEND|
 | 
			
		||||
            WITH_FLAG_NOATIME|
 | 
			
		||||
            WITH_FLAG_NODUMP|
 | 
			
		||||
            WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            WITH_FLAG_SYNC|
 | 
			
		||||
            WITH_XATTRS|
 | 
			
		||||
            WITH_ACL|
 | 
			
		||||
            WITH_SELINUX|
 | 
			
		||||
            WITH_FCAPS|
 | 
			
		||||
            WITH_QUOTA_PROJID
 | 
			
		||||
        },
 | 
			
		||||
        ZFS_SUPER_MAGIC => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_PERMISSIONS|
 | 
			
		||||
            WITH_SYMLINKS|
 | 
			
		||||
            WITH_DEVICE_NODES|
 | 
			
		||||
            WITH_FIFOS|
 | 
			
		||||
            WITH_SOCKETS|
 | 
			
		||||
            WITH_FLAG_APPEND|
 | 
			
		||||
            WITH_FLAG_NOATIME|
 | 
			
		||||
            WITH_FLAG_NODUMP|
 | 
			
		||||
            WITH_FLAG_DIRSYNC|
 | 
			
		||||
            WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            WITH_FLAG_SYNC|
 | 
			
		||||
            WITH_XATTRS|
 | 
			
		||||
            WITH_ACL|
 | 
			
		||||
            WITH_SELINUX|
 | 
			
		||||
            WITH_FCAPS|
 | 
			
		||||
            WITH_QUOTA_PROJID
 | 
			
		||||
        },
 | 
			
		||||
        BTRFS_SUPER_MAGIC => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_PERMISSIONS|
 | 
			
		||||
            WITH_SYMLINKS|
 | 
			
		||||
            WITH_DEVICE_NODES|
 | 
			
		||||
            WITH_FIFOS|
 | 
			
		||||
            WITH_SOCKETS|
 | 
			
		||||
            WITH_FLAG_APPEND|
 | 
			
		||||
            WITH_FLAG_NOATIME|
 | 
			
		||||
            WITH_FLAG_COMPR|
 | 
			
		||||
            WITH_FLAG_NOCOW|
 | 
			
		||||
            WITH_FLAG_NODUMP|
 | 
			
		||||
            WITH_FLAG_DIRSYNC|
 | 
			
		||||
            WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            WITH_FLAG_SYNC|
 | 
			
		||||
            WITH_FLAG_NOCOMP|
 | 
			
		||||
            WITH_XATTRS|
 | 
			
		||||
            WITH_ACL|
 | 
			
		||||
            WITH_SELINUX|
 | 
			
		||||
            WITH_SUBVOLUME|
 | 
			
		||||
            WITH_SUBVOLUME_RO|
 | 
			
		||||
            WITH_FCAPS
 | 
			
		||||
        },
 | 
			
		||||
        TMPFS_MAGIC => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_PERMISSIONS|
 | 
			
		||||
            WITH_SYMLINKS|
 | 
			
		||||
            WITH_DEVICE_NODES|
 | 
			
		||||
            WITH_FIFOS|
 | 
			
		||||
            WITH_SOCKETS|
 | 
			
		||||
            WITH_ACL|
 | 
			
		||||
            WITH_SELINUX
 | 
			
		||||
        },
 | 
			
		||||
        // FUSE mounts are special as the supported feature set
 | 
			
		||||
        // is not clear a priori.
 | 
			
		||||
        FUSE_SUPER_MAGIC => {
 | 
			
		||||
            WITH_FUSE
 | 
			
		||||
        },
 | 
			
		||||
        _ => {
 | 
			
		||||
            WITH_2SEC_TIME|
 | 
			
		||||
            WITH_READ_ONLY|
 | 
			
		||||
            WITH_PERMISSIONS|
 | 
			
		||||
            WITH_SYMLINKS|
 | 
			
		||||
            WITH_DEVICE_NODES|
 | 
			
		||||
            WITH_FIFOS|
 | 
			
		||||
            WITH_SOCKETS
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -35,80 +35,6 @@ pub const CA_FORMAT_GOODBYE: u64 = 0xdfd35c5e8327c403;
 | 
			
		||||
pub const CA_FORMAT_GOODBYE_TAIL_MARKER: u64 = 0x57446fa533702943;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Feature flags
 | 
			
		||||
 | 
			
		||||
pub const CA_FORMAT_WITH_SEC_TIME: u64         = 0x8;
 | 
			
		||||
pub const CA_FORMAT_WITH_USEC_TIME: u64        = 0x10;
 | 
			
		||||
pub const CA_FORMAT_WITH_NSEC_TIME: u64        = 0x20;
 | 
			
		||||
/// FAT-style 2s time granularity
 | 
			
		||||
pub const CA_FORMAT_WITH_2SEC_TIME: u64        = 0x40;
 | 
			
		||||
pub const CA_FORMAT_WITH_READ_ONLY: u64        = 0x80;
 | 
			
		||||
pub const CA_FORMAT_WITH_PERMISSIONS: u64      = 0x100;
 | 
			
		||||
/// include symbolik links
 | 
			
		||||
pub const CA_FORMAT_WITH_SYMLINKS: u64         = 0x200;
 | 
			
		||||
/// include device nodes
 | 
			
		||||
pub const CA_FORMAT_WITH_DEVICE_NODES: u64     = 0x400;
 | 
			
		||||
/// include FIFOs
 | 
			
		||||
pub const CA_FORMAT_WITH_FIFOS: u64            = 0x800;
 | 
			
		||||
/// include Sockets
 | 
			
		||||
pub const CA_FORMAT_WITH_SOCKETS: u64          = 0x1000;
 | 
			
		||||
 | 
			
		||||
/// DOS file flag `HIDDEN`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_HIDDEN: u64      = 0x2000;
 | 
			
		||||
/// DOS file flag `SYSTEM`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_SYSTEM: u64      = 0x4000;
 | 
			
		||||
/// DOS file flag `ARCHIVE`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_ARCHIVE: u64     = 0x8000;
 | 
			
		||||
 | 
			
		||||
// chattr() flags
 | 
			
		||||
/// Linux file attribute `APPEND`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_APPEND: u64      = 0x10000;
 | 
			
		||||
/// Linux file attribute `NOATIME`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_NOATIME: u64     = 0x20000;
 | 
			
		||||
/// Linux file attribute `COMPR`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_COMPR: u64       = 0x40000;
 | 
			
		||||
/// Linux file attribute `NOCOW`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_NOCOW: u64       = 0x80000;
 | 
			
		||||
/// Linux file attribute `NODUMP`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_NODUMP: u64      = 0x100000;
 | 
			
		||||
/// Linux file attribute `DIRSYNC`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_DIRSYNC: u64     = 0x200000;
 | 
			
		||||
/// Linux file attribute `IMMUTABLE`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_IMMUTABLE: u64   = 0x400000;
 | 
			
		||||
/// Linux file attribute `SYNC`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_SYNC: u64        = 0x800000;
 | 
			
		||||
/// Linux file attribute `NOCOMP`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_NOCOMP: u64      = 0x1000000;
 | 
			
		||||
/// Linux file attribute `PROJINHERIT`
 | 
			
		||||
pub const CA_FORMAT_WITH_FLAG_PROJINHERIT: u64 = 0x2000000;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Include BTRFS subvolume flag
 | 
			
		||||
pub const CA_FORMAT_WITH_SUBVOLUME: u64         = 0x4000000;
 | 
			
		||||
// Include BTRFS read-only subvolume flag
 | 
			
		||||
pub const CA_FORMAT_WITH_SUBVOLUME_RO: u64      = 0x8000000;
 | 
			
		||||
 | 
			
		||||
/// Include Extended Attribute metadata
 | 
			
		||||
pub const CA_FORMAT_WITH_XATTRS: u64            = 0x10000000;
 | 
			
		||||
/// Include Access Control List metadata
 | 
			
		||||
pub const CA_FORMAT_WITH_ACL: u64               = 0x20000000;
 | 
			
		||||
/// Include SELinux security context
 | 
			
		||||
pub const CA_FORMAT_WITH_SELINUX: u64           = 0x40000000;
 | 
			
		||||
/// Include "security.capability" xattr
 | 
			
		||||
pub const CA_FORMAT_WITH_FCAPS: u64             = 0x80000000;
 | 
			
		||||
 | 
			
		||||
/// XFS/ext4 project quota ID
 | 
			
		||||
pub const CA_FORMAT_WITH_QUOTA_PROJID: u64      = 0x100000000;
 | 
			
		||||
 | 
			
		||||
/// Support ".caexclude" files
 | 
			
		||||
pub const CA_FORMAT_EXCLUDE_FILE: u64           = 0x1000000000000000;
 | 
			
		||||
/// the purpose of this flag is still unclear
 | 
			
		||||
pub const CA_FORMAT_SHA512_256: u64             = 0x2000000000000000;
 | 
			
		||||
/// Exclude submounts
 | 
			
		||||
pub const CA_FORMAT_EXCLUDE_SUBMOUNTS: u64      = 0x4000000000000000;
 | 
			
		||||
/// Exclude entries with chattr flag NODUMP
 | 
			
		||||
pub const CA_FORMAT_EXCLUDE_NODUMP: u64         = 0x8000000000000000;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Endian)]
 | 
			
		||||
#[repr(C)]
 | 
			
		||||
@ -329,270 +255,3 @@ pub fn check_ca_header<T>(head: &CaFormatHeader, htype: u64) -> Result<(), Error
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// form /usr/include/linux/fs.h
 | 
			
		||||
const FS_APPEND_FL: u32 =      0x00000020;
 | 
			
		||||
const FS_NOATIME_FL: u32 =     0x00000080;
 | 
			
		||||
const FS_COMPR_FL: u32 =       0x00000004;
 | 
			
		||||
const FS_NOCOW_FL: u32 =       0x00800000;
 | 
			
		||||
const FS_NODUMP_FL: u32 =      0x00000040;
 | 
			
		||||
const FS_DIRSYNC_FL: u32 =     0x00010000;
 | 
			
		||||
const FS_IMMUTABLE_FL: u32 =   0x00000010;
 | 
			
		||||
const FS_SYNC_FL: u32 =        0x00000008;
 | 
			
		||||
const FS_NOCOMP_FL: u32 =      0x00000400;
 | 
			
		||||
const FS_PROJINHERIT_FL: u32 = 0x20000000;
 | 
			
		||||
 | 
			
		||||
static CHATTR_MAP: [(u64, u32); 10] = [
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_APPEND,      FS_APPEND_FL      ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_NOATIME,     FS_NOATIME_FL     ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_COMPR,       FS_COMPR_FL       ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_NOCOW,       FS_NOCOW_FL       ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_NODUMP,      FS_NODUMP_FL      ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_DIRSYNC,     FS_DIRSYNC_FL     ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_IMMUTABLE,   FS_IMMUTABLE_FL   ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_SYNC,        FS_SYNC_FL        ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_NOCOMP,      FS_NOCOMP_FL      ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_PROJINHERIT, FS_PROJINHERIT_FL ),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
pub fn ca_feature_flags_from_chattr(attr: u32) -> u64 {
 | 
			
		||||
 | 
			
		||||
    let mut flags = 0u64;
 | 
			
		||||
 | 
			
		||||
    for (ca_flag, fs_flag) in &CHATTR_MAP {
 | 
			
		||||
        if (attr & fs_flag) != 0 { flags = flags | ca_flag; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// from /usr/include/linux/msdos_fs.h
 | 
			
		||||
const ATTR_HIDDEN: u32 =      2;
 | 
			
		||||
const ATTR_SYS: u32 =         4;
 | 
			
		||||
const ATTR_ARCH: u32 =       32;
 | 
			
		||||
 | 
			
		||||
static FAT_ATTR_MAP: [(u64, u32); 3] = [
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_HIDDEN, ATTR_HIDDEN ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_SYSTEM, ATTR_SYS ),
 | 
			
		||||
    ( CA_FORMAT_WITH_FLAG_ARCHIVE,  ATTR_ARCH ),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
pub fn ca_feature_flags_from_fat_attr(attr: u32) -> u64 {
 | 
			
		||||
 | 
			
		||||
    let mut flags = 0u64;
 | 
			
		||||
 | 
			
		||||
    for (ca_flag, fs_flag) in &FAT_ATTR_MAP {
 | 
			
		||||
        if (attr & fs_flag) != 0 { flags = flags | ca_flag; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Definitions of typical feature flags for the *pxar* encoder/decoder.
 | 
			
		||||
/// By this expensive syscalls for unsupported features are avoided.
 | 
			
		||||
 | 
			
		||||
/// All chattr file attributes
 | 
			
		||||
pub const CA_FORMAT_WITH_CHATTR: u64 =
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_APPEND|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NOATIME|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_COMPR|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NOCOW|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NODUMP|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_DIRSYNC|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_IMMUTABLE|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_SYNC|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NOCOMP|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_PROJINHERIT;
 | 
			
		||||
 | 
			
		||||
/// All FAT file attributes
 | 
			
		||||
pub const CA_FORMAT_WITH_FAT_ATTRS: u64 =
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_HIDDEN|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_SYSTEM|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_ARCHIVE;
 | 
			
		||||
 | 
			
		||||
/// All bits that may also be exposed via fuse
 | 
			
		||||
pub const CA_FORMAT_WITH_FUSE: u64 =
 | 
			
		||||
    CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
    CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
    CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
    CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
    CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
    CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
    CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
    CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
    CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
    CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
    CA_FORMAT_WITH_FAT_ATTRS|
 | 
			
		||||
    CA_FORMAT_WITH_CHATTR|
 | 
			
		||||
    CA_FORMAT_WITH_XATTRS;
 | 
			
		||||
 | 
			
		||||
/// Default feature flags for encoder/decoder
 | 
			
		||||
pub const CA_FORMAT_DEFAULT: u64 =
 | 
			
		||||
    CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
    CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
    CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
    CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
    CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_HIDDEN|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_SYSTEM|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_ARCHIVE|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_APPEND|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NOATIME|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_COMPR|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NOCOW|
 | 
			
		||||
    //CA_FORMAT_WITH_FLAG_NODUMP|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_DIRSYNC|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_IMMUTABLE|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_SYNC|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_NOCOMP|
 | 
			
		||||
    CA_FORMAT_WITH_FLAG_PROJINHERIT|
 | 
			
		||||
    CA_FORMAT_WITH_SUBVOLUME|
 | 
			
		||||
    CA_FORMAT_WITH_SUBVOLUME_RO|
 | 
			
		||||
    CA_FORMAT_WITH_XATTRS|
 | 
			
		||||
    CA_FORMAT_WITH_ACL|
 | 
			
		||||
    CA_FORMAT_WITH_SELINUX|
 | 
			
		||||
    CA_FORMAT_WITH_FCAPS|
 | 
			
		||||
    CA_FORMAT_WITH_QUOTA_PROJID|
 | 
			
		||||
    CA_FORMAT_EXCLUDE_NODUMP|
 | 
			
		||||
    CA_FORMAT_EXCLUDE_FILE|
 | 
			
		||||
    CA_FORMAT_SHA512_256;
 | 
			
		||||
 | 
			
		||||
/// Return the supported *pxar* feature flags based on the magic number of the filesystem.
 | 
			
		||||
pub fn feature_flags_from_magic(magic: i64) -> u64 {
 | 
			
		||||
    use crate::tools::fs::magic::*;
 | 
			
		||||
 | 
			
		||||
    match magic {
 | 
			
		||||
        MSDOS_SUPER_MAGIC => {
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_FAT_ATTRS
 | 
			
		||||
        },
 | 
			
		||||
        EXT4_SUPER_MAGIC => {
 | 
			
		||||
            CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
            CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
            CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
            CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
            CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_APPEND|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NOATIME|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NODUMP|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_DIRSYNC|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_SYNC|
 | 
			
		||||
            CA_FORMAT_WITH_XATTRS|
 | 
			
		||||
            CA_FORMAT_WITH_ACL|
 | 
			
		||||
            CA_FORMAT_WITH_SELINUX|
 | 
			
		||||
            CA_FORMAT_WITH_FCAPS|
 | 
			
		||||
            CA_FORMAT_WITH_QUOTA_PROJID
 | 
			
		||||
        },
 | 
			
		||||
        XFS_SUPER_MAGIC => {
 | 
			
		||||
            CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
            CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
            CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
            CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
            CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_APPEND|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NOATIME|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NODUMP|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_SYNC|
 | 
			
		||||
            CA_FORMAT_WITH_XATTRS|
 | 
			
		||||
            CA_FORMAT_WITH_ACL|
 | 
			
		||||
            CA_FORMAT_WITH_SELINUX|
 | 
			
		||||
            CA_FORMAT_WITH_FCAPS|
 | 
			
		||||
            CA_FORMAT_WITH_QUOTA_PROJID
 | 
			
		||||
        },
 | 
			
		||||
        ZFS_SUPER_MAGIC => {
 | 
			
		||||
            CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
            CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
            CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
            CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
            CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_APPEND|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NOATIME|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NODUMP|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_DIRSYNC|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_SYNC|
 | 
			
		||||
            CA_FORMAT_WITH_XATTRS|
 | 
			
		||||
            CA_FORMAT_WITH_ACL|
 | 
			
		||||
            CA_FORMAT_WITH_SELINUX|
 | 
			
		||||
            CA_FORMAT_WITH_FCAPS|
 | 
			
		||||
            CA_FORMAT_WITH_QUOTA_PROJID
 | 
			
		||||
        },
 | 
			
		||||
        BTRFS_SUPER_MAGIC => {
 | 
			
		||||
            CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
            CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
            CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
            CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
            CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_APPEND|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NOATIME|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_COMPR|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NOCOW|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NODUMP|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_DIRSYNC|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_IMMUTABLE|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_SYNC|
 | 
			
		||||
            CA_FORMAT_WITH_FLAG_NOCOMP|
 | 
			
		||||
            CA_FORMAT_WITH_XATTRS|
 | 
			
		||||
            CA_FORMAT_WITH_ACL|
 | 
			
		||||
            CA_FORMAT_WITH_SELINUX|
 | 
			
		||||
            CA_FORMAT_WITH_SUBVOLUME|
 | 
			
		||||
            CA_FORMAT_WITH_SUBVOLUME_RO|
 | 
			
		||||
            CA_FORMAT_WITH_FCAPS
 | 
			
		||||
        },
 | 
			
		||||
        TMPFS_MAGIC => {
 | 
			
		||||
            CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
            CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
            CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
            CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
            CA_FORMAT_WITH_SOCKETS|
 | 
			
		||||
            CA_FORMAT_WITH_ACL|
 | 
			
		||||
            CA_FORMAT_WITH_SELINUX
 | 
			
		||||
        },
 | 
			
		||||
        FUSE_SUPER_MAGIC => {
 | 
			
		||||
            // FUSE mounts are special as the supported feature set is not clear
 | 
			
		||||
            // a priori.
 | 
			
		||||
            CA_FORMAT_WITH_FUSE
 | 
			
		||||
        },
 | 
			
		||||
        _ => {
 | 
			
		||||
            CA_FORMAT_WITH_SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_USEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_NSEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_2SEC_TIME|
 | 
			
		||||
            CA_FORMAT_WITH_READ_ONLY|
 | 
			
		||||
            CA_FORMAT_WITH_PERMISSIONS|
 | 
			
		||||
            CA_FORMAT_WITH_SYMLINKS|
 | 
			
		||||
            CA_FORMAT_WITH_DEVICE_NODES|
 | 
			
		||||
            CA_FORMAT_WITH_FIFOS|
 | 
			
		||||
            CA_FORMAT_WITH_SOCKETS
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
use failure::*;
 | 
			
		||||
use endian_trait::Endian;
 | 
			
		||||
 | 
			
		||||
use super::flags;
 | 
			
		||||
use super::format_definition::*;
 | 
			
		||||
use super::exclude_pattern::*;
 | 
			
		||||
use super::dir_buffer::*;
 | 
			
		||||
@ -186,63 +187,63 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
 | 
			
		||||
        loop {
 | 
			
		||||
            match head.htype {
 | 
			
		||||
                CA_FORMAT_XATTR => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_XATTRS) {
 | 
			
		||||
                    if self.has_features(flags::WITH_XATTRS) {
 | 
			
		||||
                        attr.xattrs.push(self.read_xattr(size)?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_FCAPS => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_FCAPS) {
 | 
			
		||||
                    if self.has_features(flags::WITH_FCAPS) {
 | 
			
		||||
                        attr.fcaps = Some(self.read_fcaps(size)?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_ACL_USER => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                    if self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                        attr.acl_user.push(self.read_item::<CaFormatACLUser>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_ACL_GROUP => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                    if self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                        attr.acl_group.push(self.read_item::<CaFormatACLGroup>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_ACL_GROUP_OBJ => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                    if self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                        attr.acl_group_obj = Some(self.read_item::<CaFormatACLGroupObj>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_ACL_DEFAULT => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                    if self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                        attr.acl_default = Some(self.read_item::<CaFormatACLDefault>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_ACL_DEFAULT_USER => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                    if self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                        attr.acl_default_user.push(self.read_item::<CaFormatACLUser>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_ACL_DEFAULT_GROUP => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                    if self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                        attr.acl_default_group.push(self.read_item::<CaFormatACLGroup>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                CA_FORMAT_QUOTA_PROJID => {
 | 
			
		||||
                    if self.has_features(CA_FORMAT_WITH_QUOTA_PROJID) {
 | 
			
		||||
                    if self.has_features(flags::WITH_QUOTA_PROJID) {
 | 
			
		||||
                        attr.quota_projid = Some(self.read_item::<CaFormatQuotaProjID>()?);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        self.skip_bytes(size)?;
 | 
			
		||||
@ -508,7 +509,7 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
 | 
			
		||||
        entry: &CaFormatEntry,
 | 
			
		||||
        filename: &OsStr
 | 
			
		||||
    ) -> Result<(), Error> {
 | 
			
		||||
        if !self.has_features(CA_FORMAT_WITH_SOCKETS) {
 | 
			
		||||
        if !self.has_features(flags::WITH_SOCKETS) {
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
        if let Some(fd) = parent_fd {
 | 
			
		||||
@ -527,7 +528,7 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
 | 
			
		||||
        entry: &CaFormatEntry,
 | 
			
		||||
        filename: &OsStr
 | 
			
		||||
    ) -> Result<(), Error> {
 | 
			
		||||
        if !self.has_features(CA_FORMAT_WITH_FIFOS) {
 | 
			
		||||
        if !self.has_features(flags::WITH_FIFOS) {
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
        if let Some(fd) = parent_fd {
 | 
			
		||||
@ -551,7 +552,7 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
 | 
			
		||||
            bail!("got unknown header type inside device entry {:016x}", head.htype);
 | 
			
		||||
        }
 | 
			
		||||
        let device: CaFormatDevice = self.read_item()?;
 | 
			
		||||
        if !self.has_features(CA_FORMAT_WITH_DEVICE_NODES) {
 | 
			
		||||
        if !self.has_features(flags::WITH_DEVICE_NODES) {
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
        if let Some(fd) = parent_fd {
 | 
			
		||||
@ -932,55 +933,55 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
 | 
			
		||||
        match header.htype {
 | 
			
		||||
            CA_FORMAT_XATTR => {
 | 
			
		||||
                let xattr = self.read_xattr((header.size - HEADER_SIZE) as usize)?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_XATTRS) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_XATTRS) {
 | 
			
		||||
                    println!("XAttr: {:?}", xattr);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_FCAPS => {
 | 
			
		||||
                let fcaps = self.read_fcaps((header.size - HEADER_SIZE) as usize)?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_FCAPS) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_FCAPS) {
 | 
			
		||||
                    println!("FCaps: {:?}", fcaps);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_ACL_USER => {
 | 
			
		||||
                let user = self.read_item::<CaFormatACLUser>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                    println!("ACLUser: {:?}", user);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_ACL_GROUP => {
 | 
			
		||||
                let group = self.read_item::<CaFormatACLGroup>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                    println!("ACLGroup: {:?}", group);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_ACL_GROUP_OBJ => {
 | 
			
		||||
                let group_obj = self.read_item::<CaFormatACLGroupObj>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                    println!("ACLGroupObj: {:?}", group_obj);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_ACL_DEFAULT => {
 | 
			
		||||
                let default = self.read_item::<CaFormatACLDefault>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                    println!("ACLDefault: {:?}", default);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_ACL_DEFAULT_USER => {
 | 
			
		||||
                let default_user = self.read_item::<CaFormatACLUser>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                    println!("ACLDefaultUser: {:?}", default_user);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_ACL_DEFAULT_GROUP => {
 | 
			
		||||
                let default_group = self.read_item::<CaFormatACLGroup>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_ACL) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_ACL) {
 | 
			
		||||
                    println!("ACLDefaultGroup: {:?}", default_group);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            CA_FORMAT_QUOTA_PROJID => {
 | 
			
		||||
                let quota_projid = self.read_item::<CaFormatQuotaProjID>()?;
 | 
			
		||||
                if verbose && self.has_features(CA_FORMAT_WITH_QUOTA_PROJID) {
 | 
			
		||||
                if verbose && self.has_features(flags::WITH_QUOTA_PROJID) {
 | 
			
		||||
                    println!("Quota project id: {:?}", quota_projid);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@ fn run_test(dir_name: &str) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
    let path = std::path::PathBuf::from(dir_name);
 | 
			
		||||
 | 
			
		||||
    Encoder::encode(path, &mut dir, &mut writer, None, false, false, CA_FORMAT_DEFAULT)?;
 | 
			
		||||
    Encoder::encode(path, &mut dir, &mut writer, None, false, false, flags::DEFAULT)?;
 | 
			
		||||
 | 
			
		||||
    Command::new("cmp")
 | 
			
		||||
        .arg("--verbose")
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user