Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
tools/virt-login-shell.c | 141 +++++++++++++----------------------------------
1 file changed, 38 insertions(+), 103 deletions(-)
diff --git a/tools/virt-login-shell.c b/tools/virt-login-shell.c
index e8474a4..632d493 100644
--- a/tools/virt-login-shell.c
+++ b/tools/virt-login-shell.c
@@ -50,46 +50,38 @@ static int virLoginShellAllowedUser(virConfPtr conf,
gid_t *groups,
size_t ngroups)
{
- virConfValuePtr p;
int ret = -1;
- char *ptr = NULL;
size_t i;
char *gname = NULL;
+ char **users = NULL, **entries;
- p = virConfGetValue(conf, "allowed_users");
- if (p && p->type == VIR_CONF_LIST) {
- virConfValuePtr pp;
+ if (virConfGetValueStringList(conf, "allowed_users", false, &users)
< 0)
+ goto cleanup;
- /* Calc length and check items */
- for (pp = p->list; pp; pp = pp->next) {
- if (pp->type != VIR_CONF_STRING) {
- virReportSystemError(EINVAL, "%s",
- _("allowed_users must be a list of
strings"));
- goto cleanup;
- } else {
- /*
- If string begins with a % this indicates a linux group.
- Check to see if the user is in the Linux Group.
- */
- if (pp->str[0] == '%') {
- ptr = &pp->str[1];
- if (!*ptr)
- continue;
- for (i = 0; i < ngroups; i++) {
- if (!(gname = virGetGroupName(groups[i])))
- continue;
- if (fnmatch(ptr, gname, 0) == 0) {
- ret = 0;
- goto cleanup;
- }
- VIR_FREE(gname);
- }
+
+ for (entries = users; *entries; entries++) {
+ char *entry = *entries;
+ /*
+ If string begins with a % this indicates a linux group.
+ Check to see if the user is in the Linux Group.
+ */
+ if (entry[0] == '%') {
+ entry++;
+ if (!*entry)
+ continue;
+ for (i = 0; i < ngroups; i++) {
+ if (!(gname = virGetGroupName(groups[i])))
continue;
- }
- if (fnmatch(pp->str, name, 0) == 0) {
+ if (fnmatch(entry, gname, 0) == 0) {
ret = 0;
goto cleanup;
}
+ VIR_FREE(gname);
+ }
+ } else {
+ if (fnmatch(entry, name, 0) == 0) {
+ ret = 0;
+ goto cleanup;
}
}
}
@@ -98,87 +90,30 @@ static int virLoginShellAllowedUser(virConfPtr conf,
name, conf_file);
cleanup:
VIR_FREE(gname);
+ virStringFreeList(users);
return ret;
}
-static int virLoginShellGetAutoShell(virConfPtr conf,
- bool *autoshell)
-{
- virConfValuePtr p;
-
- p = virConfGetValue(conf, "auto_shell");
- if (!p) {
- *autoshell = false;
- } else if (p->type == VIR_CONF_LONG ||
- p->type == VIR_CONF_ULONG) {
- *autoshell = (p->l != 0);
- } else {
- virReportSystemError(EINVAL, "%s",
- _("auto_shell must be a boolean value"));
- return -1;
- }
- return 0;
-}
static int virLoginShellGetShellArgv(virConfPtr conf,
- char ***retshargv,
- size_t *retshargvlen)
+ char ***shargv,
+ size_t *shargvlen)
{
- size_t i;
- size_t len;
- char **shargv = NULL;
- virConfValuePtr p, pp;
-
- p = virConfGetValue(conf, "shell");
- if (!p) {
- len = 1; /* /bin/sh */
- } else if (p->type == VIR_CONF_LIST) {
- /* Calc length and check items */
- for (len = 0, pp = p->list; pp; len++, pp = pp->next) {
- if (pp->type != VIR_CONF_STRING) {
- virReportSystemError(EINVAL, "%s",
- _("shell must be a list of strings"));
- goto error;
- }
- }
- } else if (p->type == VIR_CONF_STRING) {
- len = 1; /* /path/to/shell */
- } else {
- virReportSystemError(EINVAL, "%s",
- _("shell must be a list of strings"));
- goto error;
- }
-
- len++; /* NULL terminator */
-
- if (VIR_ALLOC_N(shargv, len) < 0)
- goto error;
+ if (virConfGetValueStringList(conf, "shell", true, shargv) < 0)
+ return -1;
- i = 0;
- if (!p) {
- if (VIR_STRDUP(shargv[i++], "/bin/sh") < 0)
- goto error;
- } else if (p->type == VIR_CONF_LIST) {
- for (pp = p->list; pp; pp = pp->next) {
- if (VIR_STRDUP(shargv[i++], pp->str) < 0)
- goto error;
+ if (!shargv) {
+ if (VIR_ALLOC_N(*shargv, 2) < 0)
+ return -1;
+ if (VIR_STRDUP((*shargv)[0], "/bin/sh") < 0) {
+ VIR_FREE(*shargv);
+ return -1;
}
- } else if (p->type == VIR_CONF_STRING) {
- if (VIR_STRDUP(shargv[i++], p->str) < 0)
- goto error;
+ *shargvlen = 1;
+ } else {
+ *shargvlen = virStringListLength((const char *const *)shargv);
}
-
- shargv[i] = NULL;
-
- *retshargvlen = i;
- *retshargv = shargv;
-
return 0;
- error:
- *retshargv = NULL;
- *retshargvlen = 0;
- virStringFreeList(shargv);
- return -1;
}
static char *progname;
@@ -313,7 +248,7 @@ main(int argc, char **argv)
if (virLoginShellGetShellArgv(conf, &shargv, &shargvlen) < 0)
goto cleanup;
- if (virLoginShellGetAutoShell(conf, &autoshell) < 0)
+ if (virConfGetValueBool(conf, "auto_shell", &autoshell) < 0)
goto cleanup;
conn = virConnectOpen("lxc:///");
--
2.7.4