1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-16 18:50:18 +03:00

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 <izumi.taku@jp.fujitsu.com>
Signed-off-by: Shota Hirae <m11g1401@hibikino.ne.jp>
This commit is contained in:
Taku Izumi 2012-01-30 23:50:00 -05:00 committed by Laine Stump
parent 397e6a705b
commit 53bd0cebd3
2 changed files with 38 additions and 8 deletions

View File

@ -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 */
/**

View File

@ -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);