aboutsummaryrefslogtreecommitdiff
path: root/e2fsprogs/e2fs_lib.c
diff options
context:
space:
mode:
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(