From: Taku Izumi Date: Tue, 31 Jan 2012 04:50:00 +0000 (-0500) Subject: util: add functions to keep capabilities X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=53bd0cebd395ee08e8b45dd00677afe974310e67;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git util: add functions to keep capabilities This patch introduces virSetCapabilities() function and implements virCommandAllowCap() function. Existing virClearCapabilities() is function to clear all capabilities. Instead virSetCapabilities() is function to set arbitrary capabilities. Signed-off-by: Taku Izumi Signed-off-by: Shota Hirae --- diff --git a/src/util/command.c b/src/util/command.c index dc3cfc543..6b43584d4 100644 --- a/src/util/command.c +++ b/src/util/command.c @@ -103,6 +103,8 @@ struct _virCommand { pid_t pid; char *pidfile; bool reap; + + unsigned long long capabilities; }; /* @@ -168,6 +170,7 @@ virCommandFDSet(int fd, #ifndef WIN32 # if HAVE_CAPNG +static int virClearCapabilities(void) ATTRIBUTE_UNUSED; static int virClearCapabilities(void) { int ret; @@ -182,6 +185,33 @@ static int virClearCapabilities(void) return 0; } + +/** + * virSetCapabilities: + * @capabilities - capability flag to set. + * In case of 0, this function is identical to + * virClearCapabilities() + * + */ +static int virSetCapabilities(unsigned long long capabilities) +{ + int ret, i; + + capng_clear(CAPNG_SELECT_BOTH); + + for (i = 0; i <= CAP_LAST_CAP; i++) { + if (capabilities & (1ULL << i)) + capng_update(CAPNG_ADD, CAPNG_BOUNDING_SET, i); + } + + if ((ret = capng_apply(CAPNG_SELECT_BOTH)) < 0) { + virCommandError(VIR_ERR_INTERNAL_ERROR, + _("cannot apply process capabilities %d"), ret); + return -1; + } + + return 0; +} # else static int virClearCapabilities(void) { @@ -189,6 +219,11 @@ static int virClearCapabilities(void) // "capabilities"); return 0; } + +static int virSetCapabilities(unsigned long long capabilities) +{ + return 0; +} # endif /** @@ -883,26 +918,23 @@ virCommandClearCaps(virCommandPtr cmd) cmd->flags |= VIR_EXEC_CLEAR_CAPS; } -#if 0 /* XXX Enable if we have a need for capability management. */ - /** * virCommandAllowCap: * @cmd: the command to modify * @capability: what to allow * - * Re-allow a specific capability + * Allow specific capabilities */ void virCommandAllowCap(virCommandPtr cmd, - int capability ATTRIBUTE_UNUSED) + int capability) { if (!cmd || cmd->has_error) return; - /* XXX ? */ + cmd->capabilities |= (1ULL << capability); } -#endif /* 0 */ /** diff --git a/src/util/command.h b/src/util/command.h index 1386d57ad..07aa0b32e 100644 --- a/src/util/command.h +++ b/src/util/command.h @@ -60,10 +60,8 @@ void virCommandSetPidFile(virCommandPtr cmd, void virCommandClearCaps(virCommandPtr cmd); -# if 0 void virCommandAllowCap(virCommandPtr cmd, int capability); -# endif void virCommandDaemonize(virCommandPtr cmd);