mirror of
https://github.com/systemd/systemd.git
synced 2024-11-02 02:21:44 +03:00
Move fork_agent() into shared/
Currently it's only used in two places in src/shared/, so the function was already included just once in compiled code. But it seems appropriate to move it there anyway, because library code should have no need to fork agents, so it doesn't belong in basic/.
This commit is contained in:
parent
3bd6a01c01
commit
3e24e8cd64
@ -1514,82 +1514,6 @@ int namespace_fork(
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fork_agent(const char *name, int except[], size_t n_except, pid_t *ret_pid, const char *path, ...) {
|
|
||||||
bool stdout_is_tty, stderr_is_tty;
|
|
||||||
size_t n, i;
|
|
||||||
va_list ap;
|
|
||||||
char **l;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(path);
|
|
||||||
|
|
||||||
/* Spawns a temporary TTY agent, making sure it goes away when we go away */
|
|
||||||
|
|
||||||
r = safe_fork_full(name,
|
|
||||||
except,
|
|
||||||
n_except,
|
|
||||||
FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_REOPEN_LOG,
|
|
||||||
ret_pid);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
if (r > 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* In the child: */
|
|
||||||
|
|
||||||
stdout_is_tty = isatty(STDOUT_FILENO);
|
|
||||||
stderr_is_tty = isatty(STDERR_FILENO);
|
|
||||||
|
|
||||||
if (!stdout_is_tty || !stderr_is_tty) {
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
/* Detach from stdout/stderr. and reopen
|
|
||||||
* /dev/tty for them. This is important to
|
|
||||||
* ensure that when systemctl is started via
|
|
||||||
* popen() or a similar call that expects to
|
|
||||||
* read EOF we actually do generate EOF and
|
|
||||||
* not delay this indefinitely by because we
|
|
||||||
* keep an unused copy of stdin around. */
|
|
||||||
fd = open("/dev/tty", O_WRONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
log_error_errno(errno, "Failed to open /dev/tty: %m");
|
|
||||||
_exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stdout_is_tty && dup2(fd, STDOUT_FILENO) < 0) {
|
|
||||||
log_error_errno(errno, "Failed to dup2 /dev/tty: %m");
|
|
||||||
_exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stderr_is_tty && dup2(fd, STDERR_FILENO) < 0) {
|
|
||||||
log_error_errno(errno, "Failed to dup2 /dev/tty: %m");
|
|
||||||
_exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
safe_close_above_stdio(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) rlimit_nofile_safe();
|
|
||||||
|
|
||||||
/* Count arguments */
|
|
||||||
va_start(ap, path);
|
|
||||||
for (n = 0; va_arg(ap, char*); n++)
|
|
||||||
;
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
/* Allocate strv */
|
|
||||||
l = newa(char*, n + 1);
|
|
||||||
|
|
||||||
/* Fill in arguments */
|
|
||||||
va_start(ap, path);
|
|
||||||
for (i = 0; i <= n; i++)
|
|
||||||
l[i] = va_arg(ap, char*);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
execv(path, l);
|
|
||||||
_exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int set_oom_score_adjust(int value) {
|
int set_oom_score_adjust(int value) {
|
||||||
char t[DECIMAL_STR_MAX(int)];
|
char t[DECIMAL_STR_MAX(int)];
|
||||||
|
|
||||||
|
@ -174,8 +174,6 @@ static inline int safe_fork(const char *name, ForkFlags flags, pid_t *ret_pid) {
|
|||||||
|
|
||||||
int namespace_fork(const char *outer_name, const char *inner_name, int except_fds[], size_t n_except_fds, ForkFlags flags, int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd, pid_t *ret_pid);
|
int namespace_fork(const char *outer_name, const char *inner_name, int except_fds[], size_t n_except_fds, ForkFlags flags, int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd, pid_t *ret_pid);
|
||||||
|
|
||||||
int fork_agent(const char *name, int except[], size_t n_except, pid_t *pid, const char *path, ...) _sentinel_;
|
|
||||||
|
|
||||||
int set_oom_score_adjust(int value);
|
int set_oom_score_adjust(int value);
|
||||||
|
|
||||||
/* The highest possibly (theoretic) pid_t value on this architecture. */
|
/* The highest possibly (theoretic) pid_t value on this architecture. */
|
||||||
|
@ -470,3 +470,76 @@ int fexecve_or_execve(int executable_fd, const char *executable, char *const arg
|
|||||||
execve(executable, argv, envp);
|
execve(executable, argv, envp);
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fork_agent(const char *name, int except[], size_t n_except, pid_t *ret_pid, const char *path, ...) {
|
||||||
|
bool stdout_is_tty, stderr_is_tty;
|
||||||
|
size_t n, i;
|
||||||
|
va_list ap;
|
||||||
|
char **l;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(path);
|
||||||
|
|
||||||
|
/* Spawns a temporary TTY agent, making sure it goes away when we go away */
|
||||||
|
|
||||||
|
r = safe_fork_full(name,
|
||||||
|
except,
|
||||||
|
n_except,
|
||||||
|
FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_REOPEN_LOG,
|
||||||
|
ret_pid);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
if (r > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* In the child: */
|
||||||
|
|
||||||
|
stdout_is_tty = isatty(STDOUT_FILENO);
|
||||||
|
stderr_is_tty = isatty(STDERR_FILENO);
|
||||||
|
|
||||||
|
if (!stdout_is_tty || !stderr_is_tty) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
/* Detach from stdout/stderr and reopen /dev/tty for them. This is important to ensure that
|
||||||
|
* when systemctl is started via popen() or a similar call that expects to read EOF we
|
||||||
|
* actually do generate EOF and not delay this indefinitely by keeping an unused copy of
|
||||||
|
* stdin around. */
|
||||||
|
fd = open("/dev/tty", O_WRONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
log_error_errno(errno, "Failed to open /dev/tty: %m");
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stdout_is_tty && dup2(fd, STDOUT_FILENO) < 0) {
|
||||||
|
log_error_errno(errno, "Failed to dup2 /dev/tty: %m");
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stderr_is_tty && dup2(fd, STDERR_FILENO) < 0) {
|
||||||
|
log_error_errno(errno, "Failed to dup2 /dev/tty: %m");
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_close_above_stdio(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) rlimit_nofile_safe();
|
||||||
|
|
||||||
|
/* Count arguments */
|
||||||
|
va_start(ap, path);
|
||||||
|
for (n = 0; va_arg(ap, char*); n++)
|
||||||
|
;
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
/* Allocate strv */
|
||||||
|
l = newa(char*, n + 1);
|
||||||
|
|
||||||
|
/* Fill in arguments */
|
||||||
|
va_start(ap, path);
|
||||||
|
for (i = 0; i <= n; i++)
|
||||||
|
l[i] = va_arg(ap, char*);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
execv(path, l);
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
@ -48,3 +48,5 @@ const char* exec_command_flags_to_string(ExecCommandFlags i);
|
|||||||
ExecCommandFlags exec_command_flags_from_string(const char *s);
|
ExecCommandFlags exec_command_flags_from_string(const char *s);
|
||||||
|
|
||||||
int fexecve_or_execve(int executable_fd, const char *executable, char *const argv[], char *const envp[]);
|
int fexecve_or_execve(int executable_fd, const char *executable, char *const argv[], char *const envp[]);
|
||||||
|
|
||||||
|
int fork_agent(const char *name, int except[], size_t n_except, pid_t *ret_pid, const char *path, ...) _sentinel_;
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "exec-util.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "spawn-ask-password-agent.h"
|
#include "spawn-ask-password-agent.h"
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "exec-util.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "io-util.h"
|
#include "io-util.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user