SET(SOURCES_ZRAM initd/zram.c)
ENDIF()
+IF(SELINUX)
+ include(FindPkgConfig)
+ pkg_search_module(SELINUX REQUIRED libselinux)
+ add_compile_definitions(WITH_SELINUX)
+ENDIF()
+
add_subdirectory(upgraded)
ADD_EXECUTABLE(procd ${SOURCES})
ELSE()
ADD_EXECUTABLE(init initd/init.c initd/early.c initd/preinit.c initd/mkdev.c sysupgrade.c watchdog.c
utils/utils.c ${SOURCES_ZRAM})
-TARGET_LINK_LIBRARIES(init ${LIBS})
+TARGET_INCLUDE_DIRECTORIES(init PUBLIC ${SELINUX_INCLUDE_DIRS})
+TARGET_LINK_LIBRARIES(init ${LIBS} ${SELINUX_LIBRARIES})
INSTALL(TARGETS init
RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
)
#include <unistd.h>
#include <stdio.h>
+#if defined(WITH_SELINUX)
+#include <selinux/selinux.h>
+#endif
+
#include "../utils/utils.h"
#include "init.h"
#include "../watchdog.h"
}
}
+#if defined(WITH_SELINUX)
+static int
+selinux(char **argv)
+{
+ int enforce = 0;
+ int ret;
+
+ /* SELinux already initialized */
+ if (getenv("SELINUX_INIT"))
+ return 0;
+
+ putenv("SELINUX_INIT=1");
+
+ ret = selinux_init_load_policy(&enforce);
+ if (ret == 0)
+ execv(argv[0], argv);
+
+ if (enforce > 0) {
+ fprintf(stderr, "Cannot load SELinux policy, but system in enforcing mode. Halting.\n");
+ return 1;
+ }
+
+ return 0;
+}
+#else
+static int
+selinux(char **argv)
+{
+ return 0;
+}
+#endif
+
int
main(int argc, char **argv)
{
sigaction(SIGUSR2, &sa_shutdown, NULL);
sigaction(SIGPWR, &sa_shutdown, NULL);
+ if (selinux(argv))
+ exit(-1);
early();
cmdline();
watchdog_init(1);