Change to use abstract socket in amd,launchpad 86/317286/5
authornewb1e <jihoi.kim@samsung.com>
Mon, 30 Dec 2024 05:08:22 +0000 (14:08 +0900)
committernewb1e <jihoi.kim@samsung.com>
Mon, 30 Dec 2024 08:31:29 +0000 (17:31 +0900)
- Change socket names: ex) @org.tizen.appfw.amd
- Path name starts with '@' will be abstract sockets
- Change connect(), bind() wrapper classes to handle '@' path

Change-Id: Id782fa1d31f206f71efe6c7ab7bd4e71bcb87698
Signed-off-by: newb1e <jihoi.kim@samsung.com>
CMakeLists.txt
packaging/launchpad-process-pool.socket
src/launchpad-process-pool/hydra_loader_context.cc
src/launchpad-process-pool/hydra_sigchld_event.cc
src/launchpad-process-pool/launchpad.cc
src/launchpad-process-pool/loader_context.cc
src/lib/launchpad-common/client_socket.cc
src/lib/launchpad-common/server_socket.cc
src/lib/launchpad-core/util.cc
src/lib/launchpad-hydra/launchpad_hydra.cc
src/lib/launchpad/launchpad_loader.cc

index b418be2f0abb85e5e7afd00591731a06e9696984..a56a04a6cd92099a2e85d1d47a3b5ec9934c1c8b 100644 (file)
@@ -33,7 +33,7 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FILE_OFFSET_BITS=64")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 SET(CMAKE_C_FLAGS_RELEASE "-O2")
 
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS} -std=c++17")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS} -std=c++23")
 SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
 SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
 
index 515d5e040c6de5757ef180199760e3a9c1f82211..49e2bcc57af611a8c23686dd4829f0325b87a6b6 100644 (file)
@@ -1,7 +1,5 @@
 [Socket]
-ListenStream=/run/aul/daemons/%U/.launchpad-process-pool-sock
-ListenStream=/run/aul/daemons/%U/.launchpad-recovery-sock
-DirectoryMode=0777
+ListenStream=@org.tizen.appfw.launchpad-process-pool-%U
 
 [Install]
 WantedBy=sockets.target
