]>
Commit | Line | Data |
---|---|---|
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 | |
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; | |
47651f95 CE |
70 | /// Exclude submounts |
71 | pub const EXCLUDE_SUBMOUNTS: u64 = 0x4000000000000000; | |
72 | /// Exclude entries with chattr flag NODUMP | |
73 | pub 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 | |
79 | pub 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 | |
92 | pub 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 | |
98 | pub 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 | |
112 | pub 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 | |
141 | const FS_APPEND_FL: u32 = 0x00000020; | |
142 | const FS_NOATIME_FL: u32 = 0x00000080; | |
143 | const FS_COMPR_FL: u32 = 0x00000004; | |
144 | const FS_NOCOW_FL: u32 = 0x00800000; | |
145 | const FS_NODUMP_FL: u32 = 0x00000040; | |
146 | const FS_DIRSYNC_FL: u32 = 0x00010000; | |
147 | const FS_IMMUTABLE_FL: u32 = 0x00000010; | |
148 | const FS_SYNC_FL: u32 = 0x00000008; | |
149 | const FS_NOCOMP_FL: u32 = 0x00000400; | |
150 | const FS_PROJINHERIT_FL: u32 = 0x20000000; | |
151 | ||
152 | static 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 | ||
165 | pub 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 | |
177 | const ATTR_HIDDEN: u32 = 2; | |
178 | const ATTR_SYS: u32 = 4; | |
179 | const ATTR_ARCH: u32 = 32; | |
180 | ||
181 | static 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 | ||
187 | pub 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. | |
200 | pub 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 | } |