diff options
author | Artur Satayev <satayev@google.com> | 2021-02-15 20:48:49 +0000 |
---|---|---|
committer | Artur Satayev <satayev@google.com> | 2021-02-19 17:12:26 +0000 |
commit | 500946b637bcc2b509f7aaedffc4090809af9d98 (patch) | |
tree | 8f1e18bebf240193f02b6222d5dd9f4b0b31e5bd /init/builtins.cpp | |
parent | 83eae36647eef27b75b128c5bce4732229d2ca0d (diff) |
Introduce load_exports action.
The action reads a file with individual `export` actions declared on
each line, and calls `setenv` for each.
See go/updatable-classpath for details on how this is going to be used.
Bug: 180105615
Test: manual
Change-Id: I5390e52cf8ffd9c3babf31ed854eeecc727351eb
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r-- | init/builtins.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp index 6b7d1e950..dcc9582e2 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -292,6 +292,38 @@ static Result<void> do_export(const BuiltinArguments& args) { return {}; } +static Result<void> do_load_exports(const BuiltinArguments& args) { + auto file_contents = ReadFile(args[1]); + if (!file_contents.ok()) { + return Error() << "Could not read input file '" << args[1] + << "': " << file_contents.error(); + } + + auto lines = Split(*file_contents, "\n"); + for (const auto& line : lines) { + if (line.empty()) { + continue; + } + + auto env = Split(line, " "); + + if (env.size() != 3) { + return ErrnoError() << "Expected a line as `export <name> <value>`, found: `" << line + << "`"; + } + + if (env[0] != "export") { + return ErrnoError() << "Unknown action: '" << env[0] << "', expected 'export'"; + } + + if (setenv(env[1].c_str(), env[2].c_str(), 1) == -1) { + return ErrnoError() << "Failed to export '" << line << "' from " << args[1]; + } + } + + return {}; +} + static Result<void> do_hostname(const BuiltinArguments& args) { if (auto result = WriteFile("/proc/sys/kernel/hostname", args[1]); !result.ok()) { return Error() << "Unable to write to /proc/sys/kernel/hostname: " << result.error(); @@ -1404,6 +1436,7 @@ const BuiltinFunctionMap& GetBuiltinFunctionMap() { {"interface_restart", {1, 1, {false, do_interface_restart}}}, {"interface_start", {1, 1, {false, do_interface_start}}}, {"interface_stop", {1, 1, {false, do_interface_stop}}}, + {"load_exports", {1, 1, {false, do_load_exports}}}, {"load_persist_props", {0, 0, {false, do_load_persist_props}}}, {"load_system_props", {0, 0, {false, do_load_system_props}}}, {"loglevel", {1, 1, {false, do_loglevel}}}, |