]> git.proxmox.com Git - proxmox-backup.git/blob - src/pxar/flags.rs
pxar: cleanup: move feature flags to src/pxar/flags.rs and omit CA_FORMAT prefix...
[proxmox-backup.git] / src / pxar / flags.rs
1 //! Feature flags for *pxar* allow to control what is stored/restored in/from the
2 //! archive.
3 //! Flags for known supported features for a given filesystem can be derived
4 //! from the superblocks magic number.
5
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;
16 /// Include FIFOs
17 pub const WITH_FIFOS: u64 = 0x800;
18 /// Include Sockets
19 pub const WITH_SOCKETS: u64 = 0x1000;
20
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;
27
28 // chattr() flags
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;
49
50
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;
55
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;
64
65 /// Preserve XFS/ext4/ZFS project quota ID
66 pub const WITH_QUOTA_PROJID: u64 = 0x100000000;
67
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;
72 /// Exclude submounts
73 pub const EXCLUDE_SUBMOUNTS: u64 = 0x4000000000000000;
74 /// Exclude entries with chattr flag NODUMP
75 pub const EXCLUDE_NODUMP: u64 = 0x8000000000000000;
76
77 /// Definitions of typical feature flags for the *pxar* encoder/decoder.
78 /// By this expensive syscalls for unsupported features are avoided.
79
80 /// All chattr file attributes
81 pub const WITH_CHATTR: u64 =
82 WITH_FLAG_APPEND|
83 WITH_FLAG_NOATIME|
84 WITH_FLAG_COMPR|
85 WITH_FLAG_NOCOW|
86 WITH_FLAG_NODUMP|
87 WITH_FLAG_DIRSYNC|
88 WITH_FLAG_IMMUTABLE|
89 WITH_FLAG_SYNC|
90 WITH_FLAG_NOCOMP|
91 WITH_FLAG_PROJINHERIT;
92
93 /// All FAT file attributes
94 pub const WITH_FAT_ATTRS: u64 =
95 WITH_FLAG_HIDDEN|
96 WITH_FLAG_SYSTEM|
97 WITH_FLAG_ARCHIVE;
98
99 /// All bits that may also be exposed via fuse
100 pub const WITH_FUSE: u64 =
101 WITH_2SEC_TIME|
102 WITH_READ_ONLY|
103 WITH_PERMISSIONS|
104 WITH_SYMLINKS|
105 WITH_DEVICE_NODES|
106 WITH_FIFOS|
107 WITH_SOCKETS|
108 WITH_FAT_ATTRS|
109 WITH_CHATTR|
110 WITH_XATTRS;
111
112
113 /// Default feature flags for encoder/decoder
114 pub const DEFAULT: u64 =
115 WITH_SYMLINKS|
116 WITH_DEVICE_NODES|
117 WITH_FIFOS|
118 WITH_SOCKETS|
119 WITH_FLAG_HIDDEN|
120 WITH_FLAG_SYSTEM|
121 WITH_FLAG_ARCHIVE|
122 WITH_FLAG_APPEND|
123 WITH_FLAG_NOATIME|
124 WITH_FLAG_COMPR|
125 WITH_FLAG_NOCOW|
126 //WITH_FLAG_NODUMP|
127 WITH_FLAG_DIRSYNC|
128 WITH_FLAG_IMMUTABLE|
129 WITH_FLAG_SYNC|
130 WITH_FLAG_NOCOMP|
131 WITH_FLAG_PROJINHERIT|
132 WITH_SUBVOLUME|
133 WITH_SUBVOLUME_RO|
134 WITH_XATTRS|
135 WITH_ACL|
136 WITH_SELINUX|
137 WITH_FCAPS|
138 WITH_QUOTA_PROJID|
139 EXCLUDE_NODUMP|
140 EXCLUDE_FILE|
141 SHA512_256;
142
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;
154
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 ),
166 ];
167
168 pub fn feature_flags_from_chattr(attr: u32) -> u64 {
169
170 let mut flags = 0u64;
171
172 for (fe_flag, fs_flag) in &CHATTR_MAP {
173 if (attr & fs_flag) != 0 { flags = flags | fe_flag; }
174 }
175
176 flags
177 }
178
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;
183
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 ),
188 ];
189
190 pub fn feature_flags_from_fat_attr(attr: u32) -> u64 {
191
192 let mut flags = 0u64;
193
194 for (fe_flag, fs_flag) in &FAT_ATTR_MAP {
195 if (attr & fs_flag) != 0 { flags = flags | fe_flag; }
196 }
197
198 flags
199 }
200
201
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::*;
205 match magic {
206 MSDOS_SUPER_MAGIC => {
207 WITH_2SEC_TIME|
208 WITH_READ_ONLY|
209 WITH_FAT_ATTRS
210 },
211 EXT4_SUPER_MAGIC => {
212 WITH_2SEC_TIME|
213 WITH_READ_ONLY|
214 WITH_PERMISSIONS|
215 WITH_SYMLINKS|
216 WITH_DEVICE_NODES|
217 WITH_FIFOS|
218 WITH_SOCKETS|
219 WITH_FLAG_APPEND|
220 WITH_FLAG_NOATIME|
221 WITH_FLAG_NODUMP|
222 WITH_FLAG_DIRSYNC|
223 WITH_FLAG_IMMUTABLE|
224 WITH_FLAG_SYNC|
225 WITH_XATTRS|
226 WITH_ACL|
227 WITH_SELINUX|
228 WITH_FCAPS|
229 WITH_QUOTA_PROJID
230 },
231 XFS_SUPER_MAGIC => {
232 WITH_2SEC_TIME|
233 WITH_READ_ONLY|
234 WITH_PERMISSIONS|
235 WITH_SYMLINKS|
236 WITH_DEVICE_NODES|
237 WITH_FIFOS|
238 WITH_SOCKETS|
239 WITH_FLAG_APPEND|
240 WITH_FLAG_NOATIME|
241 WITH_FLAG_NODUMP|
242 WITH_FLAG_IMMUTABLE|
243 WITH_FLAG_SYNC|
244 WITH_XATTRS|
245 WITH_ACL|
246 WITH_SELINUX|
247 WITH_FCAPS|
248 WITH_QUOTA_PROJID
249 },
250 ZFS_SUPER_MAGIC => {
251 WITH_2SEC_TIME|
252 WITH_READ_ONLY|
253 WITH_PERMISSIONS|
254 WITH_SYMLINKS|
255 WITH_DEVICE_NODES|
256 WITH_FIFOS|
257 WITH_SOCKETS|
258 WITH_FLAG_APPEND|
259 WITH_FLAG_NOATIME|
260 WITH_FLAG_NODUMP|
261 WITH_FLAG_DIRSYNC|
262 WITH_FLAG_IMMUTABLE|
263 WITH_FLAG_SYNC|
264 WITH_XATTRS|
265 WITH_ACL|
266 WITH_SELINUX|
267 WITH_FCAPS|
268 WITH_QUOTA_PROJID
269 },
270 BTRFS_SUPER_MAGIC => {
271 WITH_2SEC_TIME|
272 WITH_READ_ONLY|
273 WITH_PERMISSIONS|
274 WITH_SYMLINKS|
275 WITH_DEVICE_NODES|
276 WITH_FIFOS|
277 WITH_SOCKETS|
278 WITH_FLAG_APPEND|
279 WITH_FLAG_NOATIME|
280 WITH_FLAG_COMPR|
281 WITH_FLAG_NOCOW|
282 WITH_FLAG_NODUMP|
283 WITH_FLAG_DIRSYNC|
284 WITH_FLAG_IMMUTABLE|
285 WITH_FLAG_SYNC|
286 WITH_FLAG_NOCOMP|
287 WITH_XATTRS|
288 WITH_ACL|
289 WITH_SELINUX|
290 WITH_SUBVOLUME|
291 WITH_SUBVOLUME_RO|
292 WITH_FCAPS
293 },
294 TMPFS_MAGIC => {
295 WITH_2SEC_TIME|
296 WITH_READ_ONLY|
297 WITH_PERMISSIONS|
298 WITH_SYMLINKS|
299 WITH_DEVICE_NODES|
300 WITH_FIFOS|
301 WITH_SOCKETS|
302 WITH_ACL|
303 WITH_SELINUX
304 },
305 // FUSE mounts are special as the supported feature set
306 // is not clear a priori.
307 FUSE_SUPER_MAGIC => {
308 WITH_FUSE
309 },
310 _ => {
311 WITH_2SEC_TIME|
312 WITH_READ_ONLY|
313 WITH_PERMISSIONS|
314 WITH_SYMLINKS|
315 WITH_DEVICE_NODES|
316 WITH_FIFOS|
317 WITH_SOCKETS
318 },
319 }
320 }