WITH_UMASK(0022)
r = execute_directories(
+ "environment-generators",
(const char* const*) paths,
DEFAULT_TIMEOUT_USEC,
gather_environment,
BLOCK_WITH_UMASK(0022);
return execute_directories(
+ "generators",
(const char* const*) paths,
DEFAULT_TIMEOUT_USEC,
/* callbacks= */ NULL, /* callback_args= */ NULL,
}
ret = execute_strv(
- /* name = */ NULL,
+ "plugins",
c->plugins,
/* root = */ NULL,
USEC_INFINITY,
};
char** generator_binary_paths_internal(RuntimeScope scope, bool env_generator) {
-
static const struct {
const char *env_name;
const char * const *paths[_RUNTIME_SCOPE_MAX];
pid_t executor_pid;
int r;
+ assert(name);
assert(!FLAGS_SET(flags, EXEC_DIR_PARALLEL | EXEC_DIR_SKIP_REMAINING));
if (strv_isempty(paths))
return 0;
if (callbacks) {
- assert(name);
assert(callbacks[STDOUT_GENERATE]);
assert(callbacks[STDOUT_COLLECT]);
assert(callbacks[STDOUT_CONSUME]);
fd = open_serialization_fd(name);
if (fd < 0)
- return log_error_errno(fd, "Failed to open serialization file: %m");
+ return log_error_errno(fd, "Failed to open serialization file for %s: %m", name);
}
/* Executes all binaries in the directories serially or in parallel and waits for
* them to finish. Optionally a timeout is applied. If a file with the same name
* exists in more than one directory, the earliest one wins. */
- r = safe_fork("(sd-exec-strv)", FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_LOG, &executor_pid);
+ const char *process_name = strjoina("(", name, ")");
+
+ r = safe_fork(process_name, FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_LOG, &executor_pid);
if (r < 0)
return r;
if (r == 0) {
_exit(r < 0 ? EXIT_FAILURE : r);
}
- r = wait_for_terminate_and_check("(sd-exec-strv)", executor_pid, 0);
+ r = wait_for_terminate_and_check(process_name, executor_pid, 0);
if (r < 0)
return r;
if (!FLAGS_SET(flags, EXEC_DIR_IGNORE_ERRORS) && r > 0)
r = finish_serialization_fd(fd);
if (r < 0)
- return log_error_errno(r, "Failed to finish serialization fd: %m");
+ return log_error_errno(r, "Failed to finish serialization fd for %s: %m", name);
r = callbacks[STDOUT_CONSUME](TAKE_FD(fd), callback_args[STDOUT_CONSUME]);
if (r < 0)
- return log_error_errno(r, "Failed to parse returned data: %m");
+ return log_error_errno(r, "Failed to parse returned data for %s: %m", name);
return 0;
}
int execute_directories(
+ const char *name,
const char * const *directories,
usec_t timeout,
gather_stdout_callback_t const callbacks[_STDOUT_CONSUME_MAX],
ExecDirFlags flags) {
_cleanup_strv_free_ char **paths = NULL;
- _cleanup_free_ char *name = NULL;
int r;
+ assert(name);
assert(!strv_isempty((char* const*) directories));
r = conf_files_list_strv(
CONF_FILES_EXECUTABLE|CONF_FILES_REGULAR|CONF_FILES_FILTER_MASKED,
directories);
if (r < 0)
- return log_error_errno(r, "Failed to enumerate executables: %m");
+ return log_error_errno(r, "%s: failed to enumerate executables: %m", name);
if (strv_isempty(paths)) {
- log_debug("No executables found.");
+ log_debug("%s: no executables found.", name);
return 0;
}
- if (callbacks) {
- r = path_extract_filename(directories[0], &name);
- if (r < 0)
- return log_error_errno(r, "Failed to extract file name from '%s': %m", directories[0]);
- }
-
return execute_strv(name, paths, /* root = */ NULL, timeout, callbacks, callback_args, argv, envp, flags);
}
ExecDirFlags flags);
int execute_directories(
+ const char *name,
const char * const *directories,
usec_t timeout,
gather_stdout_callback_t const callbacks[_STDOUT_CONSUME_MAX],
arg_verb,
NULL,
};
- (void) execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, (char**) arguments, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ (void) execute_directories(
+ "system-shutdown",
+ dirs,
+ DEFAULT_TIMEOUT_USEC,
+ /* callbacks= */ NULL,
+ /* callback_args= */ NULL,
+ (char**) arguments,
+ /* envp= */ NULL,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
(void) rlimit_nofile_safe();
if (setenv("SYSTEMD_SLEEP_ACTION", action, /* overwrite = */ 1) < 0)
log_warning_errno(errno, "Failed to set SYSTEMD_SLEEP_ACTION=%s, ignoring: %m", action);
- (void) execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, (char **) arguments, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ (void) execute_directories(
+ "system-sleep",
+ dirs,
+ DEFAULT_TIMEOUT_USEC,
+ /* callbacks= */ NULL,
+ /* callback_args= */ NULL,
+ (char **) arguments,
+ /* envp= */ NULL,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
(void) lock_all_homes();
log_struct(LOG_INFO,
LOG_ITEM("SLEEP=%s", sleep_operation_to_string(arg_operation)));
arguments[1] = "post";
- (void) execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, (char **) arguments, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
-
+ (void) execute_directories(
+ "system-sleep",
+ dirs,
+ DEFAULT_TIMEOUT_USEC,
+ /* callbacks= */ NULL,
+ /* callback_args= */ NULL,
+ (char **) arguments,
+ /* envp= */ NULL,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
if (r >= 0)
return 0;
return;
if (gather_stdout)
- execute_directories(dirs, DEFAULT_TIMEOUT_USEC, ignore_stdout, ignore_stdout_args, NULL, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ execute_directories("test", dirs, DEFAULT_TIMEOUT_USEC, ignore_stdout, ignore_stdout_args, NULL, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
else
- execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, NULL, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ execute_directories("test", dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, NULL, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
assert_se(chdir(tmp_lo) == 0);
assert_se(access("it_works", F_OK) >= 0);
if (access(name, X_OK) < 0 && ERRNO_IS_PRIVILEGE(errno))
return;
- execute_directories(dirs, DEFAULT_TIMEOUT_USEC, ignore_stdout, ignore_stdout_args, NULL, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ execute_directories(__func__,
+ dirs, DEFAULT_TIMEOUT_USEC, ignore_stdout, ignore_stdout_args, NULL, NULL,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
assert_se(read_full_file(output, &contents, NULL) >= 0);
ASSERT_STREQ(contents, "30-override\n80-foo\n90-bar\nlast\n");
if (access(name, X_OK) < 0 && ERRNO_IS_PRIVILEGE(errno))
return;
- r = execute_directories(dirs, DEFAULT_TIMEOUT_USEC, gather_stdouts, args, NULL, NULL,
+ r = execute_directories(__func__,
+ dirs, DEFAULT_TIMEOUT_USEC, gather_stdouts, args, NULL, NULL,
EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
assert_se(r >= 0);
if (access(name, X_OK) < 0 && ERRNO_IS_PRIVILEGE(errno))
return;
- r = execute_directories(dirs, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL, NULL, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ r = execute_directories(__func__,
+ dirs, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL, NULL,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
assert_se(r >= 0);
STRV_FOREACH(p, env)
env = strv_new("PATH=" DEFAULT_PATH_WITHOUT_SBIN);
assert_se(env);
- r = execute_directories(dirs, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL, env, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ r = execute_directories(__func__,
+ dirs, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL, env,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
assert_se(r >= 0);
STRV_FOREACH(p, env)
if (access(name, X_OK) < 0 && ERRNO_IS_PRIVILEGE(errno))
return;
- r = execute_directories(dirs, DEFAULT_TIMEOUT_USEC,
+ r = execute_directories(__func__,
+ dirs, DEFAULT_TIMEOUT_USEC,
/* callbacks = */ NULL, /* callback_args = */ NULL,
/* argv = */ NULL, /* envp = */ NULL, /* flags = */ 0);