diff options
Diffstat (limited to 'init/builtins.c')
-rw-r--r-- | init/builtins.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/init/builtins.c b/init/builtins.c index dc7900e..aaf85d9 100644 --- a/init/builtins.c +++ b/init/builtins.c @@ -35,8 +35,10 @@ #include <sys/system_properties.h> #include <fs_mgr.h> +#ifdef HAVE_SELINUX #include <selinux/selinux.h> #include <selinux/label.h> +#endif #include "init.h" #include "keywords.h" @@ -513,20 +515,24 @@ int do_mount_all(int nargs, char **args) } int do_setcon(int nargs, char **args) { +#ifdef HAVE_SELINUX if (is_selinux_enabled() <= 0) return 0; if (setcon(args[1]) < 0) { return -errno; } +#endif return 0; } int do_setenforce(int nargs, char **args) { +#ifdef HAVE_SELINUX if (is_selinux_enabled() <= 0) return 0; if (security_setenforce(atoi(args[1])) < 0) { return -errno; } +#endif return 0; } @@ -754,30 +760,36 @@ int do_restorecon(int nargs, char **args) { } int do_setsebool(int nargs, char **args) { - const char *name = args[1]; - const char *value = args[2]; - SELboolean b; - int ret; +#ifdef HAVE_SELINUX + SELboolean *b = alloca(nargs * sizeof(SELboolean)); + char *v; + int i; if (is_selinux_enabled() <= 0) return 0; - b.name = name; - if (!strcmp(value, "1") || !strcasecmp(value, "true") || !strcasecmp(value, "on")) - b.value = 1; - else if (!strcmp(value, "0") || !strcasecmp(value, "false") || !strcasecmp(value, "off")) - b.value = 0; - else { - ERROR("setsebool: invalid value %s\n", value); - return -EINVAL; - } - - if (security_set_boolean_list(1, &b, 0) < 0) { - ret = -errno; - ERROR("setsebool: could not set %s to %s\n", name, value); - return ret; + for (i = 1; i < nargs; i++) { + char *name = args[i]; + v = strchr(name, '='); + if (!v) { + ERROR("setsebool: argument %s had no =\n", name); + return -EINVAL; + } + *v++ = 0; + b[i-1].name = name; + if (!strcmp(v, "1") || !strcasecmp(v, "true") || !strcasecmp(v, "on")) + b[i-1].value = 1; + else if (!strcmp(v, "0") || !strcasecmp(v, "false") || !strcasecmp(v, "off")) + b[i-1].value = 0; + else { + ERROR("setsebool: invalid value %s\n", v); + return -EINVAL; + } } + if (security_set_boolean_list(nargs - 1, b, 0) < 0) + return -errno; +#endif return 0; } |