]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
caps: add lxc_cap_is_set()
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 7 Jan 2017 11:40:37 +0000 (12:40 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sat, 7 Jan 2017 11:40:37 +0000 (12:40 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/caps.c
src/lxc/caps.h

index 9712e11d20a6d2c81ead691a085ad64dadbae82c..73b55161f37059ef37a3a4f8b933ade379a2fc3c 100644 (file)
  */
 
 #define _GNU_SOURCE
-#include <unistd.h>
+#include "config.h"
+
+#include <errno.h>
+#include <limits.h>
 #include <fcntl.h>
 #include <stdlib.h>
-#include <limits.h>
+#include <unistd.h>
 #include <sys/prctl.h>
-#include <errno.h>
 
-#include "config.h"
+#include "caps.h"
 #include "log.h"
 
 lxc_log_define(lxc_caps, lxc);
 
 #if HAVE_SYS_CAPABILITY_H
-#include <sys/capability.h>
 
 #ifndef PR_CAPBSET_READ
 #define PR_CAPBSET_READ 23
@@ -208,4 +209,27 @@ int lxc_caps_last_cap(void)
        return last_cap;
 }
 
+bool lxc_cap_is_set(cap_value_t cap, cap_flag_t flag)
+{
+       int ret;
+       cap_t caps;
+       cap_flag_value_t flagval;
+
+       caps = cap_get_proc();
+       if (!caps) {
+               ERROR("Failed to perform cap_get_proc(): %s.", strerror(errno));
+               return false;
+       }
+
+       ret = cap_get_flag(caps, cap, flag, &flagval);
+       if (ret < 0) {
+               ERROR("Failed to perform cap_get_flag(): %s.", strerror(errno));
+               cap_free(caps);
+               return false;
+       }
+
+       cap_free(caps);
+       return flagval == CAP_SET;
+}
+
 #endif
index f39fec65a30e0ff0479ad3e586528e9fff2a5821..390dbdd4c955c6762c22c46efbe2ccdd71938b6e 100644 (file)
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
+
 #include "config.h"
+#include <stdbool.h>
 
 #ifndef __LXC_CAPS_H
 #define __LXC_CAPS_H
 
 #if HAVE_SYS_CAPABILITY_H
+#include <sys/capability.h>
+
 extern int lxc_caps_down(void);
 extern int lxc_caps_up(void);
 extern int lxc_caps_init(void);
 
 extern int lxc_caps_last_cap(void);
+
+extern bool lxc_cap_is_set(cap_value_t cap, cap_flag_t flag);
 #else
 static inline int lxc_caps_down(void) {
        return 0;
@@ -45,6 +51,12 @@ static inline int lxc_caps_init(void) {
 static inline int lxc_caps_last_cap(void) {
        return 0;
 }
+
+typedef int cap_value_t;
+typedef int cap_flag_t;
+static inline bool lxc_cap_is_set(cap_value_t cap, cap_flag_t flag) {
+       return true;
+}
 #endif
 
 #define lxc_priv(__lxc_function)                       \