2 ms·
Here's our usage: https://github.com/FRRouting/frr/blob/master/lib/privs.h#L141-L146 https://github.com/FRRouting/frr/blob/master/lib/privs.h#L14... #define
by eqvinox 7y ago
Here's our usage: https://github.com/FRRouting/frr/blob/master/lib/privs.h#L141-L146 https://github.com/FRRouting/frr/blob/master/lib/privs.h#L14...
#define frr_with_privs(privs) \
for (struct zebra_privs_t *_once = NULL, \
*_privs __attribute__( \
(unused, cleanup(_zprivs_lower))) = \
_zprivs_raise(privs, __func__); \
_once == NULL; _once = (void *)1)
This gives us a block construct that guarantees elevated privileges are dropped when the block is done:
frr_with_privs(privs) {
... whatever ...
break; /* exit block, drop privileges */
return; /* return, drop privileges */
}
- rwmj 7y agoWe have a nice macro for acquiring locks that only applies to the scope: https://github.com/libguestfs/nbdkit/blob/e58d28d65bfea3af3694502c4030838f3cf5d6e8/common/utils/cleanup.h#L44 https://github.com/libguestfs/nbdkit/blob/e58d28d65bfea3af36... You end up with code like this: https://github.com/libguestfs/nbdkit/blob/e58d28d65bfea3af3694502c4030838f3cf5d6e8/server/protocol.c#L369 https://github.com/libguestfs/nbdkit/blob/e58d28d65bfea3af36... It's so useful to be able to be sure the lock is released on all return paths. Also because it's scope-level you can scope your locks tightly to where they are needed.