Merge pull request #12439 from poettering/simplify-umask-util

simplify RUN_WITH_UMASK()
This commit is contained in:
Lennart Poettering 2019-04-30 11:36:55 +02:00 committed by GitHub
commit 8d76f2905d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 11 deletions

View file

@ -8,21 +8,19 @@
#include "macro.h"
static inline void umaskp(mode_t *u) {
umask(*u);
umask(*u & 0777);
}
#define _cleanup_umask_ _cleanup_(umaskp)
struct _umask_struct_ {
mode_t mask;
bool quit;
};
/* We make use of the fact here that the umask() concept is using only the lower 9 bits of mode_t, although
* mode_t has space for the file type in the bits further up. We simply OR in the file type mask S_IFMT to
* distinguish the first and the second iteration of the RUN_WITH_UMASK() loop, so that we can run the first
* one, and exit on the second. */
static inline void _reset_umask_(struct _umask_struct_ *s) {
umask(s->mask);
};
assert_cc((S_IFMT & 0777) == 0);
#define RUN_WITH_UMASK(mask) \
for (_cleanup_(_reset_umask_) struct _umask_struct_ _saved_umask_ = { umask(mask), false }; \
!_saved_umask_.quit ; \
_saved_umask_.quit = true)
for (_cleanup_umask_ mode_t _saved_umask_ = umask(mask) | S_IFMT; \
FLAGS_SET(_saved_umask_, S_IFMT); \
_saved_umask_ &= 0777)

View file

@ -269,6 +269,10 @@ tests += [
[],
[]],
[['src/test/test-umask-util.c'],
[],
[]],
[['src/test/test-proc-cmdline.c'],
[],
[]],

View file

@ -0,0 +1,41 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include "tests.h"
#include "umask-util.h"
int main(int argc, char *argv[]) {
size_t n;
mode_t u;
test_setup_logging(LOG_DEBUG);
u = umask(0111);
n = 0;
RUN_WITH_UMASK(0123) {
assert_se(umask(000) == 0123);
n++;
}
assert_se(n == 1);
assert_se(umask(u) == 0111);
RUN_WITH_UMASK(0135) {
assert_se(umask(000) == 0135);
n++;
}
assert_se(n == 2);
assert_se(umask(0111) == u);
RUN_WITH_UMASK(0315) {
assert_se(umask(000) == 0315);
n++;
break;
}
assert_se(n == 3);
assert_se(umask(u) == 0111);
return EXIT_SUCCESS;
}