X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=ad548da82ab7663d0cda69b3e5d291c8acefb712;hb=093c2cfe3b1ae6081f12927ae7906d90d6623534;hp=5cbbe8fb7d2886ffbbe36fab7cde07aba50fbe2c;hpb=0daa5666da6fab8864e313dd594a2648d882e0cf;p=elogind.git diff --git a/src/shared/util.c b/src/shared/util.c index 5cbbe8fb7..ad548da82 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);