From eed76e3a1c1ded0075bd5e879ef7494c65b91d93 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 1 Apr 2024 14:41:36 +0900 Subject: [PATCH] Modify rpc-port path creation This patch is for linux daemon and service. If the caller uid is less than 5000, the port creation function does not use the uid to create the port path. The aul library checks the prefix has a "d::" or not. If it has the prefix, aul returns the port path without using base64 encoding. Change-Id: I68431de1a37471f5f9d6089a27dcca4951b55b1c Signed-off-by: Hwankyu Jhun --- src/aul/aul_proc.cc | 45 +++++++++++++++++++++++++++++++++++++-------- src/aul/aul_rpc_port.cc | 10 +++++++++- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/aul/aul_proc.cc b/src/aul/aul_proc.cc index e592975..cbcf852 100644 --- a/src/aul/aul_proc.cc +++ b/src/aul/aul_proc.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -44,7 +45,10 @@ namespace { class ProcContext { public: ProcContext() {} - ~ProcContext() {} + ~ProcContext() { + if (source_ != 0) + g_source_remove(source_); + } void SetName(std::string name) { std::lock_guard lock(mutex_); @@ -69,6 +73,7 @@ class ProcContext { void SetFd(int fd) { std::lock_guard lock(mutex_); fd_.Set(fd); + source_ = g_unix_fd_add(fd, G_IO_IN, UnixFdFunc, this); } void Close() { @@ -82,10 +87,41 @@ class ProcContext { } private: + void Reset() { + std::lock_guard lock(mutex_); + name_ = ""; + fd_.Close(); + extra_ = tizen_base::Bundle(); + source_ = 0; + } + + static gboolean UnixFdFunc(gint fd, GIOCondition condition, + gpointer user_data) { + auto* proc_context = static_cast(user_data); + + if (condition & G_IO_IN) { + int ret = aul_sock_recv_result_with_fd(fd); + if (ret != 0) { + _E("Failed to receive result. fd(%d)", fd); + proc_context->Reset(); + return G_SOURCE_REMOVE; + } + _D("Result(%d) received", ret); + } else if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) { + _E("Socket was disconnected. fd(%d)", fd); + proc_context->Reset(); + return G_SOURCE_REMOVE; + } + + return G_SOURCE_CONTINUE; + } + + private: FileDescriptor fd_; std::string name_; tizen_base::Bundle extra_; mutable std::mutex mutex_; + guint source_; }; int ReadFromPath(const std::string& path, char* buf, size_t buf_size) { @@ -211,13 +247,6 @@ extern "C" API int aul_proc_register(const char* name, bundle* extra) { return ret; } - int res = aul_sock_recv_result_with_fd(ret); - if (res != 0) { - _E("Failed to receive the result. fd(%d)", res); - close(ret); - return AUL_R_ERROR; - } - context.SetFd(ret); context.SetName(name); if (extra) diff --git a/src/aul/aul_rpc_port.cc b/src/aul/aul_rpc_port.cc index 7a8d68b..592b1fe 100644 --- a/src/aul/aul_rpc_port.cc +++ b/src/aul/aul_rpc_port.cc @@ -40,8 +40,10 @@ using namespace aul::internal; namespace { constexpr const char kEndpoint[] = "org.tizen.rpcport"; -constexpr const char kInterfacePrefix[] = "org.tizen.rpcport._"; +constexpr const char kInterfacePrefix[] = "org.tizen.rpcport_."; constexpr const char kPathRunAulRpcPort[] = "/run/aul/rpcport/"; +constexpr const char kDPrefix[] = "d::"; +constexpr const char kUdPrefix[] = "ud::"; class WatchInfo { public: @@ -119,6 +121,12 @@ class WatchInfo { std::string GetInterfaceName(const std::string& app_id, const std::string& port_name, uid_t uid) { + if (app_id.compare(0, strlen(kDPrefix), kDPrefix) == 0) + return app_id + "::" + port_name; + + if (app_id.compare(0, strlen(kUdPrefix), kUdPrefix) == 0) + return std::to_string(uid) + "::" + app_id + "::" + port_name; + std::string name = kInterfacePrefix + app_id + "_" + port_name; char* checksum = g_compute_checksum_for_string(G_CHECKSUM_SHA1, name.c_str(), name.length()); -- 2.7.4