Z, and explain that chattr can't set or set these flags.
(Addresses Debian Bug #151990)
fsetflags.c (fsetflags), fgetflags.c (fgetflags.c), setflags.c
(setflags), getflags.c (getflags): Check to make sure the
file is a regular file or a directory before attempting to
use the ext2 ioctls. Otherwise, return EOPNOTSUPP.
(Addresses Debian Bug #152029).
+2002-08-17 Theodore Ts'o <tytso@mit.edu>
+
+ * fsetflags.c (fsetflags), fgetflags.c (fgetflags.c), setflags.c
+ (setflags), getflags.c (getflags): Check to make sure the
+ file is a regular file or a directory before attempting to
+ use the ext2 ioctls. Otherwise, return EOPNOTSUPP.
+ (Addresses Debian Bug #152029).
+
2002-07-14 Theodore Ts'o <tytso@mit.edu>
* fsetflags.c (fsetflags), fgetflags.c (fgetflags,
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#if HAVE_STAT_FLAGS
+#include <sys/types.h>
#include <sys/stat.h>
-#else
+#if HAVE_EXT2_IOCTLS
#include <fcntl.h>
#include <sys/ioctl.h>
#endif
int fgetflags (const char * name, unsigned long * flags)
{
-#if HAVE_STAT_FLAGS
struct stat buf;
+#if HAVE_STAT_FLAGS
if (stat (name, &buf) == -1)
return -1;
#if HAVE_EXT2_IOCTLS
int fd, r, f, save_errno = 0;
+ if (!stat(name, &buf) &&
+ !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+ close(fd);
+ goto notsupp;
+ }
fd = open (name, OPEN_FLAGS);
if (fd == -1)
return -1;
if (save_errno)
errno = save_errno;
return r;
-#else /* ! HAVE_EXT2_IOCTLS */
- extern int errno;
+#endif /* HAVE_EXT2_IOCTLS */
+#endif
+notsupp:
errno = EOPNOTSUPP;
return -1;
-#endif /* ! HAVE_EXT2_IOCTLS */
-#endif
}
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#if HAVE_CHFLAGS
-#include <sys/stat.h> /* For the flag values. */
-#else
+#include <sys/types.h>
+#include <sys/stat.h>
+#if HAVE_EXT2_IOCTLS
#include <fcntl.h>
#include <sys/ioctl.h>
#endif
int fsetflags (const char * name, unsigned long flags)
{
+ struct stat buf;
#if HAVE_CHFLAGS
unsigned long bsd_flags = 0;
#if HAVE_EXT2_IOCTLS
int fd, r, f, save_errno = 0;
+ if (!stat(name, &buf) &&
+ !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+ close(fd);
+ goto notsupp;
+ }
fd = open (name, OPEN_FLAGS);
if (fd == -1)
return -1;
if (save_errno)
errno = save_errno;
return r;
-#else /* ! HAVE_EXT2_IOCTLS */
- extern int errno;
+#endif /* HAVE_EXT2_IOCTLS */
+#endif
+notsupp:
errno = EOPNOTSUPP;
return -1;
-#endif /* ! HAVE_EXT2_IOCTLS */
-#endif
}
#if HAVE_ERRNO_H
#include <errno.h>
#endif
-#if HAVE_STAT_FLAGS
+#include <sys/types.h>
#include <sys/stat.h>
-#else
+#if HAVE_EXT2_IOCTLS
#include <sys/ioctl.h>
#endif
int getflags (int fd, unsigned long * flags)
{
-#if HAVE_STAT_FLAGS
struct stat buf;
+#if HAVE_STAT_FLAGS
if (fstat (fd, &buf) == -1)
return -1;
#if HAVE_EXT2_IOCTLS
int r, f;
+ if (!fstat(fd, &buf) &&
+ !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode))
+ goto notsupp;
r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);
*flags = f;
return r;
-#else /* ! HAVE_EXT2_IOCTLS */
- extern int errno;
+#endif /* HAVE_EXT2_IOCTLS */
+#endif
+notsupp:
errno = EOPNOTSUPP;
return -1;
-#endif /* ! HAVE_EXT2_IOCTLS */
-#endif
}
#if HAVE_ERRNO_H
#include <errno.h>
#endif
-#if HAVE_CHFLAGS
#include <sys/types.h>
-#include <sys/stat.h> /* For the flag values. */
-#else
+#include <sys/stat.h>
+#if HAVE_EXT2_IOCTLS
#include <sys/ioctl.h>
#endif
int setflags (int fd, unsigned long flags)
{
+ struct stat buf;
#if HAVE_CHFLAGS
unsigned long bsd_flags = 0;
#if HAVE_EXT2_IOCTLS
int f;
+ if (!fstat(fd, &buf) &&
+ !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
f = (int) flags;
return ioctl (fd, EXT2_IOC_SETFLAGS, &f);
-#else /* ! HAVE_EXT2_IOCTLS */
- extern int errno;
+#endif /* HAVE_EXT2_IOCTLS */
+#endif
errno = EOPNOTSUPP;
return -1;
-#endif /* ! HAVE_EXT2_IOCTLS */
-#endif
}
2002-08-17 Theodore Ts'o <tytso@mit.edu>
+ * chattr.1.in: Document the compression attribute flags E, X, and
+ Z, and explain that chattr can't set or set these flags.
+ (Addresses Debian Bug #151990)
+
* fsck.8.in: Fix typo in man page, and clarified text regarding
options specifiers for -t option. (Addresses Debian bug
#145044)
by the kernel. A read from this file returns uncompressed data. A write to
this file compresses data before storing them on the disk.
.PP
+When a directory with the `D' attribute set is modified,
+the changes are written synchronously on the disk; this is equivalent to
+the `dirsync' mount option applied to a subset of the files.
+.PP
A file with the `d' attribute set is not candidate for backup when the
.BR dump (8)
program is run.
.PP
+The 'E' attribute is used by the experimental compression patches to
+indicate that a compressed file has a compression error. It may not be
+set or reset using
+.BR chattr (1),
+although it can be displayed by
+.BR lsattr (1).
+.PP
A file with the `i' attribute cannot be modified: it cannot be deleted or
renamed, no link can be created to this file and no data can be written
to the file. Only the superuser can set or clear this attribute.
the changes are written synchronously on the disk; this is equivalent to
the `sync' mount option applied to a subset of the files.
.PP
-When a directory with the `D' attribute set is modified,
-the changes are written synchronously on the disk; this is equivalent to
-the `dirsync' mount option applied to a subset of the files.
-.PP
A file with the 't' attribute will not have a partial block fragment at
the of the file merged with other files (for those filesystems which
support tail-merging). This is necessary for applications such as LILO
When a file with the `u' attribute set is deleted, its contents are saved.
This allows the user to ask for its undeletion.
.PP
+The 'X' attribute is used by the experimental compression patches to
+indicate that a raw contents of a compressed file can be accessed
+directly. It currently may not be set or reset using
+.BR chattr (1),
+although it can be displayed by
+.BR lsattr (1).
+.PP
+The 'Z' attribute is used by the experimental compression patches to
+indicate a compressed file is dirty. It may not be set or reset using
+.BR chattr (1),
+although it can be displayed by
+.BR lsattr (1).
+.PP
.SH AUTHOR
.B chattr
was written by Remy Card <Remy.Card@linux.org>.