annotate spawn.cpp @ 2:00b62a080354

fix numerous bugs
author Yasuri <yasuri@charliesmp.net>
date Sun, 13 Sep 2026 19:40:11 +0000
parents 21b543c7aa14
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1 #include <iostream>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2 #include <unistd.h>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
3 #include <sys/wait.h>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
4 #include <spawn.h>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
5 #include <cstring>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
6 #include <string>
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
7 #include "process.h"
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
8 extern char** environ; // idk what this does
2
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
9 std::string spawn(char* const argv[])
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
10 {
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
11 pid_t pid;
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
12 int status;
2
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
13 status = posix_spawnp(&pid, argv[0], NULL, NULL, const_cast<char* const*>(argv), environ);
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
14 if (status != 0) {
2
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
15 std::cerr << "posix_spawnp failed for " << argv[0] << ": " << strerror(status) << std::endl;
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
16 return "error";
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
17 }
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
18 if (waitpid(pid, &status, 0) == -1) {
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
19 perror("waitpid");
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
20 return "error";
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
21 }
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
22 if (WIFEXITED(status)) {
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
23 return std::to_string(WEXITSTATUS(status));
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
24 }
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
25 if (WIFSIGNALED(status)) {
2
00b62a080354 fix numerous bugs
Yasuri <yasuri@charliesmp.net>
parents: 0
diff changeset
26 return "sig:" + std::to_string(WTERMSIG(status));
0
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
27 }
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
28 return "success";
21b543c7aa14 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
29 }