chiark / gitweb /
723af9a02fc8753d854149c49dfcc2bfbea4050c
[elogind.git] / udev_selinux.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <stdio.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <errno.h>
7 #include <ctype.h>
8 #include <selinux/selinux.h>
9
10 #include "udev.h"
11 #include "udev_lib.h"
12 #include "logging.h"
13
14 #ifdef LOG
15 unsigned char logname[LOGNAME_SIZE];
16 void log_message(int level, const char *format, ...)
17 {
18         va_list args;
19
20         if (!udev_log)
21                 return;
22
23         va_start(args, format);
24         vsyslog(level, format, args);
25         va_end(args);
26 }
27 #endif
28
29 void selinux_add_node(char *filename)
30 {
31         int retval;
32
33         if (is_selinux_enabled() > 0) {
34                 security_context_t scontext;
35                 retval = matchpathcon(filename, 0, &scontext);
36                 if (retval < 0) {
37                         dbg("matchpathcon(%s) failed\n", filename);
38                 } else {
39                         retval=setfilecon(filename,scontext);
40                         if (retval < 0)
41                                 dbg("setfiles %s failed with error '%s'",
42                                     filename, strerror(errno));
43                         free(scontext);
44                 }
45         }
46 }
47
48 int main(int argc, char *argv[], char *envp[])
49 {
50         char *action;
51         char *devpath;
52         char *devnode;
53         int retval = 0;
54
55         init_logging("udev_selinux");
56
57         action = get_action();
58         if (!action) {
59                 dbg("no action?");
60                 goto exit;
61         }
62         devnode = get_devnode();
63         if (!devnode) {
64                 dbg("no devnode?");
65                 goto exit;
66         }
67
68         if (strcmp(action, "add") == 0)
69                 selinux_add_node(devnode);
70
71 exit:
72         return retval;
73 }