return -ENOMEM;
for (size_t i = 0; i < conf->ttys.max; i++) {
+ int pty_nr = -1;
struct lxc_terminal_info *tty = &ttys->tty[i];
- ret = lxc_devpts_terminal(conf->devpts_fd, conf, &tty->ptx, &tty->pty, tty->name);
+ ret = lxc_devpts_terminal(conf->devpts_fd, conf, &tty->ptx,
+ &tty->pty, &pty_nr);
if (ret < 0) {
conf->ttys.max = i;
return syserror_set(-ENOTTY, "Failed to create tty %zu", i);
}
- DEBUG("Created tty with ptx fd %d and pty fd %d", tty->ptx, tty->pty);
+ DEBUG("Created tty with ptx fd %d and pty fd %d and index %d",
+ tty->ptx, tty->pty, pty_nr);
tty->busy = -1;
}
new->console.proxy.pty = -1;
new->console.ptx = -EBADF;
new->console.pty = -EBADF;
+ new->console.pty_nr = -1;
new->console.name[0] = '\0';
new->devpts_fd = -EBADF;
memset(&new->console.ringbuf, 0, sizeof(struct lxc_ringbuf));
close(terminal->pty);
terminal->pty = -1;
+ terminal->pty_nr = -1;
+
if (terminal->log_fd >= 0)
close(terminal->log_fd);
terminal->log_fd = -1;
}
int lxc_devpts_terminal(int devpts_fd, struct lxc_conf *conf,
- int *ret_ptx, int *ret_pty, char buf[static PATH_MAX])
+ int *ret_ptx, int *ret_pty, int *ret_pty_nr)
{
__do_close int fd_ptx = -EBADF, fd_opath_pty = -EBADF, fd_pty = -EBADF;
int pty_nr = -1;
if (!same_file_lax(fd_pty, fd_opath_pty))
return syswarn_set(-ENODEV, "Terminal file descriptor changed");
- ret = strnprintf(buf, PATH_MAX, "dev/pts/%d", pty_nr);
- if (ret < 0)
- return syswarn_set(-ENODEV, "Failed to create terminal pty name");
-
*ret_ptx = move_fd(fd_ptx);
*ret_pty = move_fd(fd_pty);
+ *ret_pty_nr = pty_nr;
return 0;
}
return log_error_errno(-1, errno, "Failed to receive devpts fd");
ret = lxc_devpts_terminal(devpts_fd, conf, &terminal->ptx,
- &terminal->pty, terminal->name);
+ &terminal->pty, &terminal->pty_nr);
if (ret < 0)
return ret;
+ ret = strnprintf(terminal->name, sizeof(terminal->name),
+ "/dev/pts/%d", terminal->pty_nr);
+ if (ret < 0)
+ return syserror("Failed to create path");
+
ret = lxc_terminal_peer_default(terminal);
if (ret < 0) {
lxc_terminal_delete(terminal);
void lxc_terminal_init(struct lxc_terminal *terminal)
{
memset(terminal, 0, sizeof(*terminal));
+ terminal->pty_nr = -1;
terminal->pty = -EBADF;
terminal->ptx = -EBADF;
terminal->peer = -EBADF;
};
struct lxc_terminal {
+ int pty_nr;
int pty;
int ptx;
int peer;
__hidden extern int lxc_terminal_signal_sigmask_safe_blocked(struct lxc_terminal *terminal);
__hidden extern int lxc_devpts_terminal(int devpts_fd, struct lxc_conf *conf,
int *ret_ptx, int *ret_pty,
- char buf[static PATH_MAX]);
+ int *ret_pty_nr);
#endif /* __LXC_TERMINAL_H */