1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:48:12 +00:00

LibCore: Use Core::Environment instead of manually iterating environ

This commit is contained in:
Sam Atkins 2024-01-30 16:38:56 +00:00 committed by Sam Atkins
parent 56b8e248a5
commit 97cb9cf469

View file

@ -15,6 +15,7 @@
#include <AK/String.h> #include <AK/String.h>
#include <AK/Vector.h> #include <AK/Vector.h>
#include <Kernel/API/BeepInstruction.h> #include <Kernel/API/BeepInstruction.h>
#include <LibCore/Environment.h>
#include <LibCore/SessionManagement.h> #include <LibCore/SessionManagement.h>
#include <LibCore/System.h> #include <LibCore/System.h>
#include <limits.h> #include <limits.h>
@ -1273,18 +1274,12 @@ ErrorOr<void> adjtime(const struct timeval* delta, struct timeval* old_delta)
ErrorOr<void> exec_command(Vector<StringView>& command, bool preserve_env) ErrorOr<void> exec_command(Vector<StringView>& command, bool preserve_env)
{ {
Vector<StringView> exec_environment; Vector<StringView> exec_environment;
for (size_t i = 0; environ[i]; ++i) { for (auto entry : Environment::entries()) {
StringView env_view { environ[i], strlen(environ[i]) };
auto maybe_needle = env_view.find('=');
if (!maybe_needle.has_value())
continue;
// FIXME: Allow a custom selection of variables once ArgsParser supports options with optional parameters. // FIXME: Allow a custom selection of variables once ArgsParser supports options with optional parameters.
if (!preserve_env && env_view.substring_view(0, maybe_needle.value()) != "TERM"sv) if (!preserve_env && entry.name != "TERM"sv)
continue; continue;
exec_environment.append(env_view); exec_environment.append(entry.full_entry);
} }
TRY(Core::System::exec(command.at(0), command, Core::System::SearchInPath::Yes, exec_environment)); TRY(Core::System::exec(command.at(0), command, Core::System::SearchInPath::Yes, exec_environment));
@ -1322,8 +1317,7 @@ ErrorOr<void> exec(StringView filename, ReadonlySpan<StringView> arguments, Sear
if (environment.has_value()) { if (environment.has_value()) {
env_count = environment->size(); env_count = environment->size();
} else { } else {
for (size_t i = 0; environ[i]; ++i) env_count = Core::Environment::size();
++env_count;
} }
auto environment_strings = TRY(FixedArray<Syscall::StringArgument>::create(env_count)); auto environment_strings = TRY(FixedArray<Syscall::StringArgument>::create(env_count));
@ -1332,8 +1326,9 @@ ErrorOr<void> exec(StringView filename, ReadonlySpan<StringView> arguments, Sear
environment_strings[i] = { environment->at(i).characters_without_null_termination(), environment->at(i).length() }; environment_strings[i] = { environment->at(i).characters_without_null_termination(), environment->at(i).length() };
} }
} else { } else {
for (size_t i = 0; i < env_count; ++i) { size_t i = 0;
environment_strings[i] = { environ[i], strlen(environ[i]) }; for (auto entry : Core::Environment::entries()) {
environment_strings[i++] = { entry.full_entry.characters_without_null_termination(), entry.full_entry.length() };
} }
} }
params.environment.strings = environment_strings.data(); params.environment.strings = environment_strings.data();