diff options
Diffstat (limited to 'extras/selinux/udev_selinux.c')
-rw-r--r-- | extras/selinux/udev_selinux.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/extras/selinux/udev_selinux.c b/extras/selinux/udev_selinux.c new file mode 100644 index 0000000000..bbbdd6ba53 --- /dev/null +++ b/extras/selinux/udev_selinux.c @@ -0,0 +1,72 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <ctype.h> +#include <selinux/selinux.h> + +#include "../../udev_lib.h" +#include "../../logging.h" + +#ifdef LOG +unsigned char logname[LOGNAME_SIZE]; +void log_message(int level, const char *format, ...) +{ + va_list args; + + if (!udev_log) + return; + + va_start(args, format); + vsyslog(level, format, args); + va_end(args); +} +#endif + +void selinux_add_node(char *filename) +{ + int retval; + + if (is_selinux_enabled() > 0) { + security_context_t scontext; + retval = matchpathcon(filename, 0, &scontext); + if (retval < 0) { + dbg("matchpathcon(%s) failed\n", filename); + } else { + retval=setfilecon(filename,scontext); + if (retval < 0) + dbg("setfiles %s failed with error '%s'", + filename, strerror(errno)); + free(scontext); + } + } +} + +int main(int argc, char *argv[], char *envp[]) +{ + char *action; + char *devpath; + char *devnode; + int retval = 0; + + init_logging("udev_selinux"); + + action = get_action(); + if (!action) { + dbg("no action?"); + goto exit; + } + devnode = get_devnode(); + if (!devnode) { + dbg("no devnode?"); + goto exit; + } + + if (strcmp(action, "add") == 0) + selinux_add_node(devnode); + +exit: + return retval; +} |