blob: 2c56a05fc2d089473fe8495277599c8649c20ecd [file] [log] [blame]
Denis Vlasenkod46d3c22007-02-06 19:28:50 +00001/*
2 * getsebool
3 *
4 * Based on libselinux 1.33.1
5 * Port to BusyBox Hiroshi Shinji <shiroshi@my.email.ne.jp>
6 *
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +02007 * Licensed under GPLv2, see file LICENSE in this source tree.
Denis Vlasenkod46d3c22007-02-06 19:28:50 +00008 */
Denys Vlasenkoa8e52da2016-11-23 18:46:40 +01009//config:config GETSEBOOL
Denys Vlasenkoae178ce2017-07-19 14:32:54 +020010//config: bool "getsebool (5.5 kb)"
Denys Vlasenkoa8e52da2016-11-23 18:46:40 +010011//config: default n
12//config: depends on SELINUX
13//config: help
14//config: Enable support to get SELinux boolean values.
15
16//applet:IF_GETSEBOOL(APPLET(getsebool, BB_DIR_USR_SBIN, BB_SUID_DROP))
17
18//kbuild:lib-$(CONFIG_GETSEBOOL) += getsebool.o
Denis Vlasenkod46d3c22007-02-06 19:28:50 +000019
Pere Orga5bc8c002011-04-11 03:29:49 +020020//usage:#define getsebool_trivial_usage
21//usage: "-a or getsebool boolean..."
22//usage:#define getsebool_full_usage "\n\n"
23//usage: " -a Show all selinux booleans"
24
Denis Vlasenkob6adbf12007-05-26 19:00:18 +000025#include "libbb.h"
Denis Vlasenkod46d3c22007-02-06 19:28:50 +000026
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +000027int getsebool_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Denis Vlasenkod46d3c22007-02-06 19:28:50 +000028int getsebool_main(int argc, char **argv)
29{
30 int i, rc = 0, active, pending, len = 0;
31 char **names;
32 unsigned opt;
33
34 selinux_or_die();
Denis Vlasenkofe7cd642007-08-18 15:32:12 +000035 opt = getopt32(argv, "a");
Denis Vlasenkod46d3c22007-02-06 19:28:50 +000036
37 if (opt) { /* -a */
38 if (argc > 2)
39 bb_show_usage();
40
41 rc = security_get_boolean_names(&names, &len);
42 if (rc)
Denys Vlasenko6331cf02009-11-13 09:08:27 +010043 bb_perror_msg_and_die("can't get boolean names");
Denis Vlasenkod46d3c22007-02-06 19:28:50 +000044
45 if (!len) {
46 puts("No booleans");
47 return 0;
48 }
49 }
50
51 if (!len) {
52 if (argc < 2)
53 bb_show_usage();
54 len = argc - 1;
55 names = xmalloc(sizeof(char *) * len);
56 for (i = 0; i < len; i++)
57 names[i] = xstrdup(argv[i + 1]);
58 }
59
60 for (i = 0; i < len; i++) {
61 active = security_get_boolean_active(names[i]);
62 if (active < 0) {
63 bb_error_msg_and_die("error getting active value for %s", names[i]);
64 }
65 pending = security_get_boolean_pending(names[i]);
66 if (pending < 0) {
67 bb_error_msg_and_die("error getting pending value for %s", names[i]);
68 }
69 printf("%s --> %s", names[i], (active ? "on" : "off"));
70 if (pending != active)
71 printf(" pending: %s", (pending ? "on" : "off"));
Denis Vlasenko4daad902007-09-27 10:20:47 +000072 bb_putchar('\n');
Denis Vlasenkod46d3c22007-02-06 19:28:50 +000073 }
74
75 if (ENABLE_FEATURE_CLEAN_UP) {
76 for (i = 0; i < len; i++)
77 free(names[i]);
78 free(names);
79 }
80
81 return rc;
82}