diff --git a/test/mock/init/ueventd/ueventd.c b/test/mock/init/ueventd/ueventd.c index 2ce07268290f76444e474d6ce29dbe689e007e60..55cf173f0074cada5e307f97f3a67f05185ddb92 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 831814c917f36e4bce4d13ef4d662be46974a62d..6a0eacaa2fcf29a150fd131f71fc81103b0bd3da 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 f7e758947499a416853903056dfa9c17a217b594..51cb67cc84dff2e23e5c4c33882cc6c88cab17a7 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 5e74ab1995dcf02fd9c99df209b7f3c5f9c35fe5..15ebc87320b8d5ec9baf815f03c64163a79424c5 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 eb7c9eec26e3119e950036103f33bc2018cbcf63..05891f2b5e4e151d9a532272a7974f4d00931505 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();