system/nxinit: add 'set' builtin command for environment variables

Previously, 'set KEY VALUE' in init.rc was not recognized as a builtin
command. It fell through to posix_spawnp(), which ran it in a
temporary child shell. The environment variable was set only in the
child process and lost when it exited, so services started afterward
never inherited it.

Register cmd_set as an init builtin that calls setenv(key, value, 1)
directly in the init process. The command takes exactly 2 arguments
(key and value). All code is guarded by CONFIG_DISABLE_ENVIRON so it
compiles out when environment support is disabled.

Since child processes inherit init's environment, 'set TZ Asia/Shanghai'
in init.rc now correctly propagates to all subsequently started
services.

Signed-off-by: wangjianyu3 <wangjianyu3@xiaomi.com>
This commit is contained in:
wangjianyu3 2026-08-26 22:54:16 +08:00 committed by Alan C. Assis
parent ec33a924a5
commit 11c1c6bece

View file

@ -64,6 +64,10 @@ static int cmd_start(FAR struct action_manager_s *am,
int argc, FAR char **argv);
static int cmd_stop(FAR struct action_manager_s *am,
int argc, FAR char **argv);
#ifndef CONFIG_DISABLE_ENVIRON
static int cmd_set(FAR struct action_manager_s *am,
int argc, FAR char **argv);
#endif
#if CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX > 1
static int cmd_setprop(FAR struct action_manager_s *am,
int argc, FAR char **argv);
@ -107,6 +111,9 @@ static const struct cmd_map_s g_builtin[] =
{"class_stop", 2, 2, cmd_class_stop},
{"exec", 3, 99, cmd_exec},
{"exec_start", 2, 2, cmd_exec_start},
#ifndef CONFIG_DISABLE_ENVIRON
{"set", 3, 3, cmd_set},
#endif
#if CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX > 1
{"setprop", 3, 3, cmd_setprop},
#endif
@ -221,6 +228,16 @@ static int cmd_stop(FAR struct action_manager_s *am,
return init_service_stop(service);
}
#ifndef CONFIG_DISABLE_ENVIRON
static int cmd_set(FAR struct action_manager_s *am,
int argc, FAR char **argv)
{
UNUSED(am);
init_info("setenv '%s' '%s'", argv[1], argv[2]);
return setenv(argv[1], argv[2], 1);
}
#endif
#if CONFIG_SYSTEM_NXINIT_ACTION_EVENTS_MAX > 1
static int cmd_setprop(FAR struct action_manager_s *am, int argc,
FAR char **argv)