xref: /aosp_15_r20/external/selinux/libsemanage/example/test_fcontext.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker #include <semanage/fcontext_record.h>
2*2d543d20SAndroid Build Coastguard Worker #include <semanage/semanage.h>
3*2d543d20SAndroid Build Coastguard Worker #include <semanage/fcontexts_local.h>
4*2d543d20SAndroid Build Coastguard Worker #include <sepol/sepol.h>
5*2d543d20SAndroid Build Coastguard Worker 
6*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
7*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
8*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
9*2d543d20SAndroid Build Coastguard Worker 
main(const int argc,const char ** argv)10*2d543d20SAndroid Build Coastguard Worker int main(const int argc, const char **argv) {
11*2d543d20SAndroid Build Coastguard Worker 	semanage_handle_t *sh = NULL;
12*2d543d20SAndroid Build Coastguard Worker 	semanage_fcontext_t *fcontext;
13*2d543d20SAndroid Build Coastguard Worker 	semanage_context_t *con;
14*2d543d20SAndroid Build Coastguard Worker 	semanage_fcontext_key_t *k;
15*2d543d20SAndroid Build Coastguard Worker 
16*2d543d20SAndroid Build Coastguard Worker 	int exist = 0;
17*2d543d20SAndroid Build Coastguard Worker 	sh = semanage_handle_create();
18*2d543d20SAndroid Build Coastguard Worker 	if (sh == NULL) {
19*2d543d20SAndroid Build Coastguard Worker 		perror("Can't create semanage handle\n");
20*2d543d20SAndroid Build Coastguard Worker 		return -1;
21*2d543d20SAndroid Build Coastguard Worker 	}
22*2d543d20SAndroid Build Coastguard Worker         if (semanage_access_check(sh) < 0) {
23*2d543d20SAndroid Build Coastguard Worker 		perror("Semanage access check failed\n");
24*2d543d20SAndroid Build Coastguard Worker 		return -1;
25*2d543d20SAndroid Build Coastguard Worker 	}
26*2d543d20SAndroid Build Coastguard Worker         if (semanage_connect(sh) < 0) {
27*2d543d20SAndroid Build Coastguard Worker 		perror("Semanage connect failed\n");
28*2d543d20SAndroid Build Coastguard Worker 		return -1;
29*2d543d20SAndroid Build Coastguard Worker 	}
30*2d543d20SAndroid Build Coastguard Worker 
31*2d543d20SAndroid Build Coastguard Worker 	if (semanage_fcontext_key_create(sh, argv[2], SEMANAGE_FCONTEXT_REG, &k) < 0) {
32*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "Could not create key for %s", argv[2]);
33*2d543d20SAndroid Build Coastguard Worker 		return -1;
34*2d543d20SAndroid Build Coastguard Worker 	}
35*2d543d20SAndroid Build Coastguard Worker 
36*2d543d20SAndroid Build Coastguard Worker 	if(semanage_fcontext_exists(sh, k, &exist) < 0) {
37*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,"Could not check if key exists for %s", argv[2]);
38*2d543d20SAndroid Build Coastguard Worker 		return -1;
39*2d543d20SAndroid Build Coastguard Worker 	}
40*2d543d20SAndroid Build Coastguard Worker 	if (exist) {
41*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,"Could create %s mapping already exists", argv[2]);
42*2d543d20SAndroid Build Coastguard Worker 		return -1;
43*2d543d20SAndroid Build Coastguard Worker 	}
44*2d543d20SAndroid Build Coastguard Worker 
45*2d543d20SAndroid Build Coastguard Worker 	if (semanage_fcontext_create(sh, &fcontext) < 0) {
46*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,"Could not create file context for %s", argv[2]);
47*2d543d20SAndroid Build Coastguard Worker 		return -1;
48*2d543d20SAndroid Build Coastguard Worker 	}
49*2d543d20SAndroid Build Coastguard Worker 	semanage_fcontext_set_expr(sh, fcontext, argv[2]);
50*2d543d20SAndroid Build Coastguard Worker 
51*2d543d20SAndroid Build Coastguard Worker 	if (semanage_context_from_string(sh, argv[1], &con)) {
52*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,"Could not create context using %s for file context %s", argv[1], argv[2]);
53*2d543d20SAndroid Build Coastguard Worker 		return -1;
54*2d543d20SAndroid Build Coastguard Worker 	}
55*2d543d20SAndroid Build Coastguard Worker 
56*2d543d20SAndroid Build Coastguard Worker 	if (semanage_fcontext_set_con(sh, fcontext, con) < 0) {
57*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,"Could not set file context for %s", argv[2]);
58*2d543d20SAndroid Build Coastguard Worker 		return -1;
59*2d543d20SAndroid Build Coastguard Worker 	}
60*2d543d20SAndroid Build Coastguard Worker 
61*2d543d20SAndroid Build Coastguard Worker 	semanage_fcontext_set_type(fcontext, SEMANAGE_FCONTEXT_REG);
62*2d543d20SAndroid Build Coastguard Worker 
63*2d543d20SAndroid Build Coastguard Worker 	if(semanage_fcontext_modify_local(sh, k, fcontext) < 0) {
64*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,"Could not add file context for %s", argv[2]);
65*2d543d20SAndroid Build Coastguard Worker 		return -1;
66*2d543d20SAndroid Build Coastguard Worker 	}
67*2d543d20SAndroid Build Coastguard Worker 	semanage_fcontext_key_free(k);
68*2d543d20SAndroid Build Coastguard Worker 	semanage_fcontext_free(fcontext);
69*2d543d20SAndroid Build Coastguard Worker 
70*2d543d20SAndroid Build Coastguard Worker 	return 0;
71*2d543d20SAndroid Build Coastguard Worker }
72*2d543d20SAndroid Build Coastguard Worker 
73