18290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <unistd.h>
28290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <stdlib.h>
38290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <stdio.h>
48290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <string.h>
58290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <sys/stat.h>
68290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <fcntl.h>
78290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <errno.h>
88290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <selinux/selinux.h>
98290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#include <errno.h>
108290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
118290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalleystatic int do_setsebool(int nargs, char **args) {
128290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    SELboolean *b = alloca(nargs * sizeof(SELboolean));
138290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    char *v;
148290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    int i;
158290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
168290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    if (is_selinux_enabled() <= 0)
178290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        return 0;
188290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
198290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    for (i = 1; i < nargs; i++) {
208290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        char *name = args[i];
218290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        v = strchr(name, '=');
228290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        if (!v) {
238290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley            fprintf(stderr, "setsebool: argument %s had no =\n", name);
248290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley            return -1;
258290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        }
268290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        *v++ = 0;
278290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        b[i-1].name = name;
288290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        if (!strcmp(v, "1") || !strcasecmp(v, "true") || !strcasecmp(v, "on"))
298290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley            b[i-1].value = 1;
308290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        else if (!strcmp(v, "0") || !strcasecmp(v, "false") || !strcasecmp(v, "off"))
318290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley            b[i-1].value = 0;
328290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        else {
338290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley            fprintf(stderr, "setsebool: invalid value %s\n", v);
348290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley            return -1;
358290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        }
368290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    }
378290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
388290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    if (security_set_boolean_list(nargs - 1, b, 0) < 0)
398290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    {
408290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        fprintf(stderr, "setsebool: unable to set booleans: %s", strerror(errno));
418290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        return -1;
428290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    }
438290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
448290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    return 0;
458290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley}
468290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
478290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalleyint setsebool_main(int argc, char **argv)
488290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley{
498290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    if (argc < 2) {
508290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        fprintf(stderr, "Usage:  %s name=value...\n", argv[0]);
518290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley        exit(1);
528290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    }
538290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley
548290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley    return do_setsebool(argc, argv);
558290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley}
56