From d1e59d44ff2b5c1de477b1521602f7cd7621ee8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=B5=A9?= Date: Mon, 16 Jun 2025 11:06:07 +0800 Subject: [PATCH] add special uevent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 杨浩 --- test/mock/init/ueventd/ueventd.c | 10 +++++- .../ueventd/ueventd_event_unittest.cpp | 18 +++++++++++ ueventd/include/ueventd.h | 5 +-- ueventd/ueventd.c | 31 ++++++++++++------- ueventd/ueventd_main.c | 4 +-- 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/test/mock/init/ueventd/ueventd.c b/test/mock/init/ueventd/ueventd.c index 2ce072682..55cf173f0 100644 --- a/test/mock/init/ueventd/ueventd.c +++ b/test/mock/init/ueventd/ueventd.c @@ -12,8 +12,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#include "ueventd.h" void RetriggerUeventByPath(int sockFd, char *path) { return; +} + +void RetriggerSpecialUevent(int sockFd, char *path, CompareUevent compare, Uevent *event) +{ + if (event == NULL || compare == NULL) { + return -1; + } + return compare(event); } \ No newline at end of file diff --git a/test/unittest/ueventd/ueventd_event_unittest.cpp b/test/unittest/ueventd/ueventd_event_unittest.cpp index 831814c91..6a0eacaa2 100644 --- a/test/unittest/ueventd/ueventd_event_unittest.cpp +++ b/test/unittest/ueventd/ueventd_event_unittest.cpp @@ -247,6 +247,19 @@ static int TestRetriggerUeventByPath(int sockFd, char *path) return 0; } +static int TestRetriggerSpecialUevent(int sockFd, char *path, CompareUevent compare, Uevent *event) +{ + return RetriggerSpecialUevent(sockFd, path, compare, event); +} + +static int CompareUserData(Uevent *uevent) +{ + if (uevent == nullptr) { + return -1; + } + return strcmp(uevent->partName, "userdata"); +} + HWTEST_F(UeventdEventUnitTest, Init_UeventdEventUnitTest_ParseUeventdEvent001, TestSize.Level1) { struct Uevent uevent = { @@ -516,6 +529,11 @@ HWTEST_F(UeventdEventUnitTest, Init_UeventdEventUnitTest_Handle001, TestSize.Lev char path[] = {"/data/ueventd"}; int ret = TestRetriggerUeventByPath(g_oldRootFd, path); EXPECT_EQ(ret, 0); + struct Uevent uevent = { + .partName = "userdata", + }; + int ret = TestRetriggerSpecialUevent(g_oldRootFd, path, CompareUserData, &uevent); + EXPECT_EQ(ret, 0); } HWTEST_F(UeventdEventUnitTest, Init_UeventdEventUnitTest_FirmwareUevent001, TestSize.Level1) diff --git a/ueventd/include/ueventd.h b/ueventd/include/ueventd.h index f7e758947..51cb67cc8 100644 --- a/ueventd/include/ueventd.h +++ b/ueventd/include/ueventd.h @@ -71,13 +71,14 @@ typedef enum SUBYSTEM { #define UEVENTD_FLAG "/dev/.ueventd_trigger_done" extern char bootDevice[CMDLINE_VALUE_LEN_MAX]; - +typedef int (* CompareUevent)(struct Uevent *event); const char *ActionString(ACTION action); void ParseUeventMessage(const char *buffer, ssize_t length, struct Uevent *uevent); void RetriggerUevent(int sockFd, char **devices, int num); void RetriggerUeventByPath(int sockFd, char *path); void RetriggerDmUeventByPath(int sockFd, char *path, char **devices, int num); -void ProcessUevent(int sockFd, char **devices, int num); +void RetriggerSpecialUevent(int sockFd, char *path, char **devices, int num, CompareUevent compare); +void ProcessUevent(int sockFd, char **devices, int num, CompareUevent compare); void CloseUeventConfig(void); #ifdef __cplusplus #if __cplusplus diff --git a/ueventd/ueventd.c b/ueventd/ueventd.c index 5e74ab199..15ebc8732 100644 --- a/ueventd/ueventd.c +++ b/ueventd/ueventd.c @@ -289,7 +289,7 @@ void ParseUeventMessage(const char *buffer, ssize_t length, struct Uevent *ueven } } -void ProcessUevent(int sockFd, char **devices, int num) +void ProcessUevent(int sockFd, char **devices, int num, CompareUevent compare) { // One more bytes for '\0' char ueventBuffer[UEVENT_BUFFER_SIZE] = {}; @@ -301,6 +301,10 @@ void ProcessUevent(int sockFd, char **devices, int num) INIT_LOGV("Ignore unexpected uevent"); return; } + if (compare != NULL) { + int ret = compare(&uevent); + INIT_CHECK(ret ==0, return); + } if (devices != NULL && num > 0) { HandleUeventRequired(&uevent, devices, num); } else { @@ -309,7 +313,7 @@ void ProcessUevent(int sockFd, char **devices, int num) } } -static void DoTrigger(const char *ueventPath, int sockFd, char **devices, int num) +static void DoTrigger(const char *ueventPath, int sockFd, char **devices, int num, CompareUevent compare) { if (ueventPath == NULL || ueventPath[0] == '\0') { return; @@ -332,11 +336,11 @@ static void DoTrigger(const char *ueventPath, int sockFd, char **devices, int nu // uevent triggered, now handle it. if (sockFd >= 0) { - ProcessUevent(sockFd, devices, num); + ProcessUevent(sockFd, devices, num, compare); } } -static void Trigger(const char *path, int sockFd, char **devices, int num) +static void Trigger(const char *path, int sockFd, char **devices, int num, CompareUevent compare) { if (path == NULL) { return; @@ -355,7 +359,7 @@ static void Trigger(const char *path, int sockFd, char **devices, int num) if (snprintf_s(pathBuffer, PATH_MAX, PATH_MAX - 1, "%s/%s", path, dirent->d_name) == -1) { continue; } - Trigger(pathBuffer, sockFd, devices, num); + Trigger(pathBuffer, sockFd, devices, num, compare); } else { if (strcmp(dirent->d_name, "uevent") != 0) { continue; @@ -365,7 +369,7 @@ static void Trigger(const char *path, int sockFd, char **devices, int num) INIT_LOGW("Cannot build uevent path under %s", path); continue; } - DoTrigger(ueventBuffer, sockFd, devices, num); + DoTrigger(ueventBuffer, sockFd, devices, num, compare); } } closedir(dir); @@ -373,19 +377,24 @@ static void Trigger(const char *path, int sockFd, char **devices, int num) void RetriggerUeventByPath(int sockFd, char *path) { - Trigger(path, sockFd, NULL, 0); + Trigger(path, sockFd, NULL, 0, NULL); } void RetriggerDmUeventByPath(int sockFd, char *path, char **devices, int num) { - Trigger(path, sockFd, devices, num); + Trigger(path, sockFd, devices, num, NULL); +} + +void RetriggerSpecialUevent(int sockFd, char *path, char **devices, int num, CompareUevent compare) +{ + Trigger(path, sockFd, devices, num, compare); } void RetriggerUevent(int sockFd, char **devices, int num) { int ret = GetParameterFromCmdLine("default_boot_device", bootDevice, CMDLINE_VALUE_LEN_MAX); INIT_CHECK_ONLY_ELOG(ret == 0, "Failed get default_boot_device value from cmdline"); - Trigger("/sys/block", sockFd, devices, num); - Trigger("/sys/class", sockFd, devices, num); - Trigger("/sys/devices", sockFd, devices, num); + Trigger("/sys/block", sockFd, devices, num, NULL); + Trigger("/sys/class", sockFd, devices, num, NULL); + Trigger("/sys/devices", sockFd, devices, num, NULL); } diff --git a/ueventd/ueventd_main.c b/ueventd/ueventd_main.c index eb7c9eec2..05891f2b5 100644 --- a/ueventd/ueventd_main.c +++ b/ueventd/ueventd_main.c @@ -67,7 +67,7 @@ static void PollUeventdSocketTimeout(int ueventSockFd, bool ondemand) return; } if (pfd.revents & (POLLIN | POLLERR)) { - ProcessUevent(ueventSockFd, NULL, 0); // Not require boot devices + ProcessUevent(ueventSockFd, NULL, 0, NULL); // Not require boot devices } } } @@ -119,7 +119,7 @@ static int UeventdDaemon(int listen_only) (void)close(fd); } else { INIT_LOGI("ueventd start to process uevent message"); - ProcessUevent(ueventSockFd, NULL, 0); // Not require boot devices + ProcessUevent(ueventSockFd, NULL, 0, NULL); // Not require boot devices); // Not require boot devices } PollUeventdSocketTimeout(ueventSockFd, ondemand); CloseUeventConfig(); -- Gitee