From 7bdbfb0d2decf11580ecbf6bc40bb3155eb01654 Mon Sep 17 00:00:00 2001 From: wangjianyu3 Date: Thu, 14 Aug 2025 21:45:53 +0800 Subject: [PATCH 01/10] system/init: Add system init Refer to the implementation of Android Init Language, consists of five broad classes of statements: Actions, Commands, Services, Options, and Imports. Actions support two types of triggers: event and action. Action triggers also support runtime triggering. Services support lifecycle management, including automatic restart (at specified intervals), and starting/stopping individually or by class. Import supports files or directories, and we may add a static method in the future. The following are some differences: 1. The Android Init Language treats lines starting with `#` as comments, while we use a preprocessor to handle comments. 2. For action commands, we can omit "exec" and directly execute built-in apps or nsh builtins. 3. Regarding the property service, users can either adapt it by self or directly use the preset NVS-based properties. 4. Only part of standard action commands and service options are implemented currlently. To enable system/init: ```diff -CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_ENTRYPOINT="init_main" +CONFIG_SYSTEM_INIT=y ``` For format and additional details, refer to: https://android.googlesource.com/platform/system/core/+/ master/init/README.md Signed-off-by: wangjianyu3 --- system/init/CMakeLists.txt | 39 +++ system/init/Kconfig | 117 +++++++ system/init/Make.defs | 25 ++ system/init/Makefile | 39 +++ system/init/action.c | 320 +++++++++++++++++++ system/init/action.h | 85 +++++ system/init/builtin.c | 184 +++++++++++ system/init/builtin.h | 38 +++ system/init/import.c | 60 ++++ system/init/import.h | 38 +++ system/init/init.c | 252 +++++++++++++++ system/init/init.h | 91 ++++++ system/init/parser.c | 288 +++++++++++++++++ system/init/parser.h | 60 ++++ system/init/service.c | 622 +++++++++++++++++++++++++++++++++++++ system/init/service.h | 138 ++++++++ 16 files changed, 2396 insertions(+) create mode 100644 system/init/CMakeLists.txt create mode 100644 system/init/Kconfig create mode 100644 system/init/Make.defs create mode 100644 system/init/Makefile create mode 100644 system/init/action.c create mode 100644 system/init/action.h create mode 100644 system/init/builtin.c create mode 100644 system/init/builtin.h create mode 100644 system/init/import.c create mode 100644 system/init/import.h create mode 100644 system/init/init.c create mode 100644 system/init/init.h create mode 100644 system/init/parser.c create mode 100644 system/init/parser.h create mode 100644 system/init/service.c create mode 100644 system/init/service.h diff --git a/system/init/CMakeLists.txt b/system/init/CMakeLists.txt new file mode 100644 index 000000000..02c7c0b80 --- /dev/null +++ b/system/init/CMakeLists.txt @@ -0,0 +1,39 @@ +# ############################################################################## +# apps/system/init/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you 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. +# +# ############################################################################## + +if(CONFIG_SYSTEM_INIT) + + set(CSRCS init.c action.c builtin.c import.c parser.c service.c) + + nuttx_add_application( + MODULE + ${CONFIG_SYSTEM_INIT} + NAME + ${CONFIG_SYSTEM_INIT_PROGNAME} + STACKSIZE + ${CONFIG_SYSTEM_INIT_STACKSIZE} + PRIORITY + ${CONFIG_SYSTEM_INIT_PRIORITY} + SRCS + ${CSRCS}) + +endif() diff --git a/system/init/Kconfig b/system/init/Kconfig new file mode 100644 index 000000000..e2d07cf50 --- /dev/null +++ b/system/init/Kconfig @@ -0,0 +1,117 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config SYSTEM_INIT + tristate "System Init" + default n + depends on LIBC_EXECFUNCS + depends on SCHED_CHILD_STATUS + ---help--- + Enable system init. + +if SYSTEM_INIT + +# +# Basic +# + +config SYSTEM_INIT_PRIORITY + int "Thread priority" + default 100 + +config SYSTEM_INIT_STACKSIZE + int "Stack size" + default DEFAULT_TASK_STACKSIZE + +config SYSTEM_INIT_PROGNAME + string "Program name" + default "init" + +# +# RC +# + +config SYSTEM_INIT_RC_LINE_MAX + int "Max line length of RC file" + default 128 + ---help--- + Maximum line length of RC file. + More details: https://android.googlesource.com/platform/system/core/+/master/init/README.md + +# +# Action +# + +config SYSTEM_INIT_ACTION_CMD_ARGS_MAX + int "Max number of command arguments" + default 8 + ---help--- + Maximum number of command arguments. + Form: + ``` + on + + + + ... + ``` + +config SYSTEM_INIT_ACTION_MANAGER_EVENT_MAX + int "Max number of action manager events" + default 32 + ---help--- + Maximum number of action manager events. + ``` + struct action_manager_s + { + ... + FAR char *events[CONFIG_SYSTEM_INIT_ACTION_MANAGER_EVENT_MAX]; + ... + }; + ``` + +# +# Service +# + +config SYSTEM_INIT_SERVICE_ARGS_MAX + int "Max number of service arguments" + default 8 + range 3 64 + ---help--- + Maximum number of service arguments, + including "name", "pathname" and key word "service"(at least 3). Form: + ``` + service [ ]* +