aboutsummaryrefslogtreecommitdiff
path: root/e2fsprogs/e2fs_lib.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-06-20 10:57:24 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-06-20 11:02:49 +0200
commit526b8347906a18d756386092fafa0b42ba0b4563 (patch)
treeaafe396ff964a194f183bead405b5f1045f67a61 /e2fsprogs/e2fs_lib.c
parent9c291f2cc0e0e76869c315b5c7e7883827b5ae95 (diff)
downloadbusybox-w32-526b8347906a18d756386092fafa0b42ba0b4563.tar.gz
busybox-w32-526b8347906a18d756386092fafa0b42ba0b4563.tar.bz2
busybox-w32-526b8347906a18d756386092fafa0b42ba0b4563.zip
lsattr,chattr: support -p
function old new delta fgetsetprojid - 107 +107 list_attributes 169 222 +53 change_attributes 277 326 +49 chattr_main 272 307 +35 close_silently - 22 +22 .rodata 103378 103393 +15 packed_usage 33658 33666 +8 fgetsetversion 88 74 -14 fgetsetflags 162 148 -14 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 5/2 up/down: 289/-28) Total: 261 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'e2fsprogs/e2fs_lib.c')
-rw-r--r--e2fsprogs/e2fs_lib.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/e2fsprogs/e2fs_lib.c b/e2fsprogs/e2fs_lib.c
index 8bd4da622..bc9aa53e5 100644
--- a/e2fsprogs/e2fs_lib.c
+++ b/e2fsprogs/e2fs_lib.c
@@ -51,14 +51,14 @@ int fgetsetversion(const char *name, unsigned long *get_version, unsigned long s
51{ 51{
52#if HAVE_EXT2_IOCTLS 52#if HAVE_EXT2_IOCTLS
53 int fd, r; 53 int fd, r;
54 IF_LONG_IS_WIDER(int ver;) 54 IF_LONG_IS_WIDER(unsigned ver;)
55 55
56 fd = open(name, O_RDONLY | O_NONBLOCK); 56 fd = open(name, O_RDONLY | O_NONBLOCK);
57 if (fd == -1) 57 if (fd == -1)
58 return -1; 58 return -1;
59 if (!get_version) { 59 if (!get_version) {
60 IF_LONG_IS_WIDER( 60 IF_LONG_IS_WIDER(
61 ver = (int) set_version; 61 ver = (unsigned) set_version;
62 r = ioctl(fd, EXT2_IOC_SETVERSION, &ver); 62 r = ioctl(fd, EXT2_IOC_SETVERSION, &ver);
63 ) 63 )
64 IF_LONG_IS_SAME( 64 IF_LONG_IS_SAME(
@@ -81,6 +81,32 @@ int fgetsetversion(const char *name, unsigned long *get_version, unsigned long s
81#endif /* ! HAVE_EXT2_IOCTLS */ 81#endif /* ! HAVE_EXT2_IOCTLS */
82} 82}
83 83
84int fgetsetprojid(const char *name, uint32_t *get, uint32_t set)
85{
86#if HAVE_EXT2_IOCTLS
87 struct ext2_fsxattr fsxattr;
88 int fd, r;
89
90 fd = open(name, O_RDONLY | O_NONBLOCK);
91 if (fd == -1)
92 return -1;
93 r = ioctl(fd, EXT2_IOC_FSGETXATTR, &fsxattr);
94 /* note: ^^^ may fail in 32-bit userspace on 64-bit kernel (seen on 4.12.0) */
95 if (r == 0) {
96 if (get) {
97 *get = fsxattr.fsx_projid;
98 } else {
99 fsxattr.fsx_projid = set;
100 r = ioctl(fd, EXT2_IOC_FSSETXATTR, &fsxattr);
101 }
102 }
103 close_silently(fd);
104 return r;
105#else /* ! HAVE_EXT2_IOCTLS */
106 errno = EOPNOTSUPP;
107 return -1;
108#endif /* ! HAVE_EXT2_IOCTLS */
109}
84 110
85/* Get/set a file flags on an ext2 file system */ 111/* Get/set a file flags on an ext2 file system */
86int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_flags) 112int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_flags)
@@ -88,7 +114,7 @@ int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_f
88#if HAVE_EXT2_IOCTLS 114#if HAVE_EXT2_IOCTLS
89 struct stat buf; 115 struct stat buf;
90 int fd, r; 116 int fd, r;
91 IF_LONG_IS_WIDER(int f;) 117 IF_LONG_IS_WIDER(unsigned f;)
92 118
93 if (stat(name, &buf) == 0 /* stat is ok */ 119 if (stat(name, &buf) == 0 /* stat is ok */
94 && !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode) 120 && !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)
@@ -101,7 +127,7 @@ int fgetsetflags(const char *name, unsigned long *get_flags, unsigned long set_f
101 127
102 if (!get_flags) { 128 if (!get_flags) {
103 IF_LONG_IS_WIDER( 129 IF_LONG_IS_WIDER(
104 f = (int) set_flags; 130 f = (unsigned) set_flags;
105 r = ioctl(fd, EXT2_IOC_SETFLAGS, &f); 131 r = ioctl(fd, EXT2_IOC_SETFLAGS, &f);
106 ) 132 )
107 IF_LONG_IS_SAME( 133 IF_LONG_IS_SAME(