| @@ -141,59 +141,87 @@ int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_f |
| |
| |
| /* Print file attributes on an ext2 file system */ |
| - | struct flags_name { |
| - | unsigned long flag; |
| - | char short_name; |
| - | const char *long_name; |
| + | const uint32_t e2attr_flags_value[] = { |
| + | #ifdef ENABLE_COMPRESSION |
| + | EXT2_COMPRBLK_FL, |
| + | EXT2_DIRTY_FL, |
| + | EXT2_NOCOMPR_FL, |
| + | EXT2_ECOMPR_FL, |
| + | #endif |
| + | EXT2_INDEX_FL, |
| + | EXT2_SECRM_FL, |
| + | EXT2_UNRM_FL, |
| + | EXT2_SYNC_FL, |
| + | EXT2_DIRSYNC_FL, |
| + | EXT2_IMMUTABLE_FL, |
| + | EXT2_APPEND_FL, |
| + | EXT2_NODUMP_FL, |
| + | EXT2_NOATIME_FL, |
| + | EXT2_COMPR_FL, |
| + | EXT3_JOURNAL_DATA_FL, |
| + | EXT2_NOTAIL_FL, |
| + | EXT2_TOPDIR_FL |
| }; |
| |
| - | /* TODO: apart from I and (disabled) COMPRESSION flags, this |
| - | * is a duplicate of a table from chattr. Merge? */ |
| - | static const struct flags_name flags_array[] = { |
| - | { EXT2_SECRM_FL, 's', "Secure_Deletion" }, |
| - | { EXT2_UNRM_FL, 'u' , "Undelete" }, |
| - | { EXT2_SYNC_FL, 'S', "Synchronous_Updates" }, |
| - | { EXT2_DIRSYNC_FL, 'D', "Synchronous_Directory_Updates" }, |
| - | { EXT2_IMMUTABLE_FL, 'i', "Immutable" }, |
| - | { EXT2_APPEND_FL, 'a', "Append_Only" }, |
| - | { EXT2_NODUMP_FL, 'd', "No_Dump" }, |
| - | { EXT2_NOATIME_FL, 'A', "No_Atime" }, |
| - | { EXT2_COMPR_FL, 'c', "Compression_Requested" }, |
| + | const char e2attr_flags_sname[] = |
| #ifdef ENABLE_COMPRESSION |
| - | { EXT2_COMPRBLK_FL, 'B', "Compressed_File" }, |
| - | { EXT2_DIRTY_FL, 'Z', "Compressed_Dirty_File" }, |
| - | { EXT2_NOCOMPR_FL, 'X', "Compression_Raw_Access" }, |
| - | { EXT2_ECOMPR_FL, 'E', "Compression_Error" }, |
| + | "BZXE" |
| #endif |
| - | { EXT3_JOURNAL_DATA_FL, 'j', "Journaled_Data" }, |
| - | { EXT2_INDEX_FL, 'I', "Indexed_directory" }, |
| - | { EXT2_NOTAIL_FL, 't', "No_Tailmerging" }, |
| - | { EXT2_TOPDIR_FL, 'T', "Top_of_Directory_Hierarchies" }, |
| - | { 0, '\0', NULL } |
| - | }; |
| + | "I" |
| + | "suSDiadAcjtT"; |
| + | |
| + | static const char e2attr_flags_lname[] = |
| + | #ifdef ENABLE_COMPRESSION |
| + | "Compressed_File" "\0" |
| + | "Compressed_Dirty_File" "\0" |
| + | "Compression_Raw_Access" "\0" |
| + | "Compression_Error" "\0" |
| + | #endif |
| + | "Indexed_directory" "\0" |
| + | "Secure_Deletion" "\0" |
| + | "Undelete" "\0" |
| + | "Synchronous_Updates" "\0" |
| + | "Synchronous_Directory_Updates" "\0" |
| + | "Immutable" "\0" |
| + | "Append_Only" "\0" |
| + | "No_Dump" "\0" |
| + | "No_Atime" "\0" |
| + | "Compression_Requested" "\0" |
| + | "Journaled_Data" "\0" |
| + | "No_Tailmerging" "\0" |
| + | "Top_of_Directory_Hierarchies" "\0" |
| + | /* Another trailing NUL is added by compiler */; |
| |
| void print_flags(FILE *f, unsigned long flags, unsigned options) |
| { |
| - | const struct flags_name *fp; |
| + | const uint32_t *fv; |
| + | const char *fn; |
| |
| + | fv = e2attr_flags_value; |
| if (options & PFOPT_LONG) { |
| int first = 1; |
| - | for (fp = flags_array; fp->short_name; fp++) { |
| - | if (flags & fp->flag) { |
| + | fn = e2attr_flags_lname; |
| + | do { |
| + | if (flags & *fv) { |
| if (!first) |
| fputs(", ", f); |
| - | fputs(fp->long_name, f); |
| + | fputs(fn, f); |
| first = 0; |
| } |
| - | } |
| + | fv++; |
| + | fn += strlen(fn) + 1; |
| + | } while (*fn); |
| if (first) |
| fputs("---", f); |
| } else { |
| - | for (fp = flags_array; fp->short_name; fp++) { |
| + | fn = e2attr_flags_sname; |
| + | do { |
| char c = '-'; |
| - | if (flags & fp->flag) |
| - | c = fp->short_name; |
| + | if (flags & *fv) |
| + | c = *fn; |
| fputc(c, f); |
| - | } |
| + | fv++; |
| + | fn++; |
| + | } while (*fn); |
| } |
| } |