aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaman <jason@perfinion.com>2014-07-17 00:46:25 +0400
committerWilliam Hubbs <w.d.hubbs@gmail.com>2014-07-16 17:59:25 -0500
commit89907b60bac51db2cda1afe4555676577ef498a8 (patch)
treef687f95517cdd7fe7c6f9e6eeb8c62eafcc27f27
parenta94a9740d545817294cc431180db0f22fc923b13 (diff)
move the selinux_setup function into rc-selinux
X-Gentoo-Bug: 516956 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=516956
-rw-r--r--src/rc/rc-selinux.c41
-rw-r--r--src/rc/rc-selinux.h2
-rw-r--r--src/rc/runscript.c45
3 files changed, 48 insertions, 40 deletions
diff --git a/src/rc/rc-selinux.c b/src/rc/rc-selinux.c
index 7c1ee80d..eae030d0 100644
--- a/src/rc/rc-selinux.c
+++ b/src/rc/rc-selinux.c
@@ -30,14 +30,24 @@
#include <stddef.h>
#include <errno.h>
+#include <dlfcn.h>
#include <sys/stat.h>
#include <selinux/selinux.h>
#include <selinux/label.h>
+#include "einfo.h"
+#include "rc.h"
+#include "rc-misc.h"
+#include "rc-plugin.h"
#include "rc-selinux.h"
+#define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so"
+
+static void (*selinux_run_init_old) (void);
+static void (*selinux_run_init_new) (int argc, char **argv);
+
static struct selabel_handle *hnd = NULL;
int selinux_util_label(const char *path)
@@ -121,3 +131,34 @@ int selinux_util_close(void)
return 0;
}
+
+void selinux_setup(int argc, char **argv)
+{
+ void *lib_handle = NULL;
+
+ if (!exists(SELINUX_LIB))
+ return;
+
+ lib_handle = dlopen(SELINUX_LIB, RTLD_NOW | RTLD_GLOBAL);
+ if (!lib_handle) {
+ eerror("dlopen: %s", dlerror());
+ return;
+ }
+
+ selinux_run_init_old = (void (*)(void))
+ dlfunc(lib_handle, "selinux_runscript");
+ selinux_run_init_new = (void (*)(int, char **))
+ dlfunc(lib_handle, "selinux_runscript2");
+
+ /* Use new run_init if it exists, else fall back to old */
+ if (selinux_run_init_new)
+ selinux_run_init_new(argc, argv);
+ else if (selinux_run_init_old)
+ selinux_run_init_old();
+ else
+ /* This shouldnt happen... probably corrupt lib */
+ eerrorx
+ ("run_init is missing from runscript_selinux.so!");
+
+ dlclose(lib_handle);
+}
diff --git a/src/rc/rc-selinux.h b/src/rc/rc-selinux.h
index 69624b39..8cf73b05 100644
--- a/src/rc/rc-selinux.h
+++ b/src/rc/rc-selinux.h
@@ -30,4 +30,6 @@ int selinux_util_open(void);
int selinux_util_label(const char *path);
int selinux_util_close(void);
+void selinux_setup(int argc, char **argv);
+
#endif
diff --git a/src/rc/runscript.c b/src/rc/runscript.c
index 981e6067..03d851e6 100644
--- a/src/rc/runscript.c
+++ b/src/rc/runscript.c
@@ -36,7 +36,6 @@
#include <sys/wait.h>
#include <ctype.h>
-#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <fnmatch.h>
@@ -66,7 +65,9 @@
#include "rc-misc.h"
#include "rc-plugin.h"
-#define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so"
+#ifdef HAVE_SELINUX
+#include "rc-selinux.h"
+#endif
#define PREFIX_LOCK RC_SVCDIR "/prefix.lock"
@@ -88,42 +89,6 @@ static int signal_pipe[2] = { -1, -1 };
static RC_STRINGLIST *types_b, *types_n, *types_nu, *types_nua, *types_m;
static RC_STRINGLIST *types_mua = NULL;
-#ifdef __linux__
-static void (*selinux_run_init_old)(void);
-static void (*selinux_run_init_new)(int argc, char **argv);
-
-static void
-setup_selinux(int argc, char **argv)
-{
- void *lib_handle = NULL;
-
- if (! exists(SELINUX_LIB))
- return;
-
- lib_handle = dlopen(SELINUX_LIB, RTLD_NOW | RTLD_GLOBAL);
- if (! lib_handle) {
- eerror("dlopen: %s", dlerror());
- return;
- }
-
- selinux_run_init_old = (void (*)(void))
- dlfunc(lib_handle, "selinux_runscript");
- selinux_run_init_new = (void (*)(int, char **))
- dlfunc(lib_handle, "selinux_runscript2");
-
- /* Use new run_init if it exists, else fall back to old */
- if (selinux_run_init_new)
- selinux_run_init_new(argc, argv);
- else if (selinux_run_init_old)
- selinux_run_init_old();
- else
- /* This shouldnt happen... probably corrupt lib */
- eerrorx("run_init is missing from runscript_selinux.so!");
-
- dlclose(lib_handle);
-}
-#endif
-
static void
handle_signal(int sig)
{
@@ -1224,9 +1189,9 @@ openrc_run(int argc, char **argv)
eprefix(prefix);
}
-#ifdef __linux__
+#ifdef HAVE_SELINUX
/* Ok, we are ready to go, so setup selinux if applicable */
- setup_selinux(argc, argv);
+ selinux_setup(argc, argv);
#endif
deps = true;