diff --git a/services/BUILD.gn b/services/BUILD.gn index b52f41253171f90bd38f66fe6fa544c64f4c5e69..4f26a0e7e765f02363f468db4ffebfad00fe9ac4 100755 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -128,7 +128,7 @@ if (defined(ohos_lite)) { "//base/startup/init_lite/interfaces/innerkits:libfsmanager_static", "//base/startup/init_lite/services/log:init_log", "//base/startup/init_lite/services/param:param_service", - "//base/startup/init_lite/ueventd:libueventd_static", + "//base/startup/init_lite/ueventd:libueventd_ramdisk_static", "//third_party/bounds_checking_function:libsec_static", "//third_party/cJSON:cjson_static", ] diff --git a/ueventd/BUILD.gn b/ueventd/BUILD.gn index ee6e897dcd9235212ae49ca6f01a873b3edbcec9..5621b0e2af1c3c571269c44e0647b166eb54f1f8 100755 --- a/ueventd/BUILD.gn +++ b/ueventd/BUILD.gn @@ -17,6 +17,7 @@ if (defined(ohos_lite)) { sources = [ "//base/startup/init_lite/services/utils/init_utils.c", "//base/startup/init_lite/services/utils/list.c", + "//base/startup/init_lite/ueventd/lite/ueventd_parameter.c", "//base/startup/init_lite/ueventd/ueventd.c", "//base/startup/init_lite/ueventd/ueventd_device_handler.c", "//base/startup/init_lite/ueventd/ueventd_firmware_handler.c", @@ -67,6 +68,7 @@ if (defined(ohos_lite)) { "//base/startup/init_lite/ueventd/ueventd_read_cfg.c", "//base/startup/init_lite/ueventd/ueventd_socket.c", ] + service_ueventd_include = [ "//third_party/bounds_checking_function/include", "//base/startup/init_lite/services/log", @@ -74,38 +76,40 @@ if (defined(ohos_lite)) { "//base/startup/init_lite/services/utils", "//base/startup/init_lite/ueventd/include", ] + service_ueventd_deps = [ "//base/startup/init_lite/services/log:init_log", "//base/startup/init_lite/services/utils:libinit_utils", "//third_party/bounds_checking_function:libsec_static", ] - group("startup_ueventd") { deps = [ - "//base/startup/init_lite/ueventd:libueventd_static", + "//base/startup/init_lite/ueventd:libueventd_ramdisk_static", "//base/startup/init_lite/ueventd:ueventd", "//base/startup/init_lite/ueventd:ueventd.config", ] } - ohos_static_library("libueventd_static") { + + ohos_static_library("libueventd_ramdisk_static") { sources = service_ueventd_sources include_dirs = service_ueventd_include deps = service_ueventd_deps + defines = [ "__RAMDISK__" ] } ohos_executable("ueventd") { - sources = [ "//base/startup/init_lite/ueventd/ueventd_main.c" ] - include_dirs = [ - "//base/startup/init_lite/ueventd/include", - "//base/startup/init_lite/services/log", - "//base/startup/init_lite/services/include", + sources = service_ueventd_sources + sources += [ + "//base/startup/init_lite/ueventd/standard/ueventd_parameter.c", + "//base/startup/init_lite/ueventd/ueventd_main.c", ] - - deps = [ "//base/startup/init_lite/ueventd:libueventd_static" ] + include_dirs = service_ueventd_include + include_dirs += [ "//base/startup/init_lite/services/include/param" ] + deps = service_ueventd_deps + deps += [ "//base/startup/init_lite/services/param:param_client" ] install_images = [ "system", "updater", - "ramdisk", ] install_enable = true part_name = "init" diff --git a/ueventd/etc/ueventd.config b/ueventd/etc/ueventd.config index f24d849ab5cb2847ed9ab90fa40127adfe48ce82..dfe3137f072c8ccd62a04c3709b5f53392a5aa85 100755 --- a/ueventd/etc/ueventd.config +++ b/ueventd/etc/ueventd.config @@ -12,7 +12,7 @@ # limitations under the License. [device] -# +# /dev/binder 0666 0 0 /dev/input/event0 0660 0 0 /dev/input/event1 0660 0 1004 diff --git a/ueventd/include/ueventd_parameter.h b/ueventd/include/ueventd_parameter.h new file mode 100644 index 0000000000000000000000000000000000000000..212ae729e37b4177798b7b38a4544a040684dacf --- /dev/null +++ b/ueventd/include/ueventd_parameter.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BASE_STARTUP_INITLITE_UEVENTD_PARAMETER_H +#define BASE_STARTUP_INITLITE_UEVENTD_PARAMETER_H + +int SetUeventDeviceParameter(const char *devNode, const char *paramValue); + +#endif diff --git a/ueventd/include/ueventd_read_cfg.h b/ueventd/include/ueventd_read_cfg.h index bed341b0f3906063e1b84629c63abfb122334747..5ccf91bfcdd8c550b117fad56bb844607aecaa9f 100755 --- a/ueventd/include/ueventd_read_cfg.h +++ b/ueventd/include/ueventd_read_cfg.h @@ -29,6 +29,7 @@ struct DeviceUdevConf { mode_t mode; uid_t uid; gid_t gid; + const char *parameter; struct ListNode list; }; @@ -53,6 +54,7 @@ void ParseUeventdConfigFile(const char *file); void GetDeviceNodePermissions(const char *devNode, uid_t *uid, gid_t *gid, mode_t *mode); void ChangeSysAttributePermissions(const char *sysPath); int ParseUeventConfig(char *buffer); +struct DeviceUdevConf *GetDeviceUdevConfByDevNode(const char *devNode); #ifdef __cplusplus } #endif diff --git a/ueventd/lite/ueventd_parameter.c b/ueventd/lite/ueventd_parameter.c new file mode 100644 index 0000000000000000000000000000000000000000..9e5c415d9d763c7532d3782099a625f3dcb793a4 --- /dev/null +++ b/ueventd/lite/ueventd_parameter.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// lite release not support set parameter. +int SetUeventDeviceParameter(const char *devNode, const char *paramValue) +{ + (void)(devNode); + (void)(paramValue); + return 0; +} diff --git a/ueventd/standard/ueventd_parameter.c b/ueventd/standard/ueventd_parameter.c new file mode 100644 index 0000000000000000000000000000000000000000..11dfac450e4f57496fe537e2121521723f6c632d --- /dev/null +++ b/ueventd/standard/ueventd_parameter.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "sys_param.h" +#include "ueventd_read_cfg.h" +#include "ueventd_utils.h" +#define INIT_LOG_TAG "ueventd" +#include "init_log.h" + +int SetUeventDeviceParameter(const char *devNode, const char *paramValue) +{ + if (INVALIDSTRING(devNode) || INVALIDSTRING(paramValue)) { + return -1; + } + struct DeviceUdevConf *config = GetDeviceUdevConfByDevNode(devNode); + if ((config != NULL) && (config->parameter != NULL)) { + if (SystemSetParameter(config->parameter, paramValue) != 0) { + INIT_LOGE("[uevent][error] set device parameter %s failed", config->parameter); + return -1; + } + } + return 0; +} diff --git a/ueventd/ueventd_device_handler.c b/ueventd/ueventd_device_handler.c index 7d0be07b8216cc51e5b9f4f8b841f81ea4c3a0bb..0e100c6b7a72ff20f7073ec6a2b859c7e52ef26a 100755 --- a/ueventd/ueventd_device_handler.c +++ b/ueventd/ueventd_device_handler.c @@ -26,6 +26,9 @@ #include "init_utils.h" #include "list.h" #include "ueventd.h" +#ifndef __RAMDISK__ +#include "ueventd_parameter.h" +#endif #include "ueventd_read_cfg.h" #include "ueventd_utils.h" #include "securec.h" @@ -302,10 +305,22 @@ static void HandleDeviceNode(const struct Uevent *uevent, const char *deviceNode if (action == ACTION_ADD) { if (CreateDeviceNode(uevent, deviceNode, symLinks, isBlock) < 0) { INIT_LOGE("Create device \" %s \" failed", deviceNode); + } else { +#ifndef __RAMDISK__ + if (SetUeventDeviceParameter(deviceNode, "added") != 0) { + INIT_LOGE("Set device parameter added failed"); + } +#endif } } else if (action == ACTION_REMOVE) { if (RemoveDeviceNode(deviceNode, symLinks) < 0) { INIT_LOGE("Remove device \" %s \" failed", deviceNode); + } else { +#ifndef __RAMDISK__ + if (SetUeventDeviceParameter(deviceNode, "removed") != 0) { + INIT_LOGE("Set device parameter removed failed"); + } +#endif } } else if (action == ACTION_CHANGE) { INIT_LOGI("Device %s changed", uevent->syspath); diff --git a/ueventd/ueventd_read_cfg.c b/ueventd/ueventd_read_cfg.c index 47467d7bfd83a88f12bf23a30d5a072aca19e74c..02262db72fd0925a2fe7f9e4f7891cc4f91db50a 100755 --- a/ueventd/ueventd_read_cfg.c +++ b/ueventd/ueventd_read_cfg.c @@ -44,6 +44,7 @@ #define DEVICE_CONFIG_MODE_NUM 1 #define DEVICE_CONFIG_UID_NUM 2 #define DEVICE_CONFIG_GID_NUM 3 +#define DEVICE_CONFIG_PARAM_NUM 4 typedef enum SECTION { SECTION_INVALID = -1, @@ -78,12 +79,12 @@ static int ParseDeviceConfig(char *p) INIT_LOGD("Parse device config info: %s", p); char **items = NULL; int count = -1; - // format: - const int expectedCount = 4; + // format: + const int expectedCount = 5; INIT_CHECK_ONLY_ELOG(!INVALIDSTRING(p), "Invalid argument"); items = SplitStringExt(p, " ", &count, expectedCount); - if (count != expectedCount) { + if ((count != expectedCount) && (count != expectedCount - 1)) { INIT_LOGE("Ignore invalid item: %s", p); FreeStringVector(items, count); return 0; @@ -102,6 +103,11 @@ static int ParseDeviceConfig(char *p) "Invalid mode in config file for device node %s. use default mode", config->name); config->uid = (uid_t)DecodeUid(items[DEVICE_CONFIG_UID_NUM]); config->gid = (gid_t)DecodeUid(items[DEVICE_CONFIG_GID_NUM]); + if (count == expectedCount) { + config->parameter = strdup(items[DEVICE_CONFIG_PARAM_NUM]); // device parameter + } else { + config->parameter = NULL; + } ListAddTail(&g_devices, &config->list); FreeStringVector(items, count); return 0; @@ -335,6 +341,24 @@ bool IsMatch(const char *target, const char *pattern) return (*p == '\0') ? true : false; } +struct DeviceUdevConf *GetDeviceUdevConfByDevNode(const char *devNode) +{ + if (INVALIDSTRING(devNode)) { + return NULL; + } + + struct ListNode *node = NULL; + if (!ListEmpty(g_devices)) { + ForEachListEntry(&g_devices, node) { + struct DeviceUdevConf *config = ListEntry(node, struct DeviceUdevConf, list); + if (IsMatch(devNode, config->name)) { + return config; + } + } + } + return NULL; +} + void GetDeviceNodePermissions(const char *devNode, uid_t *uid, gid_t *gid, mode_t *mode) { if (INVALIDSTRING(devNode)) { diff --git a/ueventd/ueventd_socket.c b/ueventd/ueventd_socket.c index b6a9e6f263d83aed85be248132cdf5935b8257ae..37055376131d091b8be8c84ac2fa644775dfbf15 100755 --- a/ueventd/ueventd_socket.c +++ b/ueventd/ueventd_socket.c @@ -38,7 +38,7 @@ int UeventdSocketInit(void) int buffSize = UEVENT_SOCKET_BUFF_SIZE; int on = 1; - if (memset_s(&addr, sizeof(addr), 0, sizeof(addr) != EOK)) { + if (memset_s(&addr, sizeof(addr), 0, sizeof(addr)) != EOK) { INIT_LOGE("Faild to clear socket address"); return -1; }