1 //! Feature flags for *pxar* allow to control what is stored/restored in/from the
3 //! Flags for known supported features for a given filesystem can be derived
4 //! from the superblocks magic number.
6 /// FAT-style 2s time granularity
7 pub const WITH_2SEC_TIME
: u64 = 0x40;
8 /// Preserve read only flag of files
9 pub const WITH_READ_ONLY
: u64 = 0x80;
10 /// Preserve unix permissions
11 pub const WITH_PERMISSIONS
: u64 = 0x100;
12 /// Include symbolik links
13 pub const WITH_SYMLINKS
: u64 = 0x200;
14 /// Include device nodes
15 pub const WITH_DEVICE_NODES
: u64 = 0x400;
17 pub const WITH_FIFOS
: u64 = 0x800;
19 pub const WITH_SOCKETS
: u64 = 0x1000;
21 /// Preserve DOS file flag `HIDDEN`
22 pub const WITH_FLAG_HIDDEN
: u64 = 0x2000;
23 /// Preserve DOS file flag `SYSTEM`
24 pub const WITH_FLAG_SYSTEM
: u64 = 0x4000;
25 /// Preserve DOS file flag `ARCHIVE`
26 pub const WITH_FLAG_ARCHIVE
: u64 = 0x8000;
29 /// Linux file attribute `APPEND`
30 pub const WITH_FLAG_APPEND
: u64 = 0x10000;
31 /// Linux file attribute `NOATIME`
32 pub const WITH_FLAG_NOATIME
: u64 = 0x20000;
33 /// Linux file attribute `COMPR`
34 pub const WITH_FLAG_COMPR
: u64 = 0x40000;
35 /// Linux file attribute `NOCOW`
36 pub const WITH_FLAG_NOCOW
: u64 = 0x80000;
37 /// Linux file attribute `NODUMP`
38 pub const WITH_FLAG_NODUMP
: u64 = 0x100000;
39 /// Linux file attribute `DIRSYNC`
40 pub const WITH_FLAG_DIRSYNC
: u64 = 0x200000;
41 /// Linux file attribute `IMMUTABLE`
42 pub const WITH_FLAG_IMMUTABLE
: u64 = 0x400000;
43 /// Linux file attribute `SYNC`
44 pub const WITH_FLAG_SYNC
: u64 = 0x800000;
45 /// Linux file attribute `NOCOMP`
46 pub const WITH_FLAG_NOCOMP
: u64 = 0x1000000;
47 /// Linux file attribute `PROJINHERIT`
48 pub const WITH_FLAG_PROJINHERIT
: u64 = 0x2000000;
51 /// Preserve BTRFS subvolume flag
52 pub const WITH_SUBVOLUME
: u64 = 0x4000000;
53 /// Preserve BTRFS read-only subvolume flag
54 pub const WITH_SUBVOLUME_RO
: u64 = 0x8000000;
56 /// Preserve Extended Attribute metadata
57 pub const WITH_XATTRS
: u64 = 0x10000000;
58 /// Preserve Access Control List metadata
59 pub const WITH_ACL
: u64 = 0x20000000;
60 /// Preserve SELinux security context
61 pub const WITH_SELINUX
: u64 = 0x40000000;
62 /// Preserve "security.capability" xattr
63 pub const WITH_FCAPS
: u64 = 0x80000000;
65 /// Preserve XFS/ext4/ZFS project quota ID
66 pub const WITH_QUOTA_PROJID
: u64 = 0x100000000;
68 /// Support ".pxarexclude" files
69 pub const EXCLUDE_FILE
: u64 = 0x1000000000000000;
70 /// the purpose of this flag is still unclear
71 pub const SHA512_256
: u64 = 0x2000000000000000;
73 pub const EXCLUDE_SUBMOUNTS
: u64 = 0x4000000000000000;
74 /// Exclude entries with chattr flag NODUMP
75 pub const EXCLUDE_NODUMP
: u64 = 0x8000000000000000;
77 /// Definitions of typical feature flags for the *pxar* encoder/decoder.
78 /// By this expensive syscalls for unsupported features are avoided.
80 /// All chattr file attributes
81 pub const WITH_CHATTR
: u64 =
91 WITH_FLAG_PROJINHERIT
;
93 /// All FAT file attributes
94 pub const WITH_FAT_ATTRS
: u64 =
99 /// All bits that may also be exposed via fuse
100 pub const WITH_FUSE
: u64 =
113 /// Default feature flags for encoder/decoder
114 pub const DEFAULT
: u64 =
131 WITH_FLAG_PROJINHERIT
|
143 // form /usr/include/linux/fs.h
144 const FS_APPEND_FL
: u32 = 0x00000020;
145 const FS_NOATIME_FL
: u32 = 0x00000080;
146 const FS_COMPR_FL
: u32 = 0x00000004;
147 const FS_NOCOW_FL
: u32 = 0x00800000;
148 const FS_NODUMP_FL
: u32 = 0x00000040;
149 const FS_DIRSYNC_FL
: u32 = 0x00010000;
150 const FS_IMMUTABLE_FL
: u32 = 0x00000010;
151 const FS_SYNC_FL
: u32 = 0x00000008;
152 const FS_NOCOMP_FL
: u32 = 0x00000400;
153 const FS_PROJINHERIT_FL
: u32 = 0x20000000;
155 static CHATTR_MAP
: [(u64, u32); 10] = [
156 ( WITH_FLAG_APPEND
, FS_APPEND_FL
),
157 ( WITH_FLAG_NOATIME
, FS_NOATIME_FL
),
158 ( WITH_FLAG_COMPR
, FS_COMPR_FL
),
159 ( WITH_FLAG_NOCOW
, FS_NOCOW_FL
),
160 ( WITH_FLAG_NODUMP
, FS_NODUMP_FL
),
161 ( WITH_FLAG_DIRSYNC
, FS_DIRSYNC_FL
),
162 ( WITH_FLAG_IMMUTABLE
, FS_IMMUTABLE_FL
),
163 ( WITH_FLAG_SYNC
, FS_SYNC_FL
),
164 ( WITH_FLAG_NOCOMP
, FS_NOCOMP_FL
),
165 ( WITH_FLAG_PROJINHERIT
, FS_PROJINHERIT_FL
),
168 pub fn feature_flags_from_chattr(attr
: u32) -> u64 {
170 let mut flags
= 0u64;
172 for (fe_flag
, fs_flag
) in &CHATTR_MAP
{
173 if (attr
& fs_flag
) != 0 { flags = flags | fe_flag; }
179 // from /usr/include/linux/msdos_fs.h
180 const ATTR_HIDDEN
: u32 = 2;
181 const ATTR_SYS
: u32 = 4;
182 const ATTR_ARCH
: u32 = 32;
184 static FAT_ATTR_MAP
: [(u64, u32); 3] = [
185 ( WITH_FLAG_HIDDEN
, ATTR_HIDDEN
),
186 ( WITH_FLAG_SYSTEM
, ATTR_SYS
),
187 ( WITH_FLAG_ARCHIVE
, ATTR_ARCH
),
190 pub fn feature_flags_from_fat_attr(attr
: u32) -> u64 {
192 let mut flags
= 0u64;
194 for (fe_flag
, fs_flag
) in &FAT_ATTR_MAP
{
195 if (attr
& fs_flag
) != 0 { flags = flags | fe_flag; }
202 /// Return the supported *pxar* feature flags based on the magic number of the filesystem.
203 pub fn feature_flags_from_magic(magic
: i64) -> u64 {
204 use crate::tools
::fs
::magic
::*;
206 MSDOS_SUPER_MAGIC
=> {
211 EXT4_SUPER_MAGIC
=> {
270 BTRFS_SUPER_MAGIC
=> {
305 // FUSE mounts are special as the supported feature set
306 // is not clear a priori.
307 FUSE_SUPER_MAGIC
=> {