mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-10 01:17:44 +03:00
util: use waitid() instead of waitpid() everywhere to avoid confusion due to SIGSTOP
This commit is contained in:
parent
2e78aa9988
commit
8e12a6aed3
@ -41,7 +41,8 @@ int kmod_setup(void) {
|
||||
ExecCommand command;
|
||||
ExecContext context;
|
||||
pid_t pid;
|
||||
int status, r;
|
||||
int r;
|
||||
siginfo_t status;
|
||||
|
||||
for (i = 0; i < ELEMENTSOF(kmod_table); i += 2) {
|
||||
|
||||
@ -76,21 +77,22 @@ int kmod_setup(void) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if ((r = waitpid_loop(pid, &status)) < 0)
|
||||
if ((r = wait_for_terminate(pid, &status)) < 0)
|
||||
return -errno;
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
if (WEXITSTATUS(status) != 0) {
|
||||
log_warning("/sbin/modprobe failed with error code %i.", WEXITSTATUS(status));
|
||||
if (status.si_code == CLD_EXITED) {
|
||||
if (status.si_status != 0) {
|
||||
log_warning("/sbin/modprobe failed with error code %i.", status.si_status);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
log_debug("/sbin/modprobe succeeded.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (WIFSIGNALED(status)) {
|
||||
log_warning("/sbin/modprobe terminated by signal %s.", signal_to_string(WTERMSIG(status)));
|
||||
} else if (status.si_code == CLD_KILLED ||
|
||||
status.si_code == CLD_DUMPED) {
|
||||
|
||||
log_warning("/sbin/modprobe terminated by signal %s.", signal_to_string(status.si_status));
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
|
@ -119,12 +119,13 @@ _noreturn_ static void crash(int sig) {
|
||||
_exit(1);
|
||||
|
||||
} else {
|
||||
int status;
|
||||
siginfo_t status;
|
||||
int r;
|
||||
|
||||
/* Order things nicely. */
|
||||
if (waitpid(pid, &status, 0) < 0)
|
||||
log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(errno));
|
||||
else if (!WCOREDUMP(status))
|
||||
if ((r = wait_for_terminate(pid, &status)) < 0)
|
||||
log_error("Caught <%s>, waitpid() failed: %s", signal_to_string(sig), strerror(-r));
|
||||
else if (status.si_code != CLD_DUMPED)
|
||||
log_error("Caught <%s>, core dump failed.", signal_to_string(sig));
|
||||
else
|
||||
log_error("Caught <%s>, dumped core as pid %lu.", signal_to_string(sig), (unsigned long) pid);
|
||||
|
@ -3101,12 +3101,14 @@ char *unquote(const char *s, const char quote) {
|
||||
return strdup(s);
|
||||
}
|
||||
|
||||
int waitpid_loop(pid_t pid, int *status) {
|
||||
int wait_for_terminate(pid_t pid, siginfo_t *status) {
|
||||
assert(pid >= 1);
|
||||
assert(status);
|
||||
|
||||
for (;;) {
|
||||
if (waitpid(pid, status, 0) < 0) {
|
||||
zero(*status);
|
||||
|
||||
if (waitid(P_PID, pid, status, WEXITED) < 0) {
|
||||
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
|
@ -345,7 +345,7 @@ int touch(const char *path);
|
||||
|
||||
char *unquote(const char *s, const char quote);
|
||||
|
||||
int waitpid_loop(pid_t pid, int *status);
|
||||
int wait_for_terminate(pid_t pid, siginfo_t *status);
|
||||
|
||||
#define NULSTR_FOREACH(i, l) \
|
||||
for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
|
||||
|
Loading…
Reference in New Issue
Block a user