chiark / gitweb /
Add change_attr_fd()
authorGoffredo Baroncelli <kreijack@inwind.it>
Mon, 16 Mar 2015 19:33:49 +0000 (20:33 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 20 Mar 2015 02:20:12 +0000 (22:20 -0400)
Add change_attr_fd() function to modify the file/directory attribute.

src/shared/util.c
src/shared/util.h

index 5cbbe8fb7d2886ffbbe36fab7cde07aba50fbe2c..ad548da82ab7663d0cda69b3e5d291c8acefb712 100644 (file)
@@ -7843,6 +7843,28 @@ int chattr_path(const char *p, bool b, unsigned mask) {
         return chattr_fd(fd, b, mask);
 }
 
+int change_attr_fd(int fd, unsigned value, unsigned mask) {
+        unsigned old_attr, new_attr;
+
+        assert(fd >= 0);
+
+        if (mask == 0)
+                return 0;
+
+        if (ioctl(fd, FS_IOC_GETFLAGS, &old_attr) < 0)
+                return -errno;
+
+        new_attr = (old_attr & ~mask) |(value & mask);
+
+        if (new_attr == old_attr)
+                return 0;
+
+        if (ioctl(fd, FS_IOC_SETFLAGS, &new_attr) < 0)
+                return -errno;
+
+        return 0;
+}
+
 int read_attr_fd(int fd, unsigned *ret) {
         assert(fd >= 0);
 
index d229e1e68c95ac447462255fdf7907900f8b9482..29e85bb7e14fb7a2dcb56d520b2173fedcd8764a 100644 (file)
@@ -1053,6 +1053,7 @@ int same_fd(int a, int b);
 
 int chattr_fd(int fd, bool b, unsigned mask);
 int chattr_path(const char *p, bool b, unsigned mask);
+int change_attr_fd(int fd, unsigned value, unsigned mask);
 
 int read_attr_fd(int fd, unsigned *ret);
 int read_attr_path(const char *p, unsigned *ret);