|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
From d66226bce64620543d21675ae610ecfeb9395e2a Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
From: Lennart Poettering <lennart@poettering.net>
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
Date: Thu, 6 Mar 2014 02:19:06 +0100
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
Subject: [PATCH] util: add timeout to generator execution
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
(cherry picked from commit aa62a8936f5983770e90b791083d55107659f7a1)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
---
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
src/core/manager.c | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
src/core/shutdown.c | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
src/shared/util.c | 162 ++++++++++++++++++++++++++++------------------------
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
src/shared/util.h | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
src/sleep/sleep.c | 14 +++--
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
5 files changed, 99 insertions(+), 83 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
diff --git a/src/core/manager.c b/src/core/manager.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
index f5801b4..7c7f088 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
--- a/src/core/manager.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+++ b/src/core/manager.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -2654,7 +2654,7 @@ void manager_run_generators(Manager *m) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
argv[4] = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
RUN_WITH_UMASK(0022)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- execute_directory(generator_path, d, (char**) argv);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
finish:
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
trim_generator_dir(m, &m->generator_unit_path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
diff --git a/src/core/shutdown.c b/src/core/shutdown.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
index c751030..7ef671a 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
--- a/src/core/shutdown.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+++ b/src/core/shutdown.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -368,7 +368,7 @@ int main(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[0] = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[1] = arg_verb;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[2] = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- execute_directory(SYSTEM_SHUTDOWN_PATH, NULL, arguments);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ execute_directory(SYSTEM_SHUTDOWN_PATH, NULL, DEFAULT_TIMEOUT_USEC, arguments);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
if (!in_container && !in_initrd() &&
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
access("/run/initramfs/shutdown", X_OK) == 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
diff --git a/src/shared/util.c b/src/shared/util.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
index 3164515..0d64ede 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
--- a/src/shared/util.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+++ b/src/shared/util.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -3681,111 +3681,123 @@ bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
return endswith(de->d_name, suffix);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
-void execute_directory(const char *directory, DIR *d, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- DIR *_d = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- struct dirent *de;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- Hashmap *pids = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+void execute_directory(const char *directory, DIR *d, usec_t timeout, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ pid_t executor_pid;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
assert(directory);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- /* Executes all binaries in a directory in parallel and
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- * waits for them to finish. */
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ /* Executes all binaries in a directory in parallel and waits
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ * for them to finish. Optionally a timeout is applied. */
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (!d) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (!(_d = opendir(directory))) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ executor_pid = fork();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (executor_pid < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_error("Failed to fork: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ return;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (errno == ENOENT)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- return;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ } else if (executor_pid == 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _cleanup_hashmap_free_free_ Hashmap *pids = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _cleanup_closedir_ DIR *_d = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ struct dirent *de;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ sigset_t ss;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("Failed to enumerate directory %s: %m", directory);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- return;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ /* We fork this all off from a child process so that
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ * we can somewhat cleanly make use of SIGALRM to set
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ * a time limit */
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- d = _d;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ reset_all_signal_handlers();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("Failed to allocate set.");
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ assert_se(sigemptyset(&ss) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ assert_se(sigprocmask(SIG_SETMASK, &ss, NULL) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- while ((de = readdir(d))) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- char *path;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- pid_t pid;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- int k;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (!dirent_is_file(de))
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (!d) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ d = _d = opendir(directory);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (!d) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (errno == ENOENT)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_SUCCESS);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (asprintf(&path, "%s/%s", directory, de->d_name) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_error("Failed to enumerate directory %s: %m", directory);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_FAILURE);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if ((pid = fork()) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("Failed to fork: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- free(path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ pids = hashmap_new(NULL, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (!pids) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_FAILURE);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (pid == 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- char *_argv[2];
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- /* Child */
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ FOREACH_DIRENT(de, d, break) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _cleanup_free_ char *path = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ pid_t pid;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (!argv) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- _argv[0] = path;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- _argv[1] = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- argv = _argv;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- } else
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- argv[0] = path;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (!dirent_is_file(de))
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- execv(path, argv);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (asprintf(&path, "%s/%s", directory, de->d_name) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_FAILURE);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("Failed to execute %s: %m", path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- _exit(EXIT_FAILURE);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ pid = fork();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (pid < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_error("Failed to fork: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ continue;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ } else if (pid == 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ char *_argv[2];
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_debug("Spawned %s as %lu", path, (unsigned long) pid);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("Failed to add PID to set: %s", strerror(-k));
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- free(path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (!argv) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _argv[0] = path;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _argv[1] = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ argv = _argv;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ } else
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ argv[0] = path;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- while (!hashmap_isempty(pids)) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- pid_t pid = PTR_TO_UINT(hashmap_first_key(pids));
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- siginfo_t si = {};
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- char *path;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ execv(path, argv);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_error("Failed to execute %s: %m", path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_FAILURE);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (waitid(P_PID, pid, &si, WEXITED) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (errno == EINTR)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- continue;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_debug("Spawned %s as " PID_FMT ".", path, pid);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("waitid() failed: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ r = hashmap_put(pids, UINT_TO_PTR(pid), path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_FAILURE);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ path = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if ((path = hashmap_remove(pids, UINT_TO_PTR(si.si_pid)))) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (!is_clean_exit(si.si_code, si.si_status, NULL)) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (si.si_code == CLD_EXITED)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("%s exited with exit status %i.", path, si.si_status);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- else
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_error("%s terminated by signal %s.", path, signal_to_string(si.si_status));
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- } else
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- log_debug("%s exited successfully.", path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ /* Abort execution of this process after the
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ * timout. We simply rely on SIGALRM as default action
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ * terminating the process, and turn on alarm(). */
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ if (timeout != (usec_t) -1)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ alarm((timeout + USEC_PER_SEC - 1) / USEC_PER_SEC);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ while (!hashmap_isempty(pids)) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _cleanup_free_ char *path = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ pid_t pid;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ pid = PTR_TO_UINT(hashmap_first_key(pids));
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ assert(pid > 0);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- free(path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ path = hashmap_remove(pids, UINT_TO_PTR(pid));
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ assert(path);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ wait_for_terminate_and_warn(path, pid);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
-finish:
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (_d)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- closedir(_d);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ _exit(EXIT_SUCCESS);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- if (pids)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- hashmap_free_free(pids);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ wait_for_terminate_and_warn(directory, executor_pid);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
int kill_and_sigcont(pid_t pid, int sig) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
diff --git a/src/shared/util.h b/src/shared/util.h
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
index 78b1444..aeb359b 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
--- a/src/shared/util.h
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+++ b/src/shared/util.h
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -473,7 +473,7 @@ bool tty_is_console(const char *tty) _pure_;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
int vtnr_from_tty(const char *tty);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
const char *default_term_for_tty(const char *tty);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
-void execute_directory(const char *directory, DIR *_d, char *argv[]);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+void execute_directory(const char *directory, DIR *_d, usec_t timeout, char *argv[]);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
int kill_and_sigcont(pid_t pid, int sig);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
index 8da050c..94bcb29 100644
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
--- a/src/sleep/sleep.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+++ b/src/sleep/sleep.c
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -25,14 +25,15 @@
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include <string.h>
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include <getopt.h>
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
-#include "systemd/sd-id128.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
-#include "systemd/sd-messages.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+#include "sd-id128.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+#include "sd-messages.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include "log.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include "util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include "strv.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include "fileio.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include "build.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
#include "sleep-config.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+#include "def.h"
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
static char* arg_verb = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -41,9 +42,12 @@ static int write_mode(char **modes) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
char **mode;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
STRV_FOREACH(mode, modes) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- int k = write_string_file("/sys/power/disk", *mode);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ int k;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ k = write_string_file("/sys/power/disk", *mode);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
if (k == 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
log_debug("Failed to write '%s' to /sys/power/disk: %s",
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
*mode, strerror(-k));
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
if (r == 0)
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -106,7 +110,7 @@ static int execute(char **modes, char **states) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[1] = (char*) "pre";
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[2] = arg_verb;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[3] = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- execute_directory(SYSTEM_SLEEP_PATH, NULL, arguments);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ execute_directory(SYSTEM_SLEEP_PATH, NULL, DEFAULT_TIMEOUT_USEC, arguments);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
log_struct(LOG_INFO,
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
MESSAGE_ID(SD_MESSAGE_SLEEP_START),
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
@@ -125,7 +129,7 @@ static int execute(char **modes, char **states) {
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
arguments[1] = (char*) "post";
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
- execute_directory(SYSTEM_SLEEP_PATH, NULL, arguments);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
+ execute_directory(SYSTEM_SLEEP_PATH, NULL, DEFAULT_TIMEOUT_USEC, arguments);
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
dd42fc |
}
|