Add new internal functions to kill loader process
[platform/core/appfw/aul-1.git] / src / launch.cc
index fffa437..1816644 100644 (file)
@@ -29,7 +29,9 @@
 #include <sys/types.h>
 #include <ttrace.h>
 
+#include <filesystem>
 #include <memory>
+#include <string>
 #include <utility>
 
 #include "app_request.h"
@@ -46,6 +48,10 @@ using namespace aul::internal;
 
 namespace {
 
+constexpr const char kRunAulDaemonsPath[] = "/run/aul/daemons/";
+constexpr const char kLaunchpadProcessPoolSock[] =
+    ".launchpad-process-pool-sock";
+const int kPadCmdKillLoader = 19;
 constexpr const int TEP_ISMOUNT_MAX_RETRY_CNT = 20;
 
 class ResultInfo {
@@ -861,3 +867,41 @@ extern "C" API int aul_kill_pid_async(pid_t pid,
 
   return AUL_R_OK;
 }
+
+extern "C" API int aul_kill_loader(const char* loader_name) {
+  return aul_kill_loader_for_uid(loader_name, getuid());
+}
+
+extern "C" API int aul_kill_loader_for_uid(const char* loader_name,
+    uid_t uid) {
+  if (loader_name == nullptr) {
+    _E("Invalid parameter");
+    return AUL_R_EINVAL;
+  }
+
+  if (uid < REGULAR_UID_MIN) {
+    uid = tzplatform_getuid(TZ_SYS_DEFAULT_USER);
+    _W("Use system default user ID(%u)", uid);
+  }
+
+  std::string endpoint = kRunAulDaemonsPath + std::to_string(uid) + "/" +
+                         std::string(kLaunchpadProcessPoolSock);
+  if (!std::filesystem::exists(endpoint)) {
+    _E("launchpad socket is not prepared");
+    return AUL_R_ENOENT;
+  }
+
+  int fd = aul_sock_create_launchpad_client(kLaunchpadProcessPoolSock, uid);
+  if (fd < 0) {
+    _E("Failed to create launchpad client socket. error(%d)", fd);
+    return aul_error_convert(fd);
+  }
+
+  tizen_base::Bundle b = { {AUL_K_LOADER_NAME, loader_name} };
+  int ret = aul_sock_send_bundle_with_fd(fd, kPadCmdKillLoader, b.GetHandle(),
+      AUL_SOCK_NOREPLY);
+  if (ret != AUL_R_OK)
+    return aul_error_convert(ret);
+
+  return AUL_R_OK;
+}