From 26cefa2a2d59f7659a2ab9fea3b3abeb9769f47c Mon Sep 17 00:00:00 2001
From: Esben Haabendal <esben@geanix.com>
Date: Thu, 9 Mar 2023 20:25:56 +0100
Subject: [PATCH] openharmony-standard: Run faultloggerd as systemd service

Signed-off-by: Esben Haabendal <esben@geanix.com>
---
 .../openharmony/files/faultloggerd.service    | 14 ++++-
 .../openharmony/files/openharmony-preinit     |  6 --
 .../faultloggerd-sd-notify.patch              | 58 +++++++++++++++++++
 .../faultloggerd-socket-path.patch            | 32 ++++++++++
 .../openharmony/openharmony-standard_3.0.bb   |  4 +-
 5 files changed, 104 insertions(+), 10 deletions(-)
 create mode 100644 recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-sd-notify.patch
 create mode 100644 recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-socket-path.patch

diff --git a/recipes-openharmony/openharmony/files/faultloggerd.service b/recipes-openharmony/openharmony/files/faultloggerd.service
index 72d74493..a551c141 100644
--- a/recipes-openharmony/openharmony/files/faultloggerd.service
+++ b/recipes-openharmony/openharmony/files/faultloggerd.service
@@ -2,9 +2,17 @@
 Description=OpenHarmony FaultLogger daemon
 
 [Service]
-Type=oneshot
-ExecStart=/bin/echo "OpenHarmony FaultLogger Service"
-RemainAfterExit=yes
+Type=notify
+# UserType::OVERSEAS_COMMERCIAL
+ExecStartPre=setparam ro.logsystem.usertype 6
+ExecStartPre=!install -o root -g system -m 0755 -d /run/openharmony/faultlogger
+ExecStartPre=!install -o system -g log -m 0770 -d /data/log
+ExecStartPre=!install -o system -g system -m 0770 -d /data/log/faultlog
+ExecStartPre=!install -o system -g system -m 0770 -d /data/log/faultlog/temp
+User=root
+Group=system
+SupplementaryGroups=log
+ExecStart=/usr/bin/faultloggerd
 
 [Install]
 WantedBy=multi-user.target
diff --git a/recipes-openharmony/openharmony/files/openharmony-preinit b/recipes-openharmony/openharmony/files/openharmony-preinit
index 4455f065..86574241 100644
--- a/recipes-openharmony/openharmony/files/openharmony-preinit
+++ b/recipes-openharmony/openharmony/files/openharmony-preinit
@@ -136,12 +136,6 @@ fi
 #sa_main /system/profile/dps_service.xml & # SA: 1401 180 3502
 #sleep "$STARTUP_CMD_SLEEP"
 
-if systemctl -q is-enabled faultloggerd.service; then
-    echo >/dev/console "Starting OpenHarmony faultlogger service"
-    setparam ro.logsystem.usertype 6 # UserType::OVERSEAS_COMMERCIAL
-    /system/bin/faultloggerd &
-fi
-
 # trigger: boot?
 # "name" : "hdcd",
 # "path" : ["/system/bin/hdcd"],
