From: Lennart Poettering Date: Tue, 30 Apr 2019 07:52:35 +0000 (+0200) Subject: umask-util: simplify RUN_WITH_UMASK() X-Git-Tag: v243-rc1~497^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=650c7a2e8bdd95e69bb2e4a69cf9ea43370aead5;p=thirdparty%2Fsystemd.git umask-util: simplify RUN_WITH_UMASK() Why have a struct to store the iteration bit if we actually have plenty place in mode_t? --- diff --git a/src/basic/umask-util.h b/src/basic/umask-util.h index e964292eaf4..cad745170eb 100644 --- a/src/basic/umask-util.h +++ b/src/basic/umask-util.h @@ -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)