chiark / gitweb /
[PATCH] selinux patch
[elogind.git] / selinux.h
1 #ifndef SELINUX_H
2 #define SELINUX_H
3
4 #ifndef USE_SELINUX
5
6 static inline void selinux_setfilecon(char *file, unsigned int mode) {}
7 static inline void selinux_setfscreatecon(char *file, unsigned int mode) {}
8 static inline void selinux_init(void) {}
9 static inline void selinux_restore(void) {}
10
11 #else
12
13 #include <selinux/selinux.h>
14 #include <stdio.h>
15 #include <limits.h>
16 #include <ctype.h>
17
18 static int selinux_enabled=-1;
19 static security_context_t prev_scontext=NULL;
20
21 static inline int is_selinux_running(void)
22 {
23         if (selinux_enabled == -1) 
24                 return selinux_enabled = is_selinux_enabled() > 0;
25         return selinux_enabled;
26 }
27
28 static inline int selinux_get_media(char *path, int mode, char **media)
29 {
30         FILE *fp;
31         char buf[PATH_MAX];
32         char mediabuf[PATH_MAX];
33         int ret = -1;
34
35         *media = NULL;
36         if (!(mode && S_IFBLK)) {
37                 return -1;
38         }
39
40         snprintf(buf, sizeof(buf), "/proc/ide/%s/media", basename(path));
41
42         fp=fopen(buf,"r");
43         if (!fp)
44                 goto out;
45         
46         mediabuf[0] = '\0';
47
48         if (fgets(mediabuf, sizeof(mediabuf), fp) == NULL)
49                 goto close_out;
50
51         int size = strlen(mediabuf);
52         while (size-- > 0) {
53                 if (isspace(mediabuf[size])) {
54                         mediabuf[size]='\0';
55                 } else {
56                         break;
57                 }
58         }
59         *media = strdup(mediabuf);
60         info("selinux_get_media(%s)->%s \n", path, *media);
61         ret = 0;
62
63 close_out:
64         fclose(fp);
65 out:
66         return ret;
67 }
68
69 static inline void selinux_setfilecon(char *file, unsigned int mode)
70 {
71         if (is_selinux_running()) {
72                 security_context_t scontext=NULL;
73                 char *media;
74                 int ret=selinux_get_media(file, mode, &media);
75                 if (ret == 0) {
76                         ret = matchmediacon(media, &scontext);
77                         free(media);
78                 } 
79                 if (ret == -1)
80                         if (matchpathcon(file, mode, &scontext) < 0) {
81                                 dbg("matchpathcon(%s) failed\n", file);
82                                 return;
83                         } 
84                 if (setfilecon(file, scontext) < 0)
85                         dbg("setfiles %s failed with error '%s'",
86                             file, strerror(errno));
87                 freecon(scontext);
88         }
89 }
90
91 static inline void selinux_setfscreatecon(char *file, unsigned int mode)
92 {
93         int retval = 0;
94         security_context_t scontext=NULL;
95
96         if (is_selinux_running()) {
97                 char *media;
98                 int ret = selinux_get_media(file, mode, &media);
99
100                 if (ret == 0) {
101                         ret = matchmediacon(media, &scontext);
102                         free(media);
103                 } 
104
105                 if (ret == -1) 
106                         if (matchpathcon(file, mode, &scontext) < 0) {
107                                 dbg("matchpathcon(%s) failed\n", file);
108                                 return;
109                         } 
110
111                 retval = setfscreatecon(scontext);
112                 if (retval < 0)
113                         dbg("setfiles %s failed with error '%s'",
114                             file, strerror(errno));
115                 freecon(scontext);
116         }
117 }
118
119 static inline void selinux_init(void)
120 {
121         /* 
122          * record the present security context, for file-creation
123          * restoration creation purposes.
124          */
125         if (is_selinux_running()) {
126                 if (getfscreatecon(&prev_scontext) < 0) {
127                         dbg("getfscreatecon failed\n");
128                 }
129                 prev_scontext = NULL;
130         }
131 }
132
133 static inline void selinux_restore(void)
134 {
135         if (is_selinux_running()) {
136                 /* reset the file create context to its former glory */
137                 if (setfscreatecon(prev_scontext) < 0)
138                         dbg("setfscreatecon failed\n");
139                 if (prev_scontext) {
140                         freecon(prev_scontext);
141                         prev_scontext = NULL;
142                 }
143         }
144 }
145
146 #endif /* USE_SELINUX */
147
148 #endif /* SELINUX_H */