Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list