summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <thakis@chromium.org>2020-07-05 10:01:05 -0400
committerAndreas Kling <kling@serenityos.org>2020-07-05 16:03:23 +0200
commit9cc32d6e9588685b452f1bccbc77e9389056a052 (patch)
tree4dddaba7522c8298f37c834c64ceae0b90692de3
parent131bc8fd31a43c385e04d4d634e1dda180bbff24 (diff)
downloadserenity-9cc32d6e9588685b452f1bccbc77e9389056a052.zip
Userland+MenuApplets: Replace two more fork/exec with posix_spawn
-rw-r--r--MenuApplets/Clock/main.cpp13
-rw-r--r--Userland/watch.cpp49
2 files changed, 26 insertions, 36 deletions
diff --git a/MenuApplets/Clock/main.cpp b/MenuApplets/Clock/main.cpp
index e187ef6583..3eea5c09db 100644
--- a/MenuApplets/Clock/main.cpp
+++ b/MenuApplets/Clock/main.cpp
@@ -31,6 +31,7 @@
#include <LibGUI/Window.h>
#include <LibGfx/Font.h>
#include <LibGfx/Palette.h>
+#include <spawn.h>
#include <stdio.h>
#include <time.h>
@@ -84,14 +85,10 @@ private:
if (event.button() != GUI::MouseButton::Left)
return;
- pid_t pid = fork();
- if (pid < 0) {
- perror("fork");
- } else if (pid == 0) {
- execl("/bin/Calendar", "Calendar", nullptr);
- perror("execl");
- ASSERT_NOT_REACHED();
- }
+ pid_t pid;
+ const char* argv[] = { "Calendar", nullptr };
+ if ((errno = posix_spawn(&pid, "/bin/Calendar", nullptr, nullptr, const_cast<char**>(argv), environ)))
+ perror("posix_spawn");
}
void tick_clock()
diff --git a/Userland/watch.cpp b/Userland/watch.cpp
index 436cae9768..a0e61c21a8 100644
--- a/Userland/watch.cpp
+++ b/Userland/watch.cpp
@@ -29,6 +29,7 @@
#include <AK/Time.h>
#include <AK/Vector.h>
#include <LibCore/ArgsParser.h>
+#include <spawn.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/wait.h>
@@ -85,37 +86,29 @@ void handle_signal(int signal)
int run_command(const Vector<const char*>& command)
{
- child_pid = fork();
- if (child_pid < 0) {
- // We failed to fork, so we shall print an error message and update the exit code.
+ if ((errno = posix_spawnp(const_cast<pid_t*>(&child_pid), command[0], nullptr, nullptr, const_cast<char**>(command.data()), environ))) {
exit_code = 1;
- perror("fork");
+ perror("posix_spawn");
return errno;
- } else if (child_pid == 0) {
- // We are in the child process, so we should run the command.
- execvp(command[0], const_cast<char* const*>(command.data()));
- perror("exec");
- exit(1);
- } else {
- // We are still in the parent process, so we shall wait for the child to terminate,
- // then return its exit code.
- int status;
- pid_t exited_pid;
- do {
- exited_pid = waitpid(child_pid, &status, 0);
- } while (exited_pid < 0 && errno == EINTR);
- ASSERT(exited_pid == child_pid);
- child_pid = -1;
- if (exited_pid < 0) {
- perror("waitpid");
- return 1;
- }
- if (WIFEXITED(status)) {
- return WEXITSTATUS(status);
- } else {
- return 1;
- }
}
+
+ // Wait for the child to terminate, then return its exit code.
+ int status;
+ pid_t exited_pid;
+ do {
+ exited_pid = waitpid(child_pid, &status, 0);
+ } while (exited_pid < 0 && errno == EINTR);
+ ASSERT(exited_pid == child_pid);
+ child_pid = -1;
+ if (exited_pid < 0) {
+ perror("waitpid");
+ return 1;
+ }
+ if (WIFEXITED(status)) {
+ return WEXITSTATUS(status);
+ } else {
+ return 1;
+ }
}
int main(int argc, char** argv)