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