xref: /aosp_15_r20/external/selinux/libselinux/utils/togglesebool.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker #include <unistd.h>
2*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
3*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
4*2d543d20SAndroid Build Coastguard Worker #include <libgen.h>
5*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
6*2d543d20SAndroid Build Coastguard Worker #include <selinux/selinux.h>
7*2d543d20SAndroid Build Coastguard Worker #include <syslog.h>
8*2d543d20SAndroid Build Coastguard Worker #include <pwd.h>
9*2d543d20SAndroid Build Coastguard Worker #include <string.h>
10*2d543d20SAndroid Build Coastguard Worker 
11*2d543d20SAndroid Build Coastguard Worker /* Attempt to rollback the transaction. No need to check error
12*2d543d20SAndroid Build Coastguard Worker    codes since this is rolling back something that blew up. */
rollback(int argc,char ** argv)13*2d543d20SAndroid Build Coastguard Worker static __attribute__ ((__noreturn__)) void rollback(int argc, char **argv)
14*2d543d20SAndroid Build Coastguard Worker {
15*2d543d20SAndroid Build Coastguard Worker 	int i;
16*2d543d20SAndroid Build Coastguard Worker 
17*2d543d20SAndroid Build Coastguard Worker 	for (i = 1; i < argc; i++)
18*2d543d20SAndroid Build Coastguard Worker 		security_set_boolean(argv[i],
19*2d543d20SAndroid Build Coastguard Worker 				     security_get_boolean_active(argv[i]));
20*2d543d20SAndroid Build Coastguard Worker 	exit(1);
21*2d543d20SAndroid Build Coastguard Worker }
22*2d543d20SAndroid Build Coastguard Worker 
main(int argc,char ** argv)23*2d543d20SAndroid Build Coastguard Worker int main(int argc, char **argv)
24*2d543d20SAndroid Build Coastguard Worker {
25*2d543d20SAndroid Build Coastguard Worker 
26*2d543d20SAndroid Build Coastguard Worker 	int rc, i, commit = 0;
27*2d543d20SAndroid Build Coastguard Worker 
28*2d543d20SAndroid Build Coastguard Worker 	if (is_selinux_enabled() <= 0) {
29*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  SELinux is disabled\n", argv[0]);
30*2d543d20SAndroid Build Coastguard Worker 		return 1;
31*2d543d20SAndroid Build Coastguard Worker 	}
32*2d543d20SAndroid Build Coastguard Worker 
33*2d543d20SAndroid Build Coastguard Worker 	if (argc < 2) {
34*2d543d20SAndroid Build Coastguard Worker 		printf("Usage:  %s boolname1 [boolname2 ...]\n",
35*2d543d20SAndroid Build Coastguard Worker 		       basename(argv[0]));
36*2d543d20SAndroid Build Coastguard Worker 		return 1;
37*2d543d20SAndroid Build Coastguard Worker 	}
38*2d543d20SAndroid Build Coastguard Worker 
39*2d543d20SAndroid Build Coastguard Worker 	for (i = 1; i < argc; i++) {
40*2d543d20SAndroid Build Coastguard Worker 		printf("%s: ", argv[i]);
41*2d543d20SAndroid Build Coastguard Worker 		rc = security_get_boolean_active(argv[i]);
42*2d543d20SAndroid Build Coastguard Worker 		switch (rc) {
43*2d543d20SAndroid Build Coastguard Worker 		case 1:
44*2d543d20SAndroid Build Coastguard Worker 			if (security_set_boolean(argv[i], 0) >= 0) {
45*2d543d20SAndroid Build Coastguard Worker 				printf("inactive\n");
46*2d543d20SAndroid Build Coastguard Worker 				commit++;
47*2d543d20SAndroid Build Coastguard Worker 			} else {
48*2d543d20SAndroid Build Coastguard Worker 				printf("%s - rolling back all changes\n",
49*2d543d20SAndroid Build Coastguard Worker 				       strerror(errno));
50*2d543d20SAndroid Build Coastguard Worker 				rollback(i, argv);
51*2d543d20SAndroid Build Coastguard Worker 			}
52*2d543d20SAndroid Build Coastguard Worker 			break;
53*2d543d20SAndroid Build Coastguard Worker 		case 0:
54*2d543d20SAndroid Build Coastguard Worker 			if (security_set_boolean(argv[i], 1) >= 0) {
55*2d543d20SAndroid Build Coastguard Worker 				printf("active\n");
56*2d543d20SAndroid Build Coastguard Worker 				commit++;
57*2d543d20SAndroid Build Coastguard Worker 			} else {
58*2d543d20SAndroid Build Coastguard Worker 				printf("%s - rolling back all changes\n",
59*2d543d20SAndroid Build Coastguard Worker 				       strerror(errno));
60*2d543d20SAndroid Build Coastguard Worker 				rollback(i, argv);
61*2d543d20SAndroid Build Coastguard Worker 			}
62*2d543d20SAndroid Build Coastguard Worker 			break;
63*2d543d20SAndroid Build Coastguard Worker 		default:
64*2d543d20SAndroid Build Coastguard Worker 			if (errno == ENOENT)
65*2d543d20SAndroid Build Coastguard Worker 				printf
66*2d543d20SAndroid Build Coastguard Worker 				    ("Boolean does not exist - rolling back all changes.\n");
67*2d543d20SAndroid Build Coastguard Worker 			else
68*2d543d20SAndroid Build Coastguard Worker 				printf("%s - rolling back all changes.\n",
69*2d543d20SAndroid Build Coastguard Worker 				       strerror(errno));
70*2d543d20SAndroid Build Coastguard Worker 			rollback(i, argv);
71*2d543d20SAndroid Build Coastguard Worker 			break;	/* Not reached. */
72*2d543d20SAndroid Build Coastguard Worker 		}
73*2d543d20SAndroid Build Coastguard Worker 	}
74*2d543d20SAndroid Build Coastguard Worker 
75*2d543d20SAndroid Build Coastguard Worker 	if (commit > 0) {
76*2d543d20SAndroid Build Coastguard Worker 		if (security_commit_booleans() < 0) {
77*2d543d20SAndroid Build Coastguard Worker 			printf("Commit failed. (%s)  No change to booleans.\n",
78*2d543d20SAndroid Build Coastguard Worker 			       strerror(errno));
79*2d543d20SAndroid Build Coastguard Worker 		} else {
80*2d543d20SAndroid Build Coastguard Worker 			/* syslog all the changes */
81*2d543d20SAndroid Build Coastguard Worker 			struct passwd *pwd = getpwuid(getuid());
82*2d543d20SAndroid Build Coastguard Worker 			for (i = 1; i < argc; i++) {
83*2d543d20SAndroid Build Coastguard Worker 				if (pwd && pwd->pw_name)
84*2d543d20SAndroid Build Coastguard Worker 					syslog(LOG_NOTICE,
85*2d543d20SAndroid Build Coastguard Worker 					       "The %s policy boolean was toggled by %s",
86*2d543d20SAndroid Build Coastguard Worker 					       argv[i], pwd->pw_name);
87*2d543d20SAndroid Build Coastguard Worker 				else
88*2d543d20SAndroid Build Coastguard Worker 					syslog(LOG_NOTICE,
89*2d543d20SAndroid Build Coastguard Worker 					       "The %s policy boolean was toggled by uid:%u",
90*2d543d20SAndroid Build Coastguard Worker 					       argv[i], getuid());
91*2d543d20SAndroid Build Coastguard Worker 
92*2d543d20SAndroid Build Coastguard Worker 			}
93*2d543d20SAndroid Build Coastguard Worker 			return 0;
94*2d543d20SAndroid Build Coastguard Worker 		}
95*2d543d20SAndroid Build Coastguard Worker 	}
96*2d543d20SAndroid Build Coastguard Worker 	return 1;
97*2d543d20SAndroid Build Coastguard Worker }
98