diff options
Diffstat (limited to 'src/lxc/caps.c')
-rw-r--r-- | src/lxc/caps.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lxc/caps.c b/src/lxc/caps.c index 1610002..10a0b4a 100644 --- a/src/lxc/caps.c +++ b/src/lxc/caps.c @@ -213,3 +213,42 @@ int lxc_caps_last_cap(void) return last_cap; } + +/* + * check if we have the caps needed to start a container. returns 1 on + * success, 0 on error. (I'd prefer this be a bool, but am afraid that + * might fail to build on some distros). + */ +int lxc_caps_check(void) +{ + uid_t uid = getuid(); + cap_t caps; + cap_flag_value_t value; + int i, ret; + + cap_value_t needed_caps[] = { CAP_SYS_ADMIN, CAP_NET_ADMIN, CAP_SETUID, CAP_SETGID }; + +#define NUMCAPS ((int) (sizeof(needed_caps) / sizeof(cap_t))) + + if (!uid) + return 1; + + caps = cap_get_proc(); + if (!caps) { + ERROR("failed to cap_get_proc: %m"); + return 0; + } + + for (i=0; i<NUMCAPS; i++) { + ret = cap_get_flag(caps, needed_caps[i], CAP_EFFECTIVE, &value); + if (ret) { + ERROR("Failed to cap_get_flag: %m"); + return 0; + } + if (!value) { + return 0; + } + } + + return 1; +} |