]> git.proxmox.com Git - proxmox-backup.git/blob - src/pxar/flags.rs
switch to external pxar and fuse crates
[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 // FIXME: use bitflags!() here!
7
8 /// FAT-style 2s time granularity
9 pub const WITH_2SEC_TIME: u64 = 0x40;
10 /// Preserve read only flag of files
11 pub const WITH_READ_ONLY: u64 = 0x80;
12 /// Preserve unix permissions
13 pub const WITH_PERMISSIONS: u64 = 0x100;
14 /// Include symbolik links
15 pub const WITH_SYMLINKS: u64 = 0x200;
16 /// Include device nodes
17 pub const WITH_DEVICE_NODES: u64 = 0x400;
18 /// Include FIFOs
19 pub const WITH_FIFOS: u64 = 0x800;
20 /// Include Sockets
21 pub const WITH_SOCKETS: u64 = 0x1000;
22
23 /// Preserve DOS file flag `HIDDEN`
24 pub const WITH_FLAG_HIDDEN: u64 = 0x2000;
25 /// Preserve DOS file flag `SYSTEM`
26 pub const WITH_FLAG_SYSTEM: u64 = 0x4000;
27 /// Preserve DOS file flag `ARCHIVE`
28 pub const WITH_FLAG_ARCHIVE: u64 = 0x8000;
29
30 // chattr() flags
31 /// Linux file attribute `APPEND`
32 pub const WITH_FLAG_APPEND: u64 = 0x10000;
33 /// Linux file attribute `NOATIME`
34 pub const WITH_FLAG_NOATIME: u64 = 0x20000;
35 /// Linux file attribute `COMPR`
36 pub const WITH_FLAG_COMPR: u64 = 0x40000;
37 /// Linux file attribute `NOCOW`
38 pub const WITH_FLAG_NOCOW: u64 = 0x80000;
39 /// Linux file attribute `NODUMP`
40 pub const WITH_FLAG_NODUMP: u64 = 0x0010_0000;
41 /// Linux file attribute `DIRSYNC`
42 pub const WITH_FLAG_DIRSYNC: u64 = 0x0020_0000;
43 /// Linux file attribute `IMMUTABLE`
44 pub const WITH_FLAG_IMMUTABLE: u64 = 0x0040_0000;
45 /// Linux file attribute `SYNC`
46 pub const WITH_FLAG_SYNC: u64 = 0x0080_0000;
47 /// Linux file attribute `NOCOMP`
48 pub const WITH_FLAG_NOCOMP: u64 = 0x0100_0000;
49 /// Linux file attribute `PROJINHERIT`
50 pub const WITH_FLAG_PROJINHERIT: u64 = 0x0200_0000;
51
52
53 /// Preserve BTRFS subvolume flag
54 pub const WITH_SUBVOLUME: u64 = 0x0400_0000;
55 /// Preserve BTRFS read-only subvolume flag
56 pub const WITH_SUBVOLUME_RO: u64 = 0x0800_0000;
57
58 /// Preserve Extended Attribute metadata
59 pub const WITH_XATTRS: u64 = 0x1000_0000;
60 /// Preserve Access Control List metadata
61 pub const WITH_ACL: u64 = 0x2000_0000;
62 /// Preserve SELinux security context
63 pub const WITH_SELINUX: u64 = 0x4000_0000;
64 /// Preserve "security.capability" xattr
65 pub const WITH_FCAPS: u64 = 0x8000_0000;
66
67 /// Preserve XFS/ext4/ZFS project quota ID
68 pub const WITH_QUOTA_PROJID: u64 = 0x0001_0000_0000;
69
70 /// Support ".pxarexclude" files
71 pub const EXCLUDE_FILE: u64 = 0x1000_0000_0000_0000;
72 /// Exclude submounts
73 pub const EXCLUDE_SUBMOUNTS: u64 = 0x4000_0000_0000_0000;
74 /// Exclude entries with chattr flag NODUMP
75 pub const EXCLUDE_NODUMP: u64 = 0x8000_0000_0000_0000;
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
142 // form /usr/include/linux/fs.h
143 const FS_APPEND_FL: u32 = 0x0000_0020;
144 const FS_NOATIME_FL: u32 = 0x0000_0080;
145 const FS_COMPR_FL: u32 = 0x0000_0004;
146 const FS_NOCOW_FL: u32 = 0x0080_0000;
147 const FS_NODUMP_FL: u32 = 0x0000_0040;
148 const FS_DIRSYNC_FL: u32 = 0x0001_0000;
149 const FS_IMMUTABLE_FL: u32 = 0x0000_0010;
150 const FS_SYNC_FL: u32 = 0x0000_0008;
151 const FS_NOCOMP_FL: u32 = 0x0000_0400;
152 const FS_PROJINHERIT_FL: u32 = 0x2000_0000;
153
154 static CHATTR_MAP: [(u64, u32); 10] = [
155 ( WITH_FLAG_APPEND, FS_APPEND_FL ),
156 ( WITH_FLAG_NOATIME, FS_NOATIME_FL ),
157 ( WITH_FLAG_COMPR, FS_COMPR_FL ),
158 ( WITH_FLAG_NOCOW, FS_NOCOW_FL ),
159 ( WITH_FLAG_NODUMP, FS_NODUMP_FL ),
160 ( WITH_FLAG_DIRSYNC, FS_DIRSYNC_FL ),
161 ( WITH_FLAG_IMMUTABLE, FS_IMMUTABLE_FL ),
162 ( WITH_FLAG_SYNC, FS_SYNC_FL ),
163 ( WITH_FLAG_NOCOMP, FS_NOCOMP_FL ),
164 ( WITH_FLAG_PROJINHERIT, FS_PROJINHERIT_FL ),
165 ];
166
167 pub fn feature_flags_from_chattr(attr: u32) -> u64 {
168
169 let mut flags = 0u64;
170
171 for (fe_flag, fs_flag) in &CHATTR_MAP {
172 if (attr & fs_flag) != 0 { flags |= fe_flag; }
173 }
174
175 flags
176 }
177
178 // from /usr/include/linux/msdos_fs.h
179 const ATTR_HIDDEN: u32 = 2;
180 const ATTR_SYS: u32 = 4;
181 const ATTR_ARCH: u32 = 32;
182
183 static FAT_ATTR_MAP: [(u64, u32); 3] = [
184 ( WITH_FLAG_HIDDEN, ATTR_HIDDEN ),
185 ( WITH_FLAG_SYSTEM, ATTR_SYS ),
186 ( WITH_FLAG_ARCHIVE, ATTR_ARCH ),
187 ];
188
189 pub fn feature_flags_from_fat_attr(attr: u32) -> u64 {
190
191 let mut flags = 0u64;
192
193 for (fe_flag, fs_flag) in &FAT_ATTR_MAP {
194 if (attr & fs_flag) != 0 { flags |= fe_flag; }
195 }
196
197 flags
198 }
199
200
201 /// Return the supported *pxar* feature flags based on the magic number of the filesystem.
202 pub fn feature_flags_from_magic(magic: i64) -> u64 {
203 use proxmox::sys::linux::magic::*;
204 match magic {
205 MSDOS_SUPER_MAGIC => {
206 WITH_2SEC_TIME|
207 WITH_READ_ONLY|
208 WITH_FAT_ATTRS
209 },
210 EXT4_SUPER_MAGIC => {
211 WITH_2SEC_TIME|
212 WITH_READ_ONLY|
213 WITH_PERMISSIONS|
214 WITH_SYMLINKS|
215 WITH_DEVICE_NODES|
216 WITH_FIFOS|
217 WITH_SOCKETS|
218 WITH_FLAG_APPEND|
219 WITH_FLAG_NOATIME|
220 WITH_FLAG_NODUMP|
221 WITH_FLAG_DIRSYNC|
222 WITH_FLAG_IMMUTABLE|
223 WITH_FLAG_SYNC|
224 WITH_XATTRS|
225 WITH_ACL|
226 WITH_SELINUX|
227 WITH_FCAPS|
228 WITH_QUOTA_PROJID
229 },
230 XFS_SUPER_MAGIC => {
231 WITH_2SEC_TIME|
232 WITH_READ_ONLY|
233 WITH_PERMISSIONS|
234 WITH_SYMLINKS|
235 WITH_DEVICE_NODES|
236 WITH_FIFOS|
237 WITH_SOCKETS|
238 WITH_FLAG_APPEND|
239 WITH_FLAG_NOATIME|
240 WITH_FLAG_NODUMP|
241 WITH_FLAG_IMMUTABLE|
242 WITH_FLAG_SYNC|
243 WITH_XATTRS|
244 WITH_ACL|
245 WITH_SELINUX|
246 WITH_FCAPS|
247 WITH_QUOTA_PROJID
248 },
249 ZFS_SUPER_MAGIC => {
250 WITH_2SEC_TIME|
251 WITH_READ_ONLY|
252 WITH_PERMISSIONS|
253 WITH_SYMLINKS|
254 WITH_DEVICE_NODES|
255 WITH_FIFOS|
256 WITH_SOCKETS|
257 WITH_FLAG_APPEND|
258 WITH_FLAG_NOATIME|
259 WITH_FLAG_NODUMP|
260 WITH_FLAG_DIRSYNC|
261 WITH_FLAG_IMMUTABLE|
262 WITH_FLAG_SYNC|
263 WITH_XATTRS|
264 WITH_ACL|
265 WITH_SELINUX|
266 WITH_FCAPS|
267 WITH_QUOTA_PROJID
268 },
269 BTRFS_SUPER_MAGIC => {
270 WITH_2SEC_TIME|
271 WITH_READ_ONLY|
272 WITH_PERMISSIONS|
273 WITH_SYMLINKS|
274 WITH_DEVICE_NODES|
275 WITH_FIFOS|
276 WITH_SOCKETS|
277 WITH_FLAG_APPEND|
278 WITH_FLAG_NOATIME|
279 WITH_FLAG_COMPR|
280 WITH_FLAG_NOCOW|
281 WITH_FLAG_NODUMP|
282 WITH_FLAG_DIRSYNC|
283 WITH_FLAG_IMMUTABLE|
284 WITH_FLAG_SYNC|
285 WITH_FLAG_NOCOMP|
286 WITH_XATTRS|
287 WITH_ACL|
288 WITH_SELINUX|
289 WITH_SUBVOLUME|
290 WITH_SUBVOLUME_RO|
291 WITH_FCAPS
292 },
293 TMPFS_MAGIC => {
294 WITH_2SEC_TIME|
295 WITH_READ_ONLY|
296 WITH_PERMISSIONS|
297 WITH_SYMLINKS|
298 WITH_DEVICE_NODES|
299 WITH_FIFOS|
300 WITH_SOCKETS|
301 WITH_ACL|
302 WITH_SELINUX
303 },
304 // FUSE mounts are special as the supported feature set
305 // is not clear a priori.
306 FUSE_SUPER_MAGIC => {
307 WITH_FUSE
308 },
309 _ => {
310 WITH_2SEC_TIME|
311 WITH_READ_ONLY|
312 WITH_PERMISSIONS|
313 WITH_SYMLINKS|
314 WITH_DEVICE_NODES|
315 WITH_FIFOS|
316 WITH_SOCKETS
317 },
318 }
319 }