xref: /aosp_15_r20/external/selinux/libselinux/utils/getsebool.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker #include <unistd.h>
2*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
3*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
4*2d543d20SAndroid Build Coastguard Worker #include <getopt.h>
5*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
6*2d543d20SAndroid Build Coastguard Worker #include <string.h>
7*2d543d20SAndroid Build Coastguard Worker #include <selinux/selinux.h>
8*2d543d20SAndroid Build Coastguard Worker 
usage(const char * progname)9*2d543d20SAndroid Build Coastguard Worker static __attribute__ ((__noreturn__)) void usage(const char *progname)
10*2d543d20SAndroid Build Coastguard Worker {
11*2d543d20SAndroid Build Coastguard Worker 	fprintf(stderr, "usage:  %s -a or %s boolean...\n", progname, progname);
12*2d543d20SAndroid Build Coastguard Worker 	exit(1);
13*2d543d20SAndroid Build Coastguard Worker }
14*2d543d20SAndroid Build Coastguard Worker 
main(int argc,char ** argv)15*2d543d20SAndroid Build Coastguard Worker int main(int argc, char **argv)
16*2d543d20SAndroid Build Coastguard Worker {
17*2d543d20SAndroid Build Coastguard Worker 	int i, get_all = 0, rc = 0, active, pending, len = 0, opt;
18*2d543d20SAndroid Build Coastguard Worker 	char **names = NULL;
19*2d543d20SAndroid Build Coastguard Worker 
20*2d543d20SAndroid Build Coastguard Worker 	while ((opt = getopt(argc, argv, "a")) > 0) {
21*2d543d20SAndroid Build Coastguard Worker 		switch (opt) {
22*2d543d20SAndroid Build Coastguard Worker 		case 'a':
23*2d543d20SAndroid Build Coastguard Worker 			if (argc > 2)
24*2d543d20SAndroid Build Coastguard Worker 				usage(argv[0]);
25*2d543d20SAndroid Build Coastguard Worker 			if (is_selinux_enabled() <= 0) {
26*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  SELinux is disabled\n",
27*2d543d20SAndroid Build Coastguard Worker 					argv[0]);
28*2d543d20SAndroid Build Coastguard Worker 				return 1;
29*2d543d20SAndroid Build Coastguard Worker 			}
30*2d543d20SAndroid Build Coastguard Worker 			errno = 0;
31*2d543d20SAndroid Build Coastguard Worker 			rc = security_get_boolean_names(&names, &len);
32*2d543d20SAndroid Build Coastguard Worker 			if (rc) {
33*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
34*2d543d20SAndroid Build Coastguard Worker 					"%s:  Unable to get boolean names:  %s\n",
35*2d543d20SAndroid Build Coastguard Worker 					argv[0], strerror(errno));
36*2d543d20SAndroid Build Coastguard Worker 				return 1;
37*2d543d20SAndroid Build Coastguard Worker 			}
38*2d543d20SAndroid Build Coastguard Worker 			if (!len) {
39*2d543d20SAndroid Build Coastguard Worker 				printf("No booleans\n");
40*2d543d20SAndroid Build Coastguard Worker 				return 0;
41*2d543d20SAndroid Build Coastguard Worker 			}
42*2d543d20SAndroid Build Coastguard Worker 			get_all = 1;
43*2d543d20SAndroid Build Coastguard Worker 			break;
44*2d543d20SAndroid Build Coastguard Worker 		default:
45*2d543d20SAndroid Build Coastguard Worker 			usage(argv[0]);
46*2d543d20SAndroid Build Coastguard Worker 		}
47*2d543d20SAndroid Build Coastguard Worker 	}
48*2d543d20SAndroid Build Coastguard Worker 
49*2d543d20SAndroid Build Coastguard Worker 	if (is_selinux_enabled() <= 0) {
50*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  SELinux is disabled\n", argv[0]);
51*2d543d20SAndroid Build Coastguard Worker 		return 1;
52*2d543d20SAndroid Build Coastguard Worker 	}
53*2d543d20SAndroid Build Coastguard Worker 
54*2d543d20SAndroid Build Coastguard Worker 	if (!len) {
55*2d543d20SAndroid Build Coastguard Worker 		if (argc < 2)
56*2d543d20SAndroid Build Coastguard Worker 			usage(argv[0]);
57*2d543d20SAndroid Build Coastguard Worker 		len = argc - 1;
58*2d543d20SAndroid Build Coastguard Worker 		names = calloc(len, sizeof(char *));
59*2d543d20SAndroid Build Coastguard Worker 		if (!names) {
60*2d543d20SAndroid Build Coastguard Worker 			fprintf(stderr, "%s:  out of memory\n", argv[0]);
61*2d543d20SAndroid Build Coastguard Worker 			return 2;
62*2d543d20SAndroid Build Coastguard Worker 		}
63*2d543d20SAndroid Build Coastguard Worker 		for (i = 0; i < len; i++) {
64*2d543d20SAndroid Build Coastguard Worker 			names[i] = strdup(argv[i + 1]);
65*2d543d20SAndroid Build Coastguard Worker 			if (!names[i]) {
66*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  out of memory\n",
67*2d543d20SAndroid Build Coastguard Worker 					argv[0]);
68*2d543d20SAndroid Build Coastguard Worker 				rc = 2;
69*2d543d20SAndroid Build Coastguard Worker 				goto out;
70*2d543d20SAndroid Build Coastguard Worker 			}
71*2d543d20SAndroid Build Coastguard Worker 		}
72*2d543d20SAndroid Build Coastguard Worker 	}
73*2d543d20SAndroid Build Coastguard Worker 
74*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < len; i++) {
75*2d543d20SAndroid Build Coastguard Worker 		active = security_get_boolean_active(names[i]);
76*2d543d20SAndroid Build Coastguard Worker 		if (active < 0) {
77*2d543d20SAndroid Build Coastguard Worker 			if (get_all && errno == EACCES)
78*2d543d20SAndroid Build Coastguard Worker 				continue;
79*2d543d20SAndroid Build Coastguard Worker 			fprintf(stderr, "Error getting active value for %s\n",
80*2d543d20SAndroid Build Coastguard Worker 				names[i]);
81*2d543d20SAndroid Build Coastguard Worker 			rc = -1;
82*2d543d20SAndroid Build Coastguard Worker 			goto out;
83*2d543d20SAndroid Build Coastguard Worker 		}
84*2d543d20SAndroid Build Coastguard Worker 		pending = security_get_boolean_pending(names[i]);
85*2d543d20SAndroid Build Coastguard Worker 		if (pending < 0) {
86*2d543d20SAndroid Build Coastguard Worker 			fprintf(stderr, "Error getting pending value for %s\n",
87*2d543d20SAndroid Build Coastguard Worker 				names[i]);
88*2d543d20SAndroid Build Coastguard Worker 			rc = -1;
89*2d543d20SAndroid Build Coastguard Worker 			goto out;
90*2d543d20SAndroid Build Coastguard Worker 		}
91*2d543d20SAndroid Build Coastguard Worker 		char *alt_name = selinux_boolean_sub(names[i]);
92*2d543d20SAndroid Build Coastguard Worker 		if (! alt_name) {
93*2d543d20SAndroid Build Coastguard Worker 			perror("Out of memory\n");
94*2d543d20SAndroid Build Coastguard Worker 			rc = -1;
95*2d543d20SAndroid Build Coastguard Worker 			goto out;
96*2d543d20SAndroid Build Coastguard Worker 		}
97*2d543d20SAndroid Build Coastguard Worker 
98*2d543d20SAndroid Build Coastguard Worker 		if (pending != active) {
99*2d543d20SAndroid Build Coastguard Worker 			printf("%s --> %s pending: %s\n", alt_name,
100*2d543d20SAndroid Build Coastguard Worker 			       (active ? "on" : "off"),
101*2d543d20SAndroid Build Coastguard Worker 			       (pending ? "on" : "off"));
102*2d543d20SAndroid Build Coastguard Worker 		} else {
103*2d543d20SAndroid Build Coastguard Worker 			printf("%s --> %s\n", alt_name,
104*2d543d20SAndroid Build Coastguard Worker 			       (active ? "on" : "off"));
105*2d543d20SAndroid Build Coastguard Worker 		}
106*2d543d20SAndroid Build Coastguard Worker 		free(alt_name);
107*2d543d20SAndroid Build Coastguard Worker 	}
108*2d543d20SAndroid Build Coastguard Worker 
109*2d543d20SAndroid Build Coastguard Worker       out:
110*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < len; i++)
111*2d543d20SAndroid Build Coastguard Worker 		free(names[i]);
112*2d543d20SAndroid Build Coastguard Worker 	free(names);
113*2d543d20SAndroid Build Coastguard Worker 	return rc;
114*2d543d20SAndroid Build Coastguard Worker }
115