diff options
author | Goffredo Baroncelli <kreijack@inwind.it> | 2015-03-16 20:33:49 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2015-03-19 22:20:12 -0400 |
commit | 5b9fbd354eddd80051de3cd17510d6be60274931 (patch) | |
tree | c5f54884acbd308f9cbce1e19fc6896696d1adb4 /src | |
parent | 0ea37920e7ff6c548dd3388ec4a63b4d130674b4 (diff) |
Add change_attr_fd()
Add change_attr_fd() function to modify the file/directory attribute.
Diffstat (limited to 'src')
-rw-r--r-- | src/shared/util.c | 22 | ||||
-rw-r--r-- | src/shared/util.h | 1 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index 5cbbe8fb7d..ad548da82a 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -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); diff --git a/src/shared/util.h b/src/shared/util.h index d229e1e68c..29e85bb7e1 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -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); |