index 14ca7066aa4a7959b68988a1757eac1c9e2057ea..b462d6c1d4d80993c9c582e7901289d0146b50e3 100644 (file)
@@ -32,7 +32,7 @@ namespace fs = std::filesystem;
 namespace launchpad {
 namespace {
 
-constexpr const char kHydraLoaderSocketName[] = ".hydra-loader";
+constexpr const char kHydraLoaderSocketName[] = "@org.tizen.appfw.hydra-loader";
 const int kSocketMaxBufferSize = 131071;
 
 }  // namespace
@@ -53,11 +53,10 @@ HydraLoaderContext::HydraLoaderContext(
 
 void HydraLoaderContext::Listen() {
   try {
-    std::string socket_path = "/run/aul/daemons/" + std::to_string(getuid()) +
-                              "/" + std::string(kHydraLoaderSocketName) +
+    std::string socket_path = std::string(kHydraLoaderSocketName) + "-" +
+                              std::to_string(getuid()) + "-" +
                               std::to_string(GetType()) + "-" +
                               std::to_string(GetLoaderId());
-    if (fs::exists(socket_path)) fs::remove(socket_path);
 
     hydra_socket_.reset(new ServerSocket());
     hydra_socket_->Bind(socket_path);
index b12796aee09f4573cddcee08df686f04baea2851..35f4e07ca9fefeaf9406d4c57dcc75f09d0cbf27 100644 (file)
@@ -27,7 +27,7 @@
 namespace launchpad {
 namespace {
 
-constexpr const char HYDRA_SIGCHLD_SOCK[] = ".hydra-sigchld-sock";
+constexpr const char HYDRA_SIGCHLD_SOCK[] = "@org.tizen.appfw.hydra-sigchld";
 const int MAX_PENDING_CONNECTION = 128;
 const int MAX_RECEIVE_BUFFER = 131071;
 
@@ -57,8 +57,8 @@ int CheckPermission(pid_t pid) {
 
 HydraSigchldEvent::HydraSigchldEvent(IEvent* listener)
     : listener_(listener), socket_(new ServerSocket()) {
-  std::string endpoint =
-      "/run/aul/daemons/" + std::to_string(getuid()) + "/" + HYDRA_SIGCHLD_SOCK;
+  std::string endpoint = std::string(HYDRA_SIGCHLD_SOCK) + "-" +
+      std::to_string(getuid());
   socket_->Bind(endpoint);
   socket_->Listen(MAX_PENDING_CONNECTION);
   socket_->SetReceiveBufferSize(MAX_RECEIVE_BUFFER);
index 3f294ee46186eda303880bf49aa6dc31b2e4b704..f5433eed17374054338de75bab7d4553f749aac7 100644 (file)
@@ -26,6 +26,7 @@
 #include <algorithm>
 #include <string>
 #include <utility>
+#include <format>
 
 #include <app_info.hh>
 #include <aul_keys.hh>
@@ -52,18 +53,20 @@ namespace {
 
 constexpr const char kRunAulDaemonsPath[] = "/run/aul/daemons/";
 constexpr const char kLaunchpadProcessPoolSock[] =
-    ".launchpad-process-pool-sock";
+    "@org.tizen.appfw.launchpad-process-pool";
 constexpr const char kInfoDirectoryPath[] = "/usr/share/aul";
 const int kReceivedBufferSize = 131071;
 const int kMaxPendingConnection = 128;
 const uid_t kRegularUidMin = 5000;
 
 int GetLaunchpadFdFromSystemd() {
-  const std::string path = kRunAulDaemonsPath + std::to_string(getuid()) + "/" +
-                           std::string(kLaunchpadProcessPoolSock);
+  auto path = std::format("{}-{}", kLaunchpadProcessPoolSock, getuid());
+  path[0] = '\0';
+
   int fds = sd_listen_fds(0);
   for (int fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + fds; ++fd) {
-    if (sd_is_socket_unix(fd, SOCK_STREAM, 1, path.c_str(), 0) > 0) return fd;
+    if (sd_is_socket_unix(fd, SOCK_STREAM, 1, path.data(), path.length()) > 0)
+      return fd;
   }
 
   _W("There is no socket stream");
@@ -82,18 +85,36 @@ int GetLaunchpadFdFromEnvironment() {
 }
 
 ServerSocket* GetLaunchpadSocket() {
+  int marker;
+  char path[PATH_MAX] = {0,};
+
+  //TODO(Abstract Socket Issue): file-based socket check
   int fd = GetLaunchpadFdFromSystemd();
   if (fd < 0) fd = GetLaunchpadFdFromEnvironment();
+  if (fd > -1) {
+    snprintf(path, PATH_MAX, "%s%d/%s",
+        kRunAulDaemonsPath, getuid(), kLaunchpadProcessPoolSock);
+    marker = open(path, O_RDWR | O_CREAT,
+        S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+    close(marker);
+
+    return new ServerSocket(fd);
+  } else {
+    auto* socket = new ServerSocket();
+    const std::string endpoint = std::string(kLaunchpadProcessPoolSock) + "-" +
+                                 std::to_string(getuid());
+    socket->Bind(endpoint);
+    socket->SetReceiveBufferSize(kReceivedBufferSize);
+    socket->Listen(kMaxPendingConnection);
 
-  if (fd > -1) return new ServerSocket(fd);
+    snprintf(path, PATH_MAX, "%s%d/%s",
+        kRunAulDaemonsPath, getuid(), kLaunchpadProcessPoolSock);
+    marker = open(path, O_RDWR | O_CREAT,
+        S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+    close(marker);
 
-  auto* socket = new ServerSocket();
-  const std::string endpoint = kRunAulDaemonsPath + std::to_string(getuid()) +
-                               "/" + kLaunchpadProcessPoolSock;
-  socket->Bind(endpoint);
-  socket->SetReceiveBufferSize(kReceivedBufferSize);
-  socket->Listen(kMaxPendingConnection);
-  return socket;
+    return socket;
+  }
 }
 
 void PrintAppInfo(const AppInfo* app_info) {
index d94f17cfe6709c1bcadbe327308a9ab45cb1e951..10861d83264923a09b762fb3233cddeff83bb3cd 100644 (file)
@@ -50,7 +50,8 @@ namespace fs = std::filesystem;
 namespace launchpad {
 namespace {
 
-constexpr const char kLaunchpadType[] = ".launchpad-type";
+constexpr const char kLaunchpadTypeSocketName[] =
+    "@org.tizen.appfw.launchpad-type";
 const int kSocketMaxBufferSize = 131071;
 const unsigned int kWinScore = 100;
 const float kLoseScoreRate = 0.7f;
@@ -165,11 +166,12 @@ LoaderContext::~LoaderContext() { Dispose(); }
 
 void LoaderContext::Listen() {
   try {
-    std::string socket_path = "/run/aul/daemons/" + std::to_string(getuid()) +
-                              "/" + std::string(kLaunchpadType) +
+    std::string socket_path = std::string(kLaunchpadTypeSocketName) + "-" +
+                              std::to_string(getuid()) + "-" +
                               std::to_string(GetType()) + "-" +
                               std::to_string(loader_id_);
-    if (fs::exists(socket_path)) fs::remove(socket_path);
+    if (kLaunchpadTypeSocketName[0] != '@' && fs::exists(socket_path))
+      fs::remove(socket_path);
 
     server_socket_.reset(new ServerSocket());
     server_socket_->Bind(socket_path);
index 21c0f70f1197db28764ca2575b0bbe0cae369be8..60cf65db29b3ea34bdbcf1cf7679b5805d8986f6 100644 (file)
@@ -69,11 +69,17 @@ void ClientSocket::Connect(const std::string& endpoint) {
 
   fcntl(fd_, F_SETFL, flag | O_NONBLOCK);
   struct sockaddr_un sockaddr = { 0, };
+  socklen_t len = 0;
   sockaddr.sun_family = AF_UNIX;
   snprintf(sockaddr.sun_path, sizeof(sockaddr.sun_path), "%s",
       endpoint.c_str());
+  if (sockaddr.sun_path[0] == '@') {
+    len = offsetof(struct sockaddr_un, sun_path) + strlen(sockaddr.sun_path);
+    sockaddr.sun_path[0] = '\0';
+  } else {
+    len = sizeof(struct sockaddr_un);
+  }
   struct sockaddr* sockaddr_ptr = reinterpret_cast<struct sockaddr*>(&sockaddr);
-  socklen_t len = static_cast<socklen_t>(sizeof(sockaddr));
 
   int ret;
   int retry = 2;
index af98bb73a358bbc0147e440296d7a3a0375b940d..635a626c95b5d463d3c62da26831188f95866227 100644 (file)
@@ -59,13 +59,19 @@ std::unique_ptr<ClientSocket> ServerSocket::Accept() {
 
 void ServerSocket::Bind(const std::string& bindpoint) {
   struct sockaddr_un sockaddr = { 0, };
+  socklen_t len = 0;
   sockaddr.sun_family = AF_UNIX;
   snprintf(sockaddr.sun_path, sizeof(sockaddr.sun_path), "%s",
       bindpoint.c_str());
-  struct sockaddr* sockaddr_ptr = reinterpret_cast<struct sockaddr*>(&sockaddr);
-  socklen_t len = static_cast<socklen_t>(sizeof(sockaddr));
+  if (sockaddr.sun_path[0] == '@') {
+    len = offsetof(struct sockaddr_un, sun_path) + strlen(sockaddr.sun_path);
+    sockaddr.sun_path[0] = '\0';
+  } else {
+    len = sizeof(struct sockaddr_un);
+    unlink(bindpoint.c_str());
+  }
 
-  unlink(bindpoint.c_str());
+  struct sockaddr* sockaddr_ptr = reinterpret_cast<struct sockaddr*>(&sockaddr);
   int ret = bind(GetFd(), sockaddr_ptr, len);
   if (ret < 0) {
     ret = -errno;
index 728013493496d6d85b7581e254e2020022300226..389ff814341e5c638adf9b9a51a9d916de74d6b7 100644 (file)
@@ -647,11 +647,13 @@ int Util::SendCmdToAmd(enum AmdCmd cmd) {
 
 int Util::SendCmdToAmd(enum AmdCmd cmd, bundle* request, int opt) {
   try {
-    std::string endpoint = "/run/aul/daemons/.amd-sock";
-    if (access(endpoint.c_str(), F_OK) != 0) return -1;
+    constexpr const char PATH_AMD_SOCK[] = "@org.tizen.appfw.amd";
+
+    // TODO(Abstract Socket Issue): file-based socket check
+    if (access("/run/aul/daemons/.amd-sock", F_OK) != 0) return -1;
 
     ClientSocket socket;
-    socket.Connect(endpoint);
+    socket.Connect(PATH_AMD_SOCK);
     socket.SetReceiveBufferSize(Socket::kSocketMaxBufferSize);
     socket.SetReceiveTimeout(5000);
 
index f9fcae6ebded2a6cda4c48c4c7f65cc6f76ccc83..d73d858df5ddab3865871f7facfa459d0aae2d30 100644 (file)
@@ -40,8 +40,9 @@
 namespace launchpad {
 namespace {
 
-constexpr const char kHydraLoaderSocketName[] = ".hydra-loader";
-constexpr const char kHydraSigchldSocketName[] = ".hydra-sigchld-sock";
+constexpr const char kHydraLoaderSocketName[] = "@org.tizen.appfw.hydra-loader";
+constexpr const char kHydraSigchldSocketName[] =
+    "@org.tizen.appfw.hydra-sigchld";
 const int kSocketMaxBufferSize = 131071;
 const int kLoaderArgMax = 1024;
 
@@ -143,9 +144,10 @@ void LaunchpadHydra::OnPreCreate() {
   SignalManager::GetInst().SetEventListener(this);
 
   try {
-    std::string endpoint = "/run/aul/daemons/" + std::to_string(getuid()) +
-        "/" + std::string(kHydraLoaderSocketName) + std::to_string(GetType()) +
-        "-" + std::to_string(GetLoaderId());
+    std::string endpoint = std::string(kHydraLoaderSocketName) + "-" +
+                           std::to_string(getuid()) + "-" +
+                           std::to_string(GetType()) + "-" +
+                           std::to_string(GetLoaderId());
     socket_.reset(new ClientSocket());
     socket_->Connect(endpoint);
     socket_->SetReceiveBufferSize(kSocketMaxBufferSize);
@@ -209,8 +211,8 @@ void LaunchpadHydra::HandleLaunchEvent(const HydraRequest& request) {
 
 void LaunchpadHydra::HandleSigchldEvent(pid_t pid, int status) {
   try {
-    std::string endpoint = "/run/aul/daemons/" + std::to_string(getuid()) +
-        "/" + std::string(kHydraSigchldSocketName);
+    std::string endpoint = std::string(kHydraSigchldSocketName) + "-" +
+        std::to_string(getuid());
     auto socket = std::make_shared<ClientSocket>();
     socket->Connect(endpoint);
     socket->SetSendBufferSize(kSocketMaxBufferSize);
index 147b3d8989cbfc5ea0cb22671f601f77ba3feff0..e954e6b13c501579228c07c55fcee4189045b280 100644 (file)
@@ -43,9 +43,10 @@ namespace launchpad {
 namespace {
 
 const uint32_t kMaxRetryingCount = 600;
-constexpr const char kLaunchpadLoaderSocketName[] = ".launchpad-type";
+constexpr const char kLaunchpadTypeSocketName[] =
+    "@org.tizen.appfw.launchpad-type";
 constexpr const char kLaunchpadProcessPoolSock[] =
-    ".launchpad-process-pool-sock";
+    "@org.tizen.appfw.launchpad-process-pool";
 
 tizen_base::Bundle loader_bundle;
 LaunchpadLoader* context = nullptr;
@@ -154,9 +155,10 @@ void LaunchpadLoader::WaitForThreads(int threads) {
 }
 
 int LaunchpadLoader::ConnectToLaunchpad() {
-  std::string endpoint = "/run/aul/daemons/" + std::to_string(getuid()) +
-      "/" + std::string(kLaunchpadLoaderSocketName) +
-      std::to_string(loader_type_) + "-" + std::to_string(loader_id_);
+  std::string endpoint = std::string(kLaunchpadTypeSocketName) + "-" +
+                         std::to_string(getuid()) + "-" +
+                         std::to_string(loader_type_) + "-" +
+                         std::to_string(loader_id_);
   ClientSocket client_socket;
   client_socket.Connect(endpoint);
   client_socket.SetReceiveBufferSize(Socket::kSocketMaxBufferSize);