diff --git a/recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-sd-notify.patch b/recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-sd-notify.patch
new file mode 100644
index 00000000..b64288b3
--- /dev/null
+++ b/recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-sd-notify.patch
@@ -0,0 +1,58 @@
+# SPDX-FileCopyrightText: Huawei Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+Patch for //base/hiviewdfx/faultloggerd of OpenHarmony 3.0 codebase
+
+This adds sd_notify(3) ready notification to faultlogger service for better
+integration with systemd.
+
+Signed-off-by: Esben Haabendal <esben@geanix.com>
+Upstream-Status: Pending
+
+diff --git a/services/fault_logger_daemon.cpp b/services/fault_logger_daemon.cpp
+index ed7794cfbfc7..e0b35c44a48c 100644
+--- a/services/fault_logger_daemon.cpp
++++ b/services/fault_logger_daemon.cpp
+@@ -32,6 +32,8 @@
+ #include <hilog/log.h>
+ #include <securec.h>
+ 
++#include <systemd/sd-daemon.h>
++
+ #include "fault_logger_daemon.h"
+ #include "faultloggerd_client.h"
+ 
+@@ -44,11 +46,7 @@ constexpr int32_t MAX_CONNECTION = 4;
+ constexpr int32_t REQUEST_BUF_SIZE = 1024;
+ constexpr int32_t MSG_BUF_SIZE = 256;
+ constexpr int32_t SYSTEM_UID = 1000;
+-#if defined(USE_MUSL)
+-static const char FAULTLOGGERD_SOCK_PATH[] = "/dev/unix/socket/faultloggerd.server";
+-#else
+-static const char FAULTLOGGERD_SOCK_PATH[] = "/dev/socket/faultloggerd.server";
+-#endif
++static const char FAULTLOGGERD_SOCK_PATH[] = "/run/openharmony/faultlogger/server";
+ static const char FAULTLOGGERD_BASE_PATH[] = "/data/log/faultlog/temp/";
+ 
+ static std::string GetRequestTypeName(int32_t type)
+@@ -254,6 +252,7 @@ int32_t StartServer(int argc, char *argv[])
+         return -1;
+     }
+ 
++    sd_notify(0, "READY=1");
+     struct sockaddr_un clientAddr;
+     socklen_t clientAddrSize = sizeof(clientAddr);
+     int connectionFd = -1;
+diff --git a/services/BUILD.gn b/services/BUILD.gn
+index f48777a7cdbf..847e3cf79510 100644
+--- a/services/BUILD.gn
++++ b/services/BUILD.gn
+@@ -63,6 +63,7 @@ ohos_executable("faultloggerd") {
+     "$faultloggerd_path/interfaces/innerkits/faultloggerd_client:libfaultloggerd",
+     "//utils/native/base:utils",
+   ]
++  libs = [ "systemd" ]
+ 
+   if (is_standard_system) {
+     external_deps = [ "hiviewdfx_hilog_native:libhilog" ]
diff --git a/recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-socket-path.patch b/recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-socket-path.patch
new file mode 100644
index 00000000..84726e40
--- /dev/null
+++ b/recipes-openharmony/openharmony/openharmony-standard-3.0/faultloggerd-socket-path.patch
@@ -0,0 +1,32 @@
+# SPDX-FileCopyrightText: Huawei Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+Patch for //base/hiviewdfx/faultloggerd of OpenHarmony 3.0 codebase
+
+Configure faultloggerd service to place Unix socket in /run instead of /dev (where
+they obviously does not belong).
+
+Having a dedicated directory for this makes it easier to handle permissions in a
+safe way.
+
+Signed-off-by: Esben Haabendal <esben@geanix.com>
+Upstream-Status: Inappropriate [configuration]
+
+diff --git a/interfaces/innerkits/faultloggerd_client/faultloggerd_client.cpp b/interfaces/innerkits/faultloggerd_client/faultloggerd_client.cpp
+index 704ae9c0cbd7..4456eb29b87c 100644
+--- a/interfaces/innerkits/faultloggerd_client/faultloggerd_client.cpp
++++ b/interfaces/innerkits/faultloggerd_client/faultloggerd_client.cpp
+@@ -31,11 +31,7 @@
+ 
+ namespace {
+ static const int32_t SOCKET_BUFFER_SIZE = 256;
+-#if defined(USE_MUSL)
+-static const char FAULTLOGGERD_SOCK_PATH[] = "/dev/unix/socket/faultloggerd.server";
+-#else
+-static const char FAULTLOGGERD_SOCK_PATH[] = "/dev/socket/faultloggerd.server";
+-#endif
++static const char FAULTLOGGERD_SOCK_PATH[] = "/run/openharmony/faultlogger/server";
+ }
+ 
+ static int ReadFileDescriptorFromSocket(int socket)
diff --git a/recipes-openharmony/openharmony/openharmony-standard_3.0.bb b/recipes-openharmony/openharmony/openharmony-standard_3.0.bb
index 2ec718c1..363ceb80 100644
--- a/recipes-openharmony/openharmony/openharmony-standard_3.0.bb
+++ b/recipes-openharmony/openharmony/openharmony-standard_3.0.bb
@@ -82,6 +82,8 @@ SRC_URI += "file://installs-sd-notify.patch;patchdir=${S}/foundation/appexecfwk/
 SRC_URI += "file://deviceauth-sd-notify.patch;patchdir=${S}/base/security/deviceauth"
 
 SRC_URI += "file://base_hiviewdfx_hiview-libfaultlogger-static.patch;patchdir=${S}/base/hiviewdfx/hiview"
+SRC_URI += "file://faultloggerd-socket-path.patch;patchdir=${S}/base/hiviewdfx/faultloggerd"
+SRC_URI += "file://faultloggerd-sd-notify.patch;patchdir=${S}/base/hiviewdfx/faultloggerd"
 
 # Patch to allow /system/profile and /system/usr to be symlinks to /usr/lib/openharmony
 SRC_URI += "file://foundation_distributedschedule_safwk-slash-system-symlink.patch;patchdir=${S}/foundation/distributedschedule/safwk"
@@ -1623,7 +1625,7 @@ FILES:${PN}-faultlogger = " \
     ${libdir}/libfaultloggerd*${SOLIBS} \
     ${libdir}/libdfx_signalhandler*${SOLIBS} \
 "
-RDEPENDS:${PN}-faultlogger += "musl libcxx"
+RDEPENDS:${PN}-faultlogger += "musl libcxx libsystemd"
 RDEPENDS:${PN}-faultlogger += "${PN}-libutils ${PN}-hilog"
 RDEPENDS:${PN} += "${PN}-faultlogger"
 
-- 
GitLab