mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-30 22:05:36 +00:00
restore: reserve the service descriptor for a control tty
I'm really lucky. prepare_ctl_tty: e->fd = get_service_fd(CTL_TTY_OFF); // -1 as fd is not set send_fd_to_self: if (dup2(fd, dfd) != dfd) { // tries to install sfd, but -1 == -1 tty_restore_ctl_terminal: if (!is_service_fd(fd, CTL_TTY_OFF)) return fd == get_service_fd(type); // -1 = -1 Signed-off-by: Andrey Vagin <avagin@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
a9ac1b29b4
commit
bce89dba4b
2
files.c
2
files.c
@@ -405,7 +405,7 @@ int prepare_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id)
|
||||
fdinfo_entry__init(e);
|
||||
|
||||
e->id = ctl_tty_id;
|
||||
e->fd = get_service_fd(CTL_TTY_OFF);
|
||||
e->fd = reserve_service_fd(CTL_TTY_OFF);
|
||||
e->type = FD_TYPES__TTY;
|
||||
|
||||
if (collect_fd(pid, e, rst_info)) {
|
||||
|
@@ -132,6 +132,7 @@ enum sfd_type {
|
||||
extern int clone_service_fd(int id);
|
||||
extern int init_service_fd(void);
|
||||
extern int get_service_fd(enum sfd_type type);
|
||||
extern int reserve_service_fd(enum sfd_type type);
|
||||
extern int install_service_fd(enum sfd_type type, int fd);
|
||||
extern int close_service_fd(enum sfd_type type);
|
||||
extern bool is_service_fd(int fd, enum sfd_type type);
|
||||
|
10
util.c
10
util.c
@@ -296,6 +296,16 @@ static int __get_service_fd(enum sfd_type type, int service_fd_id)
|
||||
|
||||
static DECLARE_BITMAP(sfd_map, SERVICE_FD_MAX);
|
||||
|
||||
int reserve_service_fd(enum sfd_type type)
|
||||
{
|
||||
int sfd = __get_service_fd(type, service_fd_id);
|
||||
|
||||
BUG_ON((int)type <= SERVICE_FD_MIN || (int)type >= SERVICE_FD_MAX);
|
||||
|
||||
set_bit(type, sfd_map);
|
||||
return sfd;
|
||||
}
|
||||
|
||||
int install_service_fd(enum sfd_type type, int fd)
|
||||
{
|
||||
int sfd = __get_service_fd(type, service_fd_id);
|
||||
|
Reference in New Issue
Block a user