mirror of
https://github.com/systemd/systemd.git
synced 2025-03-22 06:50:18 +03:00
pty_open_peer() follow-up (#36027)
This commit is contained in:
commit
2ca0f3ed2e
@ -1413,56 +1413,6 @@ int openpt_allocate_in_namespace(
|
||||
return TAKE_FD(fd);
|
||||
}
|
||||
|
||||
int open_terminal_in_namespace(
|
||||
const PidRef *pidref,
|
||||
const char *name,
|
||||
int mode) {
|
||||
|
||||
_cleanup_close_ int pidnsfd = -EBADF, mntnsfd = -EBADF, usernsfd = -EBADF, rootfd = -EBADF;
|
||||
_cleanup_close_pair_ int pair[2] = EBADF_PAIR;
|
||||
int r;
|
||||
|
||||
assert(name);
|
||||
|
||||
r = pidref_namespace_open(pidref, &pidnsfd, &mntnsfd, /* ret_netns_fd= */ NULL, &usernsfd, &rootfd);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, pair) < 0)
|
||||
return -errno;
|
||||
|
||||
r = namespace_fork(
|
||||
"(sd-terminalns)",
|
||||
"(sd-terminal)",
|
||||
/* except_fds= */ NULL,
|
||||
/* n_except_fds= */ 0,
|
||||
FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGKILL|FORK_WAIT,
|
||||
pidnsfd,
|
||||
mntnsfd,
|
||||
/* netnsd_fd= */ -EBADF,
|
||||
usernsfd,
|
||||
rootfd,
|
||||
/* ret_pid= */ NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0) {
|
||||
pair[0] = safe_close(pair[0]);
|
||||
|
||||
int pty_fd = open_terminal(name, mode|O_NOCTTY|O_CLOEXEC);
|
||||
if (pty_fd < 0)
|
||||
_exit(EXIT_FAILURE);
|
||||
|
||||
if (send_one_fd(pair[1], pty_fd, 0) < 0)
|
||||
_exit(EXIT_FAILURE);
|
||||
|
||||
_exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
pair[1] = safe_close(pair[1]);
|
||||
|
||||
return receive_one_fd(pair[0], 0);
|
||||
}
|
||||
|
||||
static bool on_dev_null(void) {
|
||||
struct stat dst, ost, est;
|
||||
|
||||
|
@ -145,7 +145,6 @@ int ptsname_malloc(int fd, char **ret);
|
||||
|
||||
int openpt_allocate(int flags, char **ret_peer);
|
||||
int openpt_allocate_in_namespace(const PidRef *pidref, int flags, char **ret_peer);
|
||||
int open_terminal_in_namespace(const PidRef *pidref, const char *name, int mode);
|
||||
|
||||
int vt_restore(int fd);
|
||||
int vt_release(int fd, bool restore_vt);
|
||||
|
@ -688,25 +688,6 @@ int machine_openpt(Machine *m, int flags, char **ret_peer) {
|
||||
}
|
||||
}
|
||||
|
||||
int machine_open_terminal(Machine *m, const char *path, int mode) {
|
||||
assert(m);
|
||||
|
||||
switch (m->class) {
|
||||
|
||||
case MACHINE_HOST:
|
||||
return open_terminal(path, mode);
|
||||
|
||||
case MACHINE_CONTAINER:
|
||||
if (!pidref_is_set(&m->leader))
|
||||
return -EINVAL;
|
||||
|
||||
return open_terminal_in_namespace(&m->leader, path, mode);
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int machine_bus_new(Machine *m, sd_bus_error *error, sd_bus **ret) {
|
||||
int r;
|
||||
|
||||
|
@ -102,7 +102,6 @@ const char* kill_whom_to_string(KillWhom k) _const_;
|
||||
KillWhom kill_whom_from_string(const char *s) _pure_;
|
||||
|
||||
int machine_openpt(Machine *m, int flags, char **ret_peer);
|
||||
int machine_open_terminal(Machine *m, const char *path, int mode);
|
||||
int machine_start_getty(Machine *m, const char *ptmx_name, sd_bus_error *error);
|
||||
int machine_start_shell(Machine *m, int ptmx_fd, const char *ptmx_name, const char *user, const char *path, char **args, char **env, sd_bus_error *error);
|
||||
#define machine_default_shell_path() ("/bin/sh")
|
||||
|
@ -1188,7 +1188,7 @@ static int transient_service_set_properties(sd_bus_message *m, const char *pty_p
|
||||
bool use_ex_prop = !arg_expand_environment;
|
||||
|
||||
assert(m);
|
||||
assert(pty_path || pty_fd < 0);
|
||||
assert((!!pty_path) == (pty_fd >= 0));
|
||||
|
||||
r = transient_unit_set_properties(m, UNIT_SERVICE, arg_property);
|
||||
if (r < 0)
|
||||
@ -1239,22 +1239,11 @@ static int transient_service_set_properties(sd_bus_message *m, const char *pty_p
|
||||
}
|
||||
|
||||
if (pty_path) {
|
||||
r = sd_bus_message_append(m, "(sv)", "TTYPath", "s", pty_path);
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
if (pty_fd >= 0)
|
||||
r = sd_bus_message_append(m,
|
||||
"(sv)(sv)(sv)",
|
||||
"StandardInputFileDescriptor", "h", pty_fd,
|
||||
"StandardOutputFileDescriptor", "h", pty_fd,
|
||||
"StandardErrorFileDescriptor", "h", pty_fd);
|
||||
else
|
||||
r = sd_bus_message_append(m,
|
||||
"(sv)(sv)(sv)",
|
||||
"StandardInput", "s", "tty",
|
||||
"StandardOutput", "s", "tty",
|
||||
"StandardError", "s", "tty");
|
||||
r = sd_bus_message_append(m, "(sv)(sv)(sv)(sv)",
|
||||
"TTYPath", "s", pty_path,
|
||||
"StandardInputFileDescriptor", "h", pty_fd,
|
||||
"StandardOutputFileDescriptor", "h", pty_fd,
|
||||
"StandardErrorFileDescriptor", "h", pty_fd);
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
@ -2041,10 +2030,7 @@ static int start_transient_service(sd_bus *bus) {
|
||||
|
||||
peer_fd = pty_open_peer(pty_fd, O_RDWR|O_NOCTTY|O_CLOEXEC);
|
||||
if (peer_fd < 0)
|
||||
return log_debug_errno(peer_fd, "Failed to open PTY peer: %m");
|
||||
|
||||
// FIXME: Introduce OpenMachinePTYEx() that accepts ownership/permission as param
|
||||
// and additionally returns the pty fd, for #33216 and #32999
|
||||
return log_error_errno(peer_fd, "Failed to open PTY peer: %m");
|
||||
} else
|
||||
assert_not_reached();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user