1 /* vi: set sw=4 ts=4: */
2 /*
3  * See README for additional information
4  *
5  * Licensed under GPLv2, see file LICENSE in this source tree.
6  */
7 
8 #include "libbb.h"
9 #include "e2fs_lib.h"
10 
11 /* Print file attributes on an ext2 file system */
12 const uint32_t e2attr_flags_value[] ALIGN4 = {
13 #ifdef ENABLE_COMPRESSION
14 	EXT2_COMPRBLK_FL,
15 	EXT2_DIRTY_FL,
16 	EXT2_NOCOMPR_FL,
17 #endif
18 	EXT2_SECRM_FL,
19 	EXT2_UNRM_FL,
20 	EXT2_SYNC_FL,
21 	EXT2_DIRSYNC_FL,
22 	EXT2_IMMUTABLE_FL,
23 	EXT2_APPEND_FL,
24 	EXT2_NODUMP_FL,
25 	EXT2_NOATIME_FL,
26 	EXT2_COMPR_FL,
27 	EXT2_ECOMPR_FL,
28 	EXT3_JOURNAL_DATA_FL,
29 	EXT2_INDEX_FL,
30 	EXT2_NOTAIL_FL,
31 	EXT2_TOPDIR_FL,
32 	EXT2_EXTENT_FL,
33 	EXT2_NOCOW_FL,
34 	EXT2_CASEFOLD_FL,
35 	EXT2_INLINE_DATA_FL,
36 	EXT2_PROJINHERIT_FL,
37 	EXT2_VERITY_FL,
38 };
39 
40 const char e2attr_flags_sname[] ALIGN1 =
41 #ifdef ENABLE_COMPRESSION
42 	"BZX"
43 #endif
44 	"suSDiadAcEjItTeCFNPV";
45 
46 static const char e2attr_flags_lname[] ALIGN1 =
47 #ifdef ENABLE_COMPRESSION
48 	"Compressed_File" "\0"
49 	"Compressed_Dirty_File" "\0"
50 	"Compression_Raw_Access" "\0"
51 #endif
52 	"Secure_Deletion" "\0"
53 	"Undelete" "\0"
54 	"Synchronous_Updates" "\0"
55 	"Synchronous_Directory_Updates" "\0"
56 	"Immutable" "\0"
57 	"Append_Only" "\0"
58 	"No_Dump" "\0"
59 	"No_Atime" "\0"
60 	"Compression_Requested" "\0"
61 	"Encrypted" "\0"
62 	"Journaled_Data" "\0"
63 	"Indexed_directory" "\0"
64 	"No_Tailmerging" "\0"
65 	"Top_of_Directory_Hierarchies" "\0"
66 	"Extents" "\0"
67 	"No_COW" "\0"
68 	"Casefold" "\0"
69 	"Inline_Data" "\0"
70 	"Project_Hierarchy" "\0"
71 	"Verity" "\0"
72 	/* Another trailing NUL is added by compiler */;
73 
print_e2flags_long(unsigned flags)74 void print_e2flags_long(unsigned flags)
75 {
76 	const uint32_t *fv;
77 	const char *fn;
78 	int first = 1;
79 
80 	fv = e2attr_flags_value;
81 	fn = e2attr_flags_lname;
82 	do {
83 		if (flags & *fv) {
84 			if (!first)
85 				fputs(", ", stdout);
86 			fputs(fn, stdout);
87 			first = 0;
88 		}
89 		fv++;
90 		fn += strlen(fn) + 1;
91 	} while (*fn);
92 	if (first)
93 		fputs("---", stdout);
94 }
95 
print_e2flags(unsigned flags)96 void print_e2flags(unsigned flags)
97 {
98 	const uint32_t *fv;
99 	const char *fn;
100 
101 	fv = e2attr_flags_value;
102 	fn = e2attr_flags_sname;
103 	do  {
104 		char c = '-';
105 		if (flags & *fv)
106 			c = *fn;
107 		putchar(c);
108 		fv++;
109 		fn++;
110 	} while (*fn);
111 }
112