/* vi: set sw=4 ts=4: */ /* * See README for additional information * * Licensed under GPLv2, see file LICENSE in this source tree. */ #include "libbb.h" #include "e2fs_lib.h" #if ENABLE_PLATFORM_MINGW32 /* Only certain attributes can be set using SetFileAttributes() */ #define CHATTR_MASK (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \ FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE | \ FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | \ FILE_ATTRIBUTE_OFFLINE) /* Get/set file attributes on a Windows file system */ int fgetsetflags(const char *name, unsigned *get_flags, unsigned set_flags) { struct stat buf; if (stat(name, &buf) == 0 /* stat is ok */ && !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode) ) { errno = EOPNOTSUPP; return -1; } if (get_flags) { *get_flags = (unsigned long)buf.st_attr; } else if (!SetFileAttributes(name, set_flags & CHATTR_MASK)) { errno = err_win_to_posix(); return -1; } return 0; } #endif #if !ENABLE_PLATFORM_MINGW32 /* Print file attributes on an ext2 file system */ const uint32_t e2attr_flags_value[] ALIGN4 = { #ifdef ENABLE_COMPRESSION EXT2_COMPRBLK_FL, EXT2_DIRTY_FL, EXT2_NOCOMPR_FL, #endif 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, EXT2_ECOMPR_FL, EXT3_JOURNAL_DATA_FL, EXT2_INDEX_FL, EXT2_NOTAIL_FL, EXT2_TOPDIR_FL, EXT2_EXTENT_FL, EXT2_NOCOW_FL, EXT2_CASEFOLD_FL, EXT2_INLINE_DATA_FL, EXT2_PROJINHERIT_FL, EXT2_VERITY_FL, }; const char e2attr_flags_sname[] ALIGN1 = #ifdef ENABLE_COMPRESSION "BZX" #endif "suSDiadAcEjItTeCFNPV"; static const char e2attr_flags_lname[] ALIGN1 = #ifdef ENABLE_COMPRESSION "Compressed_File" "\0" "Compressed_Dirty_File" "\0" "Compression_Raw_Access" "\0" #endif "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" "Encrypted" "\0" "Journaled_Data" "\0" "Indexed_directory" "\0" "No_Tailmerging" "\0" "Top_of_Directory_Hierarchies" "\0" "Extents" "\0" "No_COW" "\0" "Casefold" "\0" "Inline_Data" "\0" "Project_Hierarchy" "\0" "Verity" "\0" /* Another trailing NUL is added by compiler */; #else /* ENABLE_PLATFORM_MINGW32 */ /* Print file attributes on a Windows file system */ const uint32_t e2attr_flags_value[] = { FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_COMPRESSED, FILE_ATTRIBUTE_SPARSE_FILE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_TEMPORARY, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, }; const char e2attr_flags_sname[] ALIGN1 = "roecSrhsatn"; static const char e2attr_flags_lname[] ALIGN1 = "Reparse" "\0" "Offline" "\0" "Encrypted" "\0" "Compressed" "\0" "Sparse" "\0" "Readonly" "\0" "Hidden" "\0" "System" "\0" "Archive" "\0" "Temporary" "\0" "Notindexed" "\0" /* Another trailing NUL is added by compiler */; #endif void print_e2flags_long(unsigned flags) { const uint32_t *fv; const char *fn; int first = 1; fv = e2attr_flags_value; fn = e2attr_flags_lname; do { if (flags & *fv) { if (!first) fputs(", ", stdout); fputs(fn, stdout); first = 0; } fv++; fn += strlen(fn) + 1; } while (*fn); if (first) fputs("---", stdout); } void print_e2flags(unsigned flags) { const uint32_t *fv; const char *fn; fv = e2attr_flags_value; fn = e2attr_flags_sname; do { char c = '-'; if (flags & *fv) c = *fn; putchar(c); fv++; fn++; } while (*fn); }