X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fkmod-setup.c;h=44d843db12ad0774a580019853ae31a3e961940c;hb=8e12a6aed3d99ac8c140cd56b560f5efeb1c4e1a;hp=6ac0c9ff8dd95d0da9debd85a9d3203a8b260505;hpb=d6c9574fb558d9e304699b1cc7522c3b133adfc9;p=elogind.git diff --git a/src/kmod-setup.c b/src/kmod-setup.c index 6ac0c9ff8..44d843db1 100644 --- a/src/kmod-setup.c +++ b/src/kmod-setup.c @@ -41,16 +41,17 @@ 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) { if (access(kmod_table[i+1], F_OK) >= 0) continue; - log_info("Your kernel apparently lacks built-in %s support. Please fix that. " - "We'll now try to work around this by calling '/sbin/modprobe %s'...", - kmod_table[i], kmod_table[i]); + log_debug("Your kernel apparently lacks built-in %s support. Might be a good idea to compile it in. " + "We'll now try to work around this by calling '/sbin/modprobe %s'...", + kmod_table[i], kmod_table[i]); cmdline[3 + n++] = kmod_table[i]; } @@ -76,30 +77,22 @@ int kmod_setup(void) { if (r < 0) return r; - for (;;) { - if (waitpid(pid, &status, 0) < 0) { + if ((r = wait_for_terminate(pid, &status)) < 0) + return -errno; - if (errno == EINTR) - continue; - - return -errno; - } - - break; - } - - 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; }