xref: /aosp_15_r20/external/selinux/libselinux/utils/getseuser.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
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