Path: blob/main/contrib/capsicum-test/capsicum-rights.h
39475 views
#ifndef __CAPSICUM_RIGHTS_H__1#define __CAPSICUM_RIGHTS_H__23#ifdef __cplusplus4extern "C" {5#endif67#ifdef __FreeBSD__8#include <sys/param.h>9#if __FreeBSD_version >= 1100014 || \10(__FreeBSD_version >= 1001511 && __FreeBSD_version < 1100000)11#include <sys/capsicum.h>12#else13#include <sys/capability.h>14#endif15#endif1617#ifdef __linux__18#include <linux/capsicum.h>19#endif2021#ifdef __cplusplus22}23#endif2425#ifndef CAP_RIGHTS_VERSION26/************************************************************27* Capsicum compatibility layer: implement new (FreeBSD10.x)28* rights manipulation API in terms of original (FreeBSD9.x)29* functionality.30************************************************************/31#include <stdarg.h>32#include <stdbool.h>3334/* Rights manipulation macros/functions.35* Note that these use variadic macros, available in C99 / C++11 (and36* also in earlier gcc versions).37*/38#define cap_rights_init(rights, ...) _cap_rights_init((rights), __VA_ARGS__, 0ULL)39#define cap_rights_set(rights, ...) _cap_rights_set((rights), __VA_ARGS__, 0ULL)40#define cap_rights_clear(rights, ...) _cap_rights_clear((rights), __VA_ARGS__, 0ULL)41#define cap_rights_is_set(rights, ...) _cap_rights_is_set((rights), __VA_ARGS__, 0ULL)4243inline cap_rights_t* _cap_rights_init(cap_rights_t *rights, ...) {44va_list ap;45cap_rights_t right;46*rights = 0;47va_start(ap, rights);48while (true) {49right = va_arg(ap, cap_rights_t);50*rights |= right;51if (right == 0) break;52}53va_end(ap);54return rights;55}5657inline cap_rights_t* _cap_rights_set(cap_rights_t *rights, ...) {58va_list ap;59cap_rights_t right;60va_start(ap, rights);61while (true) {62right = va_arg(ap, cap_rights_t);63*rights |= right;64if (right == 0) break;65}66va_end(ap);67return rights;68}6970inline cap_rights_t* _cap_rights_clear(cap_rights_t *rights, ...) {71va_list ap;72cap_rights_t right;73va_start(ap, rights);74while (true) {75right = va_arg(ap, cap_rights_t);76*rights &= ~right;77if (right == 0) break;78}79va_end(ap);80return rights;81}8283inline bool _cap_rights_is_set(const cap_rights_t *rights, ...) {84va_list ap;85cap_rights_t right;86cap_rights_t accumulated = 0;87va_start(ap, rights);88while (true) {89right = va_arg(ap, cap_rights_t);90accumulated |= right;91if (right == 0) break;92}93va_end(ap);94return (accumulated & *rights) == accumulated;95}9697inline bool _cap_rights_is_valid(const cap_rights_t *rights) {98return true;99}100101inline cap_rights_t* cap_rights_merge(cap_rights_t *dst, const cap_rights_t *src) {102*dst |= *src;103return dst;104}105106inline cap_rights_t* cap_rights_remove(cap_rights_t *dst, const cap_rights_t *src) {107*dst &= ~(*src);108return dst;109}110111inline bool cap_rights_contains(const cap_rights_t *big, const cap_rights_t *little) {112return ((*big) & (*little)) == (*little);113}114115#endif /* old/new style rights manipulation */116117#endif /*__CAPSICUM_RIGHTS_H__*/118119120