]> git.ipfire.org Git - thirdparty/util-linux.git/blob - login-utils/selinux_utils.c
selinux: is_selinux_enabled() returns 0, 1 and -1
[thirdparty/util-linux.git] / login-utils / selinux_utils.c
1 #include <sys/types.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <selinux/selinux.h>
5 #include <selinux/flask.h>
6 #include <selinux/av_permissions.h>
7 #include <selinux/context.h>
8 #include "selinux_utils.h"
9
10 int checkAccess(char *chuser, int access) {
11 int status=-1;
12 security_context_t user_context;
13 const char *user=NULL;
14 if( getprevcon(&user_context)==0 ) {
15 context_t c=context_new(user_context);
16 user=context_user_get(c);
17 if (strcmp(chuser, user) == 0) {
18 status=0;
19 } else {
20 struct av_decision avd;
21 int retval = security_compute_av(user_context,
22 user_context,
23 SECCLASS_PASSWD,
24 access,
25 &avd);
26
27 if ((retval == 0) &&
28 ((access & avd.allowed) == access)) {
29 status=0;
30 }
31 }
32 context_free(c);
33 freecon(user_context);
34 }
35 return status;
36 }
37
38 int setupDefaultContext(char *orig_file) {
39 if (is_selinux_enabled() > 0) {
40 security_context_t scontext;
41
42 if (getfilecon(orig_file,&scontext)<0) {
43 return 1;
44 }
45
46 if (setfscreatecon(scontext) < 0)
47 {
48 freecon(scontext);
49 return 1;
50 }
51 freecon(scontext);
52 }
53 return 0;
54 }