diff options
Diffstat (limited to 'misc/chattr.c')
| -rw-r--r-- | misc/chattr.c | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/misc/chattr.c b/misc/chattr.c index 3d67519d..de33b083 100644 --- a/misc/chattr.c +++ b/misc/chattr.c @@ -82,7 +82,7 @@ static unsigned long sf; static void usage(void) { fprintf(stderr, - _("Usage: %s [-RVf] [-+=AacDdijsSu] [-v version] files...\n"), + _("Usage: %s [-RVf] [-+=AacDdeijsSu] [-v version] files...\n"), program_name); exit(1); } @@ -99,6 +99,7 @@ static const struct flags_char flags_array[] = { { EXT2_APPEND_FL, 'a' }, { EXT2_COMPR_FL, 'c' }, { EXT2_NODUMP_FL, 'd' }, + { EXT4_EXTENTS_FL, 'e'}, { EXT2_IMMUTABLE_FL, 'i' }, { EXT3_JOURNAL_DATA_FL, 'j' }, { EXT2_SECRM_FL, 's' }, @@ -191,6 +192,7 @@ static int change_attributes(const char * name) { unsigned long flags; STRUCT_STAT st; + int extent_file = 0; if (LSTAT (name, &st) == -1) { if (!silent) @@ -199,7 +201,22 @@ static int change_attributes(const char * name) return -1; } + if (fgetflags(name, &flags) == -1) { + if (!silent) + com_err(program_name, errno, + _("while reading flags on %s"), name); + return -1; + } + if (flags & EXT4_EXTENTS_FL) + extent_file = 1; if (set) { + if (extent_file && !(sf & EXT4_EXTENTS_FL)) { + if (!silent) + com_err(program_name, 0, + _("Clearing extent flag not supported on %s"), + name); + return -1; + } if (verbose) { printf (_("Flags of %s set as "), name); print_flags (stdout, sf, 0); @@ -208,30 +225,31 @@ static int change_attributes(const char * name) if (fsetflags (name, sf) == -1) perror (name); } else { - if (fgetflags (name, &flags) == -1) { + if (rem) + flags &= ~rf; + if (add) + flags |= af; + if (extent_file && !(flags & EXT4_EXTENTS_FL)) { if (!silent) - com_err (program_name, errno, - _("while reading flags on %s"), name); + com_err(program_name, 0, + _("Clearing extent flag not supported on %s"), + name); return -1; - } else { - if (rem) - flags &= ~rf; - if (add) - flags |= af; - if (verbose) { - printf (_("Flags of %s set as "), name); - print_flags (stdout, flags, 0); - printf ("\n"); - } - if (!S_ISDIR(st.st_mode)) - flags &= ~EXT2_DIRSYNC_FL; - if (fsetflags (name, flags) == -1) { - if (!silent) - com_err(program_name, errno, + } + if (verbose) { + printf(_("Flags of %s set as "), name); + print_flags(stdout, flags, 0); + printf("\n"); + } + if (!S_ISDIR(st.st_mode)) + flags &= ~EXT2_DIRSYNC_FL; + if (fsetflags(name, flags) == -1) { + if (!silent) { + com_err(program_name, errno, _("while setting flags on %s"), name); - return -1; } + return -1; } } if (set_version) { |
