ENDFOREACH(flag)
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Werror -rdynamic -Wno-deprecated-declarations")
-SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions -DUNIFIED_SYSTEM_SERVICE_ENABLED=${UNIFIED_SYSTEM_SERVICE_ON}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -lrt -fPIE")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie")
# To apply Armoring(Full RELRO), which means GOT Table becomes read-only.
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
+#include <spawn.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#define MODEL_NAME "http://tizen.org/system/model_name"
#define MODEL_EMULATOR "Emulator"
+static int g_unified_system_service_on = UNIFIED_SYSTEM_SERVICE_ENABLED;
+
static const char *rm_arg[] = {
"/usr/bin/rm",
"-rf", NULL, NULL,
exit(EXIT_FAILURE);
}
-int run_child(int argc, const char *argv[])
+int run_fork(int argc, const char *argv[])
{
pid_t pid;
struct sigaction act, oldact;
return r;
}
+int run_posix_spawn(int argc, const char *argv[])
+{
+ pid_t pid;
+ int status;
+ int r = 0;
+ FILE *fp;
+ posix_spawnattr_t attr;
+ sigset_t sigmask;
+ sigset_t sigdefault;
+
+ if (!argv)
+ return -EINVAL;
+
+ fp = fopen(argv[0], "r");
+ if (fp == NULL) {
+ _E("Failed to %s: %d", argv[0], errno);
+ return -errno;
+ }
+ fclose(fp);
+
+ posix_spawnattr_init(&attr);
+ sigemptyset(&sigmask);
+ sigemptyset(&sigdefault);
+ sigprocmask(SIG_BLOCK, &sigmask, NULL);
+
+ posix_spawnattr_setsigmask(&attr, &sigmask);
+ posix_spawnattr_setsigdefault(&attr, &sigdefault);
+ posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF);
+
+ r = posix_spawn(&pid, argv[0], NULL, &attr, (char**)argv, NULL);
+ if (r != 0)
+ _E("Failed to posix_spawn: %d", r);
+
+ waitpid(pid, &status, 0);
+ _I("Process(%d) terminated by exit(%d).", pid, WEXITSTATUS(status));
+
+ r = posix_spawnattr_destroy(&attr);
+ if (r != 0)
+ _E("Failed to posix_spawnattr_destroy: %d", r);
+
+ return r;
+}
+
+int run_child(int argc, const char *argv[])
+{
+ if (g_unified_system_service_on)
+ return run_posix_spawn(argc, argv);
+ else
+ return run_fork(argc, argv);
+}
+
int remove_directory(const char*path)
{
int argc;