]> git.proxmox.com Git - proxmox-backup.git/blame - src/pxar/flags.rs
pxar: remove flag to change digest algorithm
[proxmox-backup.git] / src / pxar / flags.rs
CommitLineData
47651f95
CE
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
7pub const WITH_2SEC_TIME: u64 = 0x40;
8/// Preserve read only flag of files
9pub const WITH_READ_ONLY: u64 = 0x80;
10/// Preserve unix permissions
11pub const WITH_PERMISSIONS: u64 = 0x100;
12/// Include symbolik links
13pub const WITH_SYMLINKS: u64 = 0x200;
14/// Include device nodes
15pub const WITH_DEVICE_NODES: u64 = 0x400;
16/// Include FIFOs
17pub const WITH_FIFOS: u64 = 0x800;
18/// Include Sockets
19pub const WITH_SOCKETS: u64 = 0x1000;
20
21/// Preserve DOS file flag `HIDDEN`
22pub const WITH_FLAG_HIDDEN: u64 = 0x2000;
23/// Preserve DOS file flag `SYSTEM`
24pub const WITH_FLAG_SYSTEM: u64 = 0x4000;
25/// Preserve DOS file flag `ARCHIVE`
26pub const WITH_FLAG_ARCHIVE: u64 = 0x8000;
27
28// chattr() flags
29/// Linux file attribute `APPEND`
30pub const WITH_FLAG_APPEND: u64 = 0x10000;
31/// Linux file attribute `NOATIME`
32pub const WITH_FLAG_NOATIME: u64 = 0x20000;
33/// Linux file attribute `COMPR`
34pub const WITH_FLAG_COMPR: u64 = 0x40000;
35/// Linux file attribute `NOCOW`
36pub const WITH_FLAG_NOCOW: u64 = 0x80000;
37/// Linux file attribute `NODUMP`
38pub const WITH_FLAG_NODUMP: u64 = 0x100000;
39/// Linux file attribute `DIRSYNC`
40pub const WITH_FLAG_DIRSYNC: u64 = 0x200000;
41/// Linux file attribute `IMMUTABLE`
42pub const WITH_FLAG_IMMUTABLE: u64 = 0x400000;
43/// Linux file attribute `SYNC`
44pub const WITH_FLAG_SYNC: u64 = 0x800000;
45/// Linux file attribute `NOCOMP`
46pub const WITH_FLAG_NOCOMP: u64 = 0x1000000;
47/// Linux file attribute `PROJINHERIT`
48pub const WITH_FLAG_PROJINHERIT: u64 = 0x2000000;
49
50
51/// Preserve BTRFS subvolume flag
52pub const WITH_SUBVOLUME: u64 = 0x4000000;
53/// Preserve BTRFS read-only subvolume flag
54pub const WITH_SUBVOLUME_RO: u64 = 0x8000000;
55
56/// Preserve Extended Attribute metadata
57pub const WITH_XATTRS: u64 = 0x10000000;
58/// Preserve Access Control List metadata
59pub const WITH_ACL: u64 = 0x20000000;
60/// Preserve SELinux security context
61pub const WITH_SELINUX: u64 = 0x40000000;
62/// Preserve "security.capability" xattr
63pub const WITH_FCAPS: u64 = 0x80000000;
64
65/// Preserve XFS/ext4/ZFS project quota ID
66pub const WITH_QUOTA_PROJID: u64 = 0x100000000;
67
68/// Support ".pxarexclude" files
69pub const EXCLUDE_FILE: u64 = 0x1000000000000000;
47651f95
CE
70/// Exclude submounts
71pub const EXCLUDE_SUBMOUNTS: u64 = 0x4000000000000000;
72/// Exclude entries with chattr flag NODUMP
73pub const EXCLUDE_NODUMP: u64 = 0x8000000000000000;
74
75/// Definitions of typical feature flags for the *pxar* encoder/decoder.
76/// By this expensive syscalls for unsupported features are avoided.
77
78/// All chattr file attributes
79pub const WITH_CHATTR: u64 =
80 WITH_FLAG_APPEND|
81 WITH_FLAG_NOATIME|
82 WITH_FLAG_COMPR|
83 WITH_FLAG_NOCOW|
84 WITH_FLAG_NODUMP|
85 WITH_FLAG_DIRSYNC|
86 WITH_FLAG_IMMUTABLE|
87 WITH_FLAG_SYNC|
88 WITH_FLAG_NOCOMP|
89 WITH_FLAG_PROJINHERIT;
90
91/// All FAT file attributes
92pub const WITH_FAT_ATTRS: u64 =
93 WITH_FLAG_HIDDEN|
94 WITH_FLAG_SYSTEM|
95 WITH_FLAG_ARCHIVE;
96
97/// All bits that may also be exposed via fuse
98pub const WITH_FUSE: u64 =
99 WITH_2SEC_TIME|
100 WITH_READ_ONLY|
101 WITH_PERMISSIONS|
102 WITH_SYMLINKS|
103 WITH_DEVICE_NODES|
104 WITH_FIFOS|
105 WITH_SOCKETS|
106 WITH_FAT_ATTRS|
107 WITH_CHATTR|
108 WITH_XATTRS;
109
110
111/// Default feature flags for encoder/decoder
112pub const DEFAULT: u64 =
113 WITH_SYMLINKS|
114 WITH_DEVICE_NODES|
115 WITH_FIFOS|
116 WITH_SOCKETS|
117 WITH_FLAG_HIDDEN|
118 WITH_FLAG_SYSTEM|
119 WITH_FLAG_ARCHIVE|
120 WITH_FLAG_APPEND|
121 WITH_FLAG_NOATIME|
122 WITH_FLAG_COMPR|
123 WITH_FLAG_NOCOW|
124 //WITH_FLAG_NODUMP|
125 WITH_FLAG_DIRSYNC|
126 WITH_FLAG_IMMUTABLE|
127 WITH_FLAG_SYNC|
128 WITH_FLAG_NOCOMP|
129 WITH_FLAG_PROJINHERIT|
130 WITH_SUBVOLUME|
131 WITH_SUBVOLUME_RO|
132 WITH_XATTRS|
133 WITH_ACL|
134 WITH_SELINUX|
135 WITH_FCAPS|
136 WITH_QUOTA_PROJID|
137 EXCLUDE_NODUMP|
4ea0f7d9 138 EXCLUDE_FILE;
47651f95
CE
139
140// form /usr/include/linux/fs.h
141const FS_APPEND_FL: u32 = 0x00000020;
142const FS_NOATIME_FL: u32 = 0x00000080;
143const FS_COMPR_FL: u32 = 0x00000004;
144const FS_NOCOW_FL: u32 = 0x00800000;
145const FS_NODUMP_FL: u32 = 0x00000040;
146const FS_DIRSYNC_FL: u32 = 0x00010000;
147const FS_IMMUTABLE_FL: u32 = 0x00000010;
148const FS_SYNC_FL: u32 = 0x00000008;
149const FS_NOCOMP_FL: u32 = 0x00000400;
150const FS_PROJINHERIT_FL: u32 = 0x20000000;
151
152static CHATTR_MAP: [(u64, u32); 10] = [
153 ( WITH_FLAG_APPEND, FS_APPEND_FL ),
154 ( WITH_FLAG_NOATIME, FS_NOATIME_FL ),
155 ( WITH_FLAG_COMPR, FS_COMPR_FL ),
156 ( WITH_FLAG_NOCOW, FS_NOCOW_FL ),
157 ( WITH_FLAG_NODUMP, FS_NODUMP_FL ),
158 ( WITH_FLAG_DIRSYNC, FS_DIRSYNC_FL ),
159 ( WITH_FLAG_IMMUTABLE, FS_IMMUTABLE_FL ),
160 ( WITH_FLAG_SYNC, FS_SYNC_FL ),
161 ( WITH_FLAG_NOCOMP, FS_NOCOMP_FL ),
162 ( WITH_FLAG_PROJINHERIT, FS_PROJINHERIT_FL ),
163];
164
165pub fn feature_flags_from_chattr(attr: u32) -> u64 {
166
167 let mut flags = 0u64;
168
169 for (fe_flag, fs_flag) in &CHATTR_MAP {
170 if (attr & fs_flag) != 0 { flags = flags | fe_flag; }
171 }
172
173 flags
174}
175
176// from /usr/include/linux/msdos_fs.h
177const ATTR_HIDDEN: u32 = 2;
178const ATTR_SYS: u32 = 4;
179const ATTR_ARCH: u32 = 32;
180
181static FAT_ATTR_MAP: [(u64, u32); 3] = [
182 ( WITH_FLAG_HIDDEN, ATTR_HIDDEN ),
183 ( WITH_FLAG_SYSTEM, ATTR_SYS ),
184 ( WITH_FLAG_ARCHIVE, ATTR_ARCH ),
185];
186
187pub fn feature_flags_from_fat_attr(attr: u32) -> u64 {
188
189 let mut flags = 0u64;
190
191 for (fe_flag, fs_flag) in &FAT_ATTR_MAP {
192 if (attr & fs_flag) != 0 { flags = flags | fe_flag; }
193 }
194
195 flags
196}
197
198
199/// Return the supported *pxar* feature flags based on the magic number of the filesystem.
200pub fn feature_flags_from_magic(magic: i64) -> u64 {
201 use crate::tools::fs::magic::*;
202 match magic {
203 MSDOS_SUPER_MAGIC => {
204 WITH_2SEC_TIME|
205 WITH_READ_ONLY|
206 WITH_FAT_ATTRS
207 },
208 EXT4_SUPER_MAGIC => {
209 WITH_2SEC_TIME|
210 WITH_READ_ONLY|
211 WITH_PERMISSIONS|
212 WITH_SYMLINKS|
213 WITH_DEVICE_NODES|
214 WITH_FIFOS|
215 WITH_SOCKETS|
216 WITH_FLAG_APPEND|
217 WITH_FLAG_NOATIME|
218 WITH_FLAG_NODUMP|
219 WITH_FLAG_DIRSYNC|
220 WITH_FLAG_IMMUTABLE|
221 WITH_FLAG_SYNC|
222 WITH_XATTRS|
223 WITH_ACL|
224 WITH_SELINUX|
225 WITH_FCAPS|
226 WITH_QUOTA_PROJID
227 },
228 XFS_SUPER_MAGIC => {
229 WITH_2SEC_TIME|
230 WITH_READ_ONLY|
231 WITH_PERMISSIONS|
232 WITH_SYMLINKS|
233 WITH_DEVICE_NODES|
234 WITH_FIFOS|
235 WITH_SOCKETS|
236 WITH_FLAG_APPEND|
237 WITH_FLAG_NOATIME|
238 WITH_FLAG_NODUMP|
239 WITH_FLAG_IMMUTABLE|
240 WITH_FLAG_SYNC|
241 WITH_XATTRS|
242 WITH_ACL|
243 WITH_SELINUX|
244 WITH_FCAPS|
245 WITH_QUOTA_PROJID
246 },
247 ZFS_SUPER_MAGIC => {
248 WITH_2SEC_TIME|
249 WITH_READ_ONLY|
250 WITH_PERMISSIONS|
251 WITH_SYMLINKS|
252 WITH_DEVICE_NODES|
253 WITH_FIFOS|
254 WITH_SOCKETS|
255 WITH_FLAG_APPEND|
256 WITH_FLAG_NOATIME|
257 WITH_FLAG_NODUMP|
258 WITH_FLAG_DIRSYNC|
259 WITH_FLAG_IMMUTABLE|
260 WITH_FLAG_SYNC|
261 WITH_XATTRS|
262 WITH_ACL|
263 WITH_SELINUX|
264 WITH_FCAPS|
265 WITH_QUOTA_PROJID
266 },
267 BTRFS_SUPER_MAGIC => {
268 WITH_2SEC_TIME|
269 WITH_READ_ONLY|
270 WITH_PERMISSIONS|
271 WITH_SYMLINKS|
272 WITH_DEVICE_NODES|
273 WITH_FIFOS|
274 WITH_SOCKETS|
275 WITH_FLAG_APPEND|
276 WITH_FLAG_NOATIME|
277 WITH_FLAG_COMPR|
278 WITH_FLAG_NOCOW|
279 WITH_FLAG_NODUMP|
280 WITH_FLAG_DIRSYNC|
281 WITH_FLAG_IMMUTABLE|
282 WITH_FLAG_SYNC|
283 WITH_FLAG_NOCOMP|
284 WITH_XATTRS|
285 WITH_ACL|
286 WITH_SELINUX|
287 WITH_SUBVOLUME|
288 WITH_SUBVOLUME_RO|
289 WITH_FCAPS
290 },
291 TMPFS_MAGIC => {
292 WITH_2SEC_TIME|
293 WITH_READ_ONLY|
294 WITH_PERMISSIONS|
295 WITH_SYMLINKS|
296 WITH_DEVICE_NODES|
297 WITH_FIFOS|
298 WITH_SOCKETS|
299 WITH_ACL|
300 WITH_SELINUX
301 },
302 // FUSE mounts are special as the supported feature set
303 // is not clear a priori.
304 FUSE_SUPER_MAGIC => {
305 WITH_FUSE
306 },
307 _ => {
308 WITH_2SEC_TIME|
309 WITH_READ_ONLY|
310 WITH_PERMISSIONS|
311 WITH_SYMLINKS|
312 WITH_DEVICE_NODES|
313 WITH_FIFOS|
314 WITH_SOCKETS
315 },
316 }
317}