1*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
2*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
3*2d543d20SAndroid Build Coastguard Worker #include <string.h>
4*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
5*2d543d20SAndroid Build Coastguard Worker #include <selinux/selinux.h>
6*2d543d20SAndroid Build Coastguard Worker #include <selinux/get_context_list.h>
7*2d543d20SAndroid Build Coastguard Worker
main(int argc,char ** argv)8*2d543d20SAndroid Build Coastguard Worker int main(int argc, char **argv)
9*2d543d20SAndroid Build Coastguard Worker {
10*2d543d20SAndroid Build Coastguard Worker char *seuser = NULL, *level = NULL;
11*2d543d20SAndroid Build Coastguard Worker char **contextlist;
12*2d543d20SAndroid Build Coastguard Worker int rc, n, i;
13*2d543d20SAndroid Build Coastguard Worker
14*2d543d20SAndroid Build Coastguard Worker if (argc != 3) {
15*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "usage: %s linuxuser fromcon\n", argv[0]);
16*2d543d20SAndroid Build Coastguard Worker return 1;
17*2d543d20SAndroid Build Coastguard Worker }
18*2d543d20SAndroid Build Coastguard Worker
19*2d543d20SAndroid Build Coastguard Worker if (!is_selinux_enabled()) {
20*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "%s may be used only on a SELinux enabled kernel.\n", argv[0]);
21*2d543d20SAndroid Build Coastguard Worker return 4;
22*2d543d20SAndroid Build Coastguard Worker }
23*2d543d20SAndroid Build Coastguard Worker
24*2d543d20SAndroid Build Coastguard Worker rc = getseuserbyname(argv[1], &seuser, &level);
25*2d543d20SAndroid Build Coastguard Worker if (rc) {
26*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "getseuserbyname failed: %s\n", strerror(errno));
27*2d543d20SAndroid Build Coastguard Worker return 2;
28*2d543d20SAndroid Build Coastguard Worker }
29*2d543d20SAndroid Build Coastguard Worker printf("seuser: %s, level %s\n", seuser, level);
30*2d543d20SAndroid Build Coastguard Worker
31*2d543d20SAndroid Build Coastguard Worker rc = security_check_context(argv[2]);
32*2d543d20SAndroid Build Coastguard Worker if (rc) {
33*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "context '%s' is invalid\n", argv[2]);
34*2d543d20SAndroid Build Coastguard Worker free(seuser);
35*2d543d20SAndroid Build Coastguard Worker free(level);
36*2d543d20SAndroid Build Coastguard Worker return 5;
37*2d543d20SAndroid Build Coastguard Worker }
38*2d543d20SAndroid Build Coastguard Worker
39*2d543d20SAndroid Build Coastguard Worker n = get_ordered_context_list_with_level(seuser, level, argv[2], &contextlist);
40*2d543d20SAndroid Build Coastguard Worker if (n < 0) {
41*2d543d20SAndroid Build Coastguard Worker fprintf(stderr, "get_ordered_context_list_with_level failed: %s\n", strerror(errno));
42*2d543d20SAndroid Build Coastguard Worker free(seuser);
43*2d543d20SAndroid Build Coastguard Worker free(level);
44*2d543d20SAndroid Build Coastguard Worker return 3;
45*2d543d20SAndroid Build Coastguard Worker }
46*2d543d20SAndroid Build Coastguard Worker
47*2d543d20SAndroid Build Coastguard Worker free(seuser);
48*2d543d20SAndroid Build Coastguard Worker free(level);
49*2d543d20SAndroid Build Coastguard Worker
50*2d543d20SAndroid Build Coastguard Worker if (n == 0)
51*2d543d20SAndroid Build Coastguard Worker printf("no valid context found\n");
52*2d543d20SAndroid Build Coastguard Worker
53*2d543d20SAndroid Build Coastguard Worker for (i = 0; i < n; i++)
54*2d543d20SAndroid Build Coastguard Worker printf("Context %d\t%s\n", i, contextlist[i]);
55*2d543d20SAndroid Build Coastguard Worker
56*2d543d20SAndroid Build Coastguard Worker freeconary(contextlist);
57*2d543d20SAndroid Build Coastguard Worker
58*2d543d20SAndroid Build Coastguard Worker return EXIT_SUCCESS;
59*2d543d20SAndroid Build Coastguard Worker }
60