mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-08 04:36:21 +00:00
tree-wide: s/ptmx/ptx/g
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
3e519859bd
commit
36a94ce8e3
@ -32,25 +32,25 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
#define _PATH_DEVPTMX "/dev/ptmx"
|
#define _PATH_DEVPTMX "/dev/ptx"
|
||||||
|
|
||||||
int openpty (int *aptmx, int *apts, char *name, struct termios *termp,
|
int openpty (int *aptx, int *apts, char *name, struct termios *termp,
|
||||||
struct winsize *winp)
|
struct winsize *winp)
|
||||||
{
|
{
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
int ptmx, pts;
|
int ptx, pts;
|
||||||
|
|
||||||
ptmx = open(_PATH_DEVPTMX, O_RDWR);
|
ptx = open(_PATH_DEVPTMX, O_RDWR);
|
||||||
if (ptmx == -1)
|
if (ptx == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (grantpt(ptmx))
|
if (grantpt(ptx))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (unlockpt(ptmx))
|
if (unlockpt(ptx))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (ptsname_r(ptmx, buf, sizeof buf))
|
if (ptsname_r(ptx, buf, sizeof buf))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
pts = open(buf, O_RDWR | O_NOCTTY);
|
pts = open(buf, O_RDWR | O_NOCTTY);
|
||||||
@ -63,7 +63,7 @@ int openpty (int *aptmx, int *apts, char *name, struct termios *termp,
|
|||||||
if (winp)
|
if (winp)
|
||||||
ioctl(pts, TIOCSWINSZ, winp);
|
ioctl(pts, TIOCSWINSZ, winp);
|
||||||
|
|
||||||
*aptmx = ptmx;
|
*aptx = ptx;
|
||||||
*apts = pts;
|
*apts = pts;
|
||||||
if (name != NULL)
|
if (name != NULL)
|
||||||
strcpy(name, buf);
|
strcpy(name, buf);
|
||||||
@ -71,6 +71,6 @@ int openpty (int *aptmx, int *apts, char *name, struct termios *termp,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
close(ptmx);
|
close(ptx);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -28,11 +28,11 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create pseudo tty ptmx pts pair with @__name and set terminal
|
* Create pseudo tty ptx pts pair with @__name and set terminal
|
||||||
* attributes according to @__termp and @__winp and return handles for both
|
* attributes according to @__termp and @__winp and return handles for both
|
||||||
* ends in @__aptmx and @__apts.
|
* ends in @__aptx and @__apts.
|
||||||
*/
|
*/
|
||||||
extern int openpty (int *__aptmx, int *__apts, char *__name,
|
extern int openpty (int *__aptx, int *__apts, char *__name,
|
||||||
const struct termios *__termp,
|
const struct termios *__termp,
|
||||||
const struct winsize *__winp);
|
const struct winsize *__winp);
|
||||||
|
|
||||||
|
@ -932,9 +932,9 @@ static int lxc_attach_terminal_mainloop_init(struct lxc_terminal *terminal,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void lxc_attach_terminal_close_ptmx(struct lxc_terminal *terminal)
|
static inline void lxc_attach_terminal_close_ptx(struct lxc_terminal *terminal)
|
||||||
{
|
{
|
||||||
close_prot_errno_disarm(terminal->ptmx);
|
close_prot_errno_disarm(terminal->ptx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void lxc_attach_terminal_close_pts(struct lxc_terminal *terminal)
|
static inline void lxc_attach_terminal_close_pts(struct lxc_terminal *terminal)
|
||||||
@ -1332,7 +1332,7 @@ int lxc_attach(struct lxc_container *container, lxc_attach_exec_t exec_function,
|
|||||||
close_prot_errno_disarm(ipc_sockets[0]);
|
close_prot_errno_disarm(ipc_sockets[0]);
|
||||||
|
|
||||||
if (options->attach_flags & LXC_ATTACH_TERMINAL) {
|
if (options->attach_flags & LXC_ATTACH_TERMINAL) {
|
||||||
lxc_attach_terminal_close_ptmx(&terminal);
|
lxc_attach_terminal_close_ptx(&terminal);
|
||||||
lxc_attach_terminal_close_peer(&terminal);
|
lxc_attach_terminal_close_peer(&terminal);
|
||||||
lxc_attach_terminal_close_log(&terminal);
|
lxc_attach_terminal_close_log(&terminal);
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd)
|
|||||||
* stored directly in data and datalen will be 0.
|
* stored directly in data and datalen will be 0.
|
||||||
*
|
*
|
||||||
* As a special case, the response for LXC_CMD_CONSOLE is created
|
* As a special case, the response for LXC_CMD_CONSOLE is created
|
||||||
* here as it contains an fd for the ptmx pty passed through the
|
* here as it contains an fd for the ptx pty passed through the
|
||||||
* unix socket.
|
* unix socket.
|
||||||
*/
|
*/
|
||||||
static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
|
static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
|
||||||
@ -139,7 +139,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
|
|||||||
ENOMEM, "Failed to receive response for command \"%s\"",
|
ENOMEM, "Failed to receive response for command \"%s\"",
|
||||||
lxc_cmd_str(cmd->req.cmd));
|
lxc_cmd_str(cmd->req.cmd));
|
||||||
|
|
||||||
rspdata->ptmxfd = move_fd(fd_rsp);
|
rspdata->ptxfd = move_fd(fd_rsp);
|
||||||
rspdata->ttynum = PTR_TO_INT(rsp->data);
|
rspdata->ttynum = PTR_TO_INT(rsp->data);
|
||||||
rsp->data = rspdata;
|
rsp->data = rspdata;
|
||||||
}
|
}
|
||||||
@ -844,7 +844,7 @@ static int lxc_cmd_terminal_winch_callback(int fd, struct lxc_cmd_req *req,
|
|||||||
* @name : name of container to connect to
|
* @name : name of container to connect to
|
||||||
* @ttynum : in: the tty to open or -1 for next available
|
* @ttynum : in: the tty to open or -1 for next available
|
||||||
* : out: the tty allocated
|
* : out: the tty allocated
|
||||||
* @fd : out: file descriptor for ptmx side of pty
|
* @fd : out: file descriptor for ptx side of pty
|
||||||
* @lxcpath : the lxcpath in which the container is running
|
* @lxcpath : the lxcpath in which the container is running
|
||||||
*
|
*
|
||||||
* Returns fd holding tty allocated on success, < 0 on failure
|
* Returns fd holding tty allocated on success, < 0 on failure
|
||||||
@ -871,11 +871,11 @@ int lxc_cmd_console(const char *name, int *ttynum, int *fd, const char *lxcpath)
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return log_error(-1, "tty number %d invalid, busy or all ttys busy", *ttynum);
|
return log_error(-1, "tty number %d invalid, busy or all ttys busy", *ttynum);
|
||||||
|
|
||||||
if (rspdata->ptmxfd < 0)
|
if (rspdata->ptxfd < 0)
|
||||||
return log_error(-1, "Unable to allocate fd for tty %d", rspdata->ttynum);
|
return log_error(-1, "Unable to allocate fd for tty %d", rspdata->ttynum);
|
||||||
|
|
||||||
ret = cmd.rsp.ret; /* socket fd */
|
ret = cmd.rsp.ret; /* socket fd */
|
||||||
*fd = rspdata->ptmxfd;
|
*fd = rspdata->ptxfd;
|
||||||
*ttynum = rspdata->ttynum;
|
*ttynum = rspdata->ttynum;
|
||||||
|
|
||||||
return log_info(ret, "Alloced fd %d for tty %d via socket %d", *fd, rspdata->ttynum, ret);
|
return log_info(ret, "Alloced fd %d for tty %d via socket %d", *fd, rspdata->ttynum, ret);
|
||||||
@ -885,17 +885,17 @@ static int lxc_cmd_console_callback(int fd, struct lxc_cmd_req *req,
|
|||||||
struct lxc_handler *handler,
|
struct lxc_handler *handler,
|
||||||
struct lxc_epoll_descr *descr)
|
struct lxc_epoll_descr *descr)
|
||||||
{
|
{
|
||||||
int ptmxfd, ret;
|
int ptxfd, ret;
|
||||||
struct lxc_cmd_rsp rsp;
|
struct lxc_cmd_rsp rsp;
|
||||||
int ttynum = PTR_TO_INT(req->data);
|
int ttynum = PTR_TO_INT(req->data);
|
||||||
|
|
||||||
ptmxfd = lxc_terminal_allocate(handler->conf, fd, &ttynum);
|
ptxfd = lxc_terminal_allocate(handler->conf, fd, &ttynum);
|
||||||
if (ptmxfd < 0)
|
if (ptxfd < 0)
|
||||||
return LXC_CMD_REAP_CLIENT_FD;
|
return LXC_CMD_REAP_CLIENT_FD;
|
||||||
|
|
||||||
memset(&rsp, 0, sizeof(rsp));
|
memset(&rsp, 0, sizeof(rsp));
|
||||||
rsp.data = INT_TO_PTR(ttynum);
|
rsp.data = INT_TO_PTR(ttynum);
|
||||||
ret = lxc_abstract_unix_send_fds(fd, &ptmxfd, 1, &rsp, sizeof(rsp));
|
ret = lxc_abstract_unix_send_fds(fd, &ptxfd, 1, &rsp, sizeof(rsp));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
lxc_terminal_free(handler->conf, fd);
|
lxc_terminal_free(handler->conf, fd);
|
||||||
return log_error_errno(LXC_CMD_REAP_CLIENT_FD, errno,
|
return log_error_errno(LXC_CMD_REAP_CLIENT_FD, errno,
|
||||||
|
@ -61,7 +61,7 @@ struct lxc_cmd_rr {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct lxc_cmd_console_rsp_data {
|
struct lxc_cmd_console_rsp_data {
|
||||||
int ptmxfd;
|
int ptxfd;
|
||||||
int ttynum;
|
int ttynum;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -921,9 +921,9 @@ int lxc_allocate_ttys(struct lxc_conf *conf)
|
|||||||
for (size_t i = 0; i < ttys->max; i++) {
|
for (size_t i = 0; i < ttys->max; i++) {
|
||||||
struct lxc_terminal_info *tty = &ttys->tty[i];
|
struct lxc_terminal_info *tty = &ttys->tty[i];
|
||||||
|
|
||||||
tty->ptmx = -EBADF;
|
tty->ptx = -EBADF;
|
||||||
tty->pts = -EBADF;
|
tty->pts = -EBADF;
|
||||||
ret = openpty(&tty->ptmx, &tty->pts, NULL, NULL, NULL);
|
ret = openpty(&tty->ptx, &tty->pts, NULL, NULL, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ttys->max = i;
|
ttys->max = i;
|
||||||
return log_error_errno(-ENOTTY, ENOTTY, "Failed to create tty %zu", i);
|
return log_error_errno(-ENOTTY, ENOTTY, "Failed to create tty %zu", i);
|
||||||
@ -935,14 +935,14 @@ int lxc_allocate_ttys(struct lxc_conf *conf)
|
|||||||
return log_error_errno(-ENOTTY, ENOTTY, "Failed to retrieve name of tty %zu pts", i);
|
return log_error_errno(-ENOTTY, ENOTTY, "Failed to retrieve name of tty %zu pts", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG("Created tty \"%s\" with ptmx fd %d and pts fd %d",
|
DEBUG("Created tty \"%s\" with ptx fd %d and pts fd %d",
|
||||||
tty->name, tty->ptmx, tty->pts);
|
tty->name, tty->ptx, tty->pts);
|
||||||
|
|
||||||
/* Prevent leaking the file descriptors to the container */
|
/* Prevent leaking the file descriptors to the container */
|
||||||
ret = fd_cloexec(tty->ptmx, true);
|
ret = fd_cloexec(tty->ptx, true);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
SYSWARN("Failed to set FD_CLOEXEC flag on ptmx fd %d of tty device \"%s\"",
|
SYSWARN("Failed to set FD_CLOEXEC flag on ptx fd %d of tty device \"%s\"",
|
||||||
tty->ptmx, tty->name);
|
tty->ptx, tty->name);
|
||||||
|
|
||||||
ret = fd_cloexec(tty->pts, true);
|
ret = fd_cloexec(tty->pts, true);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -964,7 +964,7 @@ void lxc_delete_tty(struct lxc_tty_info *ttys)
|
|||||||
|
|
||||||
for (int i = 0; i < ttys->max; i++) {
|
for (int i = 0; i < ttys->max; i++) {
|
||||||
struct lxc_terminal_info *tty = &ttys->tty[i];
|
struct lxc_terminal_info *tty = &ttys->tty[i];
|
||||||
close_prot_errno_disarm(tty->ptmx);
|
close_prot_errno_disarm(tty->ptx);
|
||||||
close_prot_errno_disarm(tty->pts);
|
close_prot_errno_disarm(tty->pts);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -986,15 +986,15 @@ static int lxc_send_ttys_to_parent(struct lxc_handler *handler)
|
|||||||
int ttyfds[2];
|
int ttyfds[2];
|
||||||
struct lxc_terminal_info *tty = &ttys->tty[i];
|
struct lxc_terminal_info *tty = &ttys->tty[i];
|
||||||
|
|
||||||
ttyfds[0] = tty->ptmx;
|
ttyfds[0] = tty->ptx;
|
||||||
ttyfds[1] = tty->pts;
|
ttyfds[1] = tty->pts;
|
||||||
|
|
||||||
ret = lxc_abstract_unix_send_fds(sock, ttyfds, 2, NULL, 0);
|
ret = lxc_abstract_unix_send_fds(sock, ttyfds, 2, NULL, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
TRACE("Sent tty \"%s\" with ptmx fd %d and pts fd %d to parent",
|
TRACE("Sent tty \"%s\" with ptx fd %d and pts fd %d to parent",
|
||||||
tty->name, tty->ptmx, tty->pts);
|
tty->name, tty->ptx, tty->pts);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -2546,9 +2546,9 @@ struct lxc_conf *lxc_conf_init(void)
|
|||||||
new->console.path = NULL;
|
new->console.path = NULL;
|
||||||
new->console.peer = -1;
|
new->console.peer = -1;
|
||||||
new->console.proxy.busy = -1;
|
new->console.proxy.busy = -1;
|
||||||
new->console.proxy.ptmx = -1;
|
new->console.proxy.ptx = -1;
|
||||||
new->console.proxy.pts = -1;
|
new->console.proxy.pts = -1;
|
||||||
new->console.ptmx = -1;
|
new->console.ptx = -1;
|
||||||
new->console.pts = -1;
|
new->console.pts = -1;
|
||||||
new->console.name[0] = '\0';
|
new->console.name[0] = '\0';
|
||||||
memset(&new->console.ringbuf, 0, sizeof(struct lxc_ringbuf));
|
memset(&new->console.ringbuf, 0, sizeof(struct lxc_ringbuf));
|
||||||
|
@ -537,12 +537,12 @@ static bool do_lxcapi_unfreeze(struct lxc_container *c)
|
|||||||
|
|
||||||
WRAP_API(bool, lxcapi_unfreeze)
|
WRAP_API(bool, lxcapi_unfreeze)
|
||||||
|
|
||||||
static int do_lxcapi_console_getfd(struct lxc_container *c, int *ttynum, int *ptmxfd)
|
static int do_lxcapi_console_getfd(struct lxc_container *c, int *ttynum, int *ptxfd)
|
||||||
{
|
{
|
||||||
if (!c)
|
if (!c)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return lxc_terminal_getfd(c, ttynum, ptmxfd);
|
return lxc_terminal_getfd(c, ttynum, ptxfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRAP_API_2(int, lxcapi_console_getfd, int *, int *)
|
WRAP_API_2(int, lxcapi_console_getfd, int *, int *)
|
||||||
|
@ -563,7 +563,7 @@ struct lxc_container {
|
|||||||
* \param c Container.
|
* \param c Container.
|
||||||
* \param[in,out] ttynum Terminal number to attempt to allocate,
|
* \param[in,out] ttynum Terminal number to attempt to allocate,
|
||||||
* or \c -1 to allocate the first available tty.
|
* or \c -1 to allocate the first available tty.
|
||||||
* \param[out] ptmxfd File descriptor referring to the ptmx side of the pty.
|
* \param[out] ptxfd File descriptor referring to the ptx side of the pty.
|
||||||
*
|
*
|
||||||
* \return tty file descriptor number on success, or \c -1 on
|
* \return tty file descriptor number on success, or \c -1 on
|
||||||
* failure.
|
* failure.
|
||||||
@ -575,7 +575,7 @@ struct lxc_container {
|
|||||||
* descriptor when no longer required so that it may be allocated
|
* descriptor when no longer required so that it may be allocated
|
||||||
* by another caller.
|
* by another caller.
|
||||||
*/
|
*/
|
||||||
int (*console_getfd)(struct lxc_container *c, int *ttynum, int *ptmxfd);
|
int (*console_getfd)(struct lxc_container *c, int *ttynum, int *ptxfd);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Allocate and run a console tty.
|
* \brief Allocate and run a console tty.
|
||||||
|
@ -1483,9 +1483,9 @@ static int lxc_recv_ttys_from_child(struct lxc_handler *handler)
|
|||||||
|
|
||||||
tty = &ttys->tty[i];
|
tty = &ttys->tty[i];
|
||||||
tty->busy = -1;
|
tty->busy = -1;
|
||||||
tty->ptmx = ttyfds[0];
|
tty->ptx = ttyfds[0];
|
||||||
tty->pts = ttyfds[1];
|
tty->pts = ttyfds[1];
|
||||||
TRACE("Received pty with ptmx fd %d and pts fd %d from child", tty->ptmx, tty->pts);
|
TRACE("Received pty with ptx fd %d and pts fd %d from child", tty->ptx, tty->pts);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -65,7 +65,7 @@ void lxc_terminal_winsz(int srcfd, int dstfd)
|
|||||||
|
|
||||||
static void lxc_terminal_winch(struct lxc_terminal_state *ts)
|
static void lxc_terminal_winch(struct lxc_terminal_state *ts)
|
||||||
{
|
{
|
||||||
lxc_terminal_winsz(ts->stdinfd, ts->ptmxfd);
|
lxc_terminal_winsz(ts->stdinfd, ts->ptxfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata,
|
int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata,
|
||||||
@ -105,7 +105,7 @@ struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd)
|
|||||||
|
|
||||||
memset(ts, 0, sizeof(*ts));
|
memset(ts, 0, sizeof(*ts));
|
||||||
ts->stdinfd = srcfd;
|
ts->stdinfd = srcfd;
|
||||||
ts->ptmxfd = dstfd;
|
ts->ptxfd = dstfd;
|
||||||
ts->sigfd = -1;
|
ts->sigfd = -1;
|
||||||
|
|
||||||
ret = sigemptyset(&mask);
|
ret = sigemptyset(&mask);
|
||||||
@ -330,8 +330,8 @@ int lxc_terminal_io_cb(int fd, uint32_t events, void *data,
|
|||||||
INFO("Terminal client on fd %d has exited", fd);
|
INFO("Terminal client on fd %d has exited", fd);
|
||||||
lxc_mainloop_del_handler(descr, fd);
|
lxc_mainloop_del_handler(descr, fd);
|
||||||
|
|
||||||
if (fd == terminal->ptmx) {
|
if (fd == terminal->ptx) {
|
||||||
terminal->ptmx = -EBADF;
|
terminal->ptx = -EBADF;
|
||||||
} else if (fd == terminal->peer) {
|
} else if (fd == terminal->peer) {
|
||||||
lxc_terminal_signal_fini(terminal);
|
lxc_terminal_signal_fini(terminal);
|
||||||
terminal->peer = -EBADF;
|
terminal->peer = -EBADF;
|
||||||
@ -344,10 +344,10 @@ int lxc_terminal_io_cb(int fd, uint32_t events, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fd == terminal->peer)
|
if (fd == terminal->peer)
|
||||||
w = lxc_write_nointr(terminal->ptmx, buf, r);
|
w = lxc_write_nointr(terminal->ptx, buf, r);
|
||||||
|
|
||||||
w_rbuf = w_log = 0;
|
w_rbuf = w_log = 0;
|
||||||
if (fd == terminal->ptmx) {
|
if (fd == terminal->ptx) {
|
||||||
/* write to peer first */
|
/* write to peer first */
|
||||||
if (terminal->peer >= 0)
|
if (terminal->peer >= 0)
|
||||||
w = lxc_write_nointr(terminal->peer, buf, r);
|
w = lxc_write_nointr(terminal->peer, buf, r);
|
||||||
@ -406,16 +406,16 @@ int lxc_terminal_mainloop_add(struct lxc_epoll_descr *descr,
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (terminal->ptmx < 0) {
|
if (terminal->ptx < 0) {
|
||||||
INFO("Terminal is not initialized");
|
INFO("Terminal is not initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = lxc_mainloop_add_handler(descr, terminal->ptmx,
|
ret = lxc_mainloop_add_handler(descr, terminal->ptx,
|
||||||
lxc_terminal_io_cb, terminal);
|
lxc_terminal_io_cb, terminal);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ERROR("Failed to add handler for terminal ptmx fd %d to "
|
ERROR("Failed to add handler for terminal ptx fd %d to "
|
||||||
"mainloop", terminal->ptmx);
|
"mainloop", terminal->ptx);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -483,8 +483,8 @@ static void lxc_terminal_peer_proxy_free(struct lxc_terminal *terminal)
|
|||||||
{
|
{
|
||||||
lxc_terminal_signal_fini(terminal);
|
lxc_terminal_signal_fini(terminal);
|
||||||
|
|
||||||
close(terminal->proxy.ptmx);
|
close(terminal->proxy.ptx);
|
||||||
terminal->proxy.ptmx = -1;
|
terminal->proxy.ptx = -1;
|
||||||
|
|
||||||
close(terminal->proxy.pts);
|
close(terminal->proxy.pts);
|
||||||
terminal->proxy.pts = -1;
|
terminal->proxy.pts = -1;
|
||||||
@ -503,7 +503,7 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal,
|
|||||||
struct termios oldtermio;
|
struct termios oldtermio;
|
||||||
struct lxc_terminal_state *ts;
|
struct lxc_terminal_state *ts;
|
||||||
|
|
||||||
if (terminal->ptmx < 0) {
|
if (terminal->ptx < 0) {
|
||||||
ERROR("Terminal not set up");
|
ERROR("Terminal not set up");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -519,9 +519,9 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This is the proxy terminal that will be given to the client, and
|
/* This is the proxy terminal that will be given to the client, and
|
||||||
* that the real terminal ptmx will send to / recv from.
|
* that the real terminal ptx will send to / recv from.
|
||||||
*/
|
*/
|
||||||
ret = openpty(&terminal->proxy.ptmx, &terminal->proxy.pts, NULL,
|
ret = openpty(&terminal->proxy.ptx, &terminal->proxy.pts, NULL,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYSERROR("Failed to open proxy terminal");
|
SYSERROR("Failed to open proxy terminal");
|
||||||
@ -535,9 +535,9 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal,
|
|||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_cloexec(terminal->proxy.ptmx, true);
|
ret = fd_cloexec(terminal->proxy.ptx, true);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYSERROR("Failed to set FD_CLOEXEC flag on proxy terminal ptmx");
|
SYSERROR("Failed to set FD_CLOEXEC flag on proxy terminal ptx");
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,7 +551,7 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
ts = lxc_terminal_signal_init(terminal->proxy.ptmx, terminal->ptmx);
|
ts = lxc_terminal_signal_init(terminal->proxy.ptx, terminal->ptx);
|
||||||
if (!ts)
|
if (!ts)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
@ -562,8 +562,8 @@ static int lxc_terminal_peer_proxy_alloc(struct lxc_terminal *terminal,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
NOTICE("Opened proxy terminal with ptmx fd %d and pts fd %d",
|
NOTICE("Opened proxy terminal with ptx fd %d and pts fd %d",
|
||||||
terminal->proxy.ptmx, terminal->proxy.pts);
|
terminal->proxy.ptx, terminal->proxy.pts);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
@ -574,7 +574,7 @@ on_error:
|
|||||||
int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq)
|
int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq)
|
||||||
{
|
{
|
||||||
int ttynum;
|
int ttynum;
|
||||||
int ptmxfd = -1;
|
int ptxfd = -1;
|
||||||
struct lxc_tty_info *ttys = &conf->ttys;
|
struct lxc_tty_info *ttys = &conf->ttys;
|
||||||
struct lxc_terminal *terminal = &conf->console;
|
struct lxc_terminal *terminal = &conf->console;
|
||||||
|
|
||||||
@ -585,7 +585,7 @@ int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ptmxfd = terminal->proxy.ptmx;
|
ptxfd = terminal->proxy.ptx;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,10 +614,10 @@ int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq)
|
|||||||
|
|
||||||
out_tty:
|
out_tty:
|
||||||
ttys->tty[ttynum - 1].busy = sockfd;
|
ttys->tty[ttynum - 1].busy = sockfd;
|
||||||
ptmxfd = ttys->tty[ttynum - 1].ptmx;
|
ptxfd = ttys->tty[ttynum - 1].ptx;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ptmxfd;
|
return ptxfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lxc_terminal_free(struct lxc_conf *conf, int fd)
|
void lxc_terminal_free(struct lxc_conf *conf, int fd)
|
||||||
@ -666,14 +666,14 @@ static int lxc_terminal_peer_default(struct lxc_terminal *terminal)
|
|||||||
goto on_error_free_tios;
|
goto on_error_free_tios;
|
||||||
}
|
}
|
||||||
|
|
||||||
ts = lxc_terminal_signal_init(terminal->peer, terminal->ptmx);
|
ts = lxc_terminal_signal_init(terminal->peer, terminal->ptx);
|
||||||
terminal->tty_state = ts;
|
terminal->tty_state = ts;
|
||||||
if (!ts) {
|
if (!ts) {
|
||||||
WARN("Failed to install signal handler");
|
WARN("Failed to install signal handler");
|
||||||
goto on_error_free_tios;
|
goto on_error_free_tios;
|
||||||
}
|
}
|
||||||
|
|
||||||
lxc_terminal_winsz(terminal->peer, terminal->ptmx);
|
lxc_terminal_winsz(terminal->peer, terminal->ptx);
|
||||||
|
|
||||||
terminal->tios = malloc(sizeof(*terminal->tios));
|
terminal->tios = malloc(sizeof(*terminal->tios));
|
||||||
if (!terminal->tios)
|
if (!terminal->tios)
|
||||||
@ -749,9 +749,9 @@ void lxc_terminal_delete(struct lxc_terminal *terminal)
|
|||||||
close(terminal->peer);
|
close(terminal->peer);
|
||||||
terminal->peer = -1;
|
terminal->peer = -1;
|
||||||
|
|
||||||
if (terminal->ptmx >= 0)
|
if (terminal->ptx >= 0)
|
||||||
close(terminal->ptmx);
|
close(terminal->ptx);
|
||||||
terminal->ptmx = -1;
|
terminal->ptx = -1;
|
||||||
|
|
||||||
if (terminal->pts >= 0)
|
if (terminal->pts >= 0)
|
||||||
close(terminal->pts);
|
close(terminal->pts);
|
||||||
@ -764,7 +764,7 @@ void lxc_terminal_delete(struct lxc_terminal *terminal)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Note that this function needs to run before the mainloop starts. Since we
|
* Note that this function needs to run before the mainloop starts. Since we
|
||||||
* register a handler for the terminal's ptmxfd when we create the mainloop
|
* register a handler for the terminal's ptxfd when we create the mainloop
|
||||||
* the terminal handler needs to see an allocated ringbuffer.
|
* the terminal handler needs to see an allocated ringbuffer.
|
||||||
*/
|
*/
|
||||||
static int lxc_terminal_create_ringbuf(struct lxc_terminal *terminal)
|
static int lxc_terminal_create_ringbuf(struct lxc_terminal *terminal)
|
||||||
@ -832,7 +832,7 @@ int lxc_terminal_create(struct lxc_terminal *terminal)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = openpty(&terminal->ptmx, &terminal->pts, NULL, NULL, NULL);
|
ret = openpty(&terminal->ptx, &terminal->pts, NULL, NULL, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYSERROR("Failed to open terminal");
|
SYSERROR("Failed to open terminal");
|
||||||
return -1;
|
return -1;
|
||||||
@ -844,9 +844,9 @@ int lxc_terminal_create(struct lxc_terminal *terminal)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fd_cloexec(terminal->ptmx, true);
|
ret = fd_cloexec(terminal->ptx, true);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYSERROR("Failed to set FD_CLOEXEC flag on terminal ptmx");
|
SYSERROR("Failed to set FD_CLOEXEC flag on terminal ptx");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -956,21 +956,21 @@ int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata,
|
|||||||
ts->saw_escape = 0;
|
ts->saw_escape = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = lxc_write_nointr(ts->ptmxfd, &c, 1);
|
ret = lxc_write_nointr(ts->ptxfd, &c, 1);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return LXC_MAINLOOP_CLOSE;
|
return LXC_MAINLOOP_CLOSE;
|
||||||
|
|
||||||
return LXC_MAINLOOP_CONTINUE;
|
return LXC_MAINLOOP_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_terminal_ptmx_cb(int fd, uint32_t events, void *cbdata,
|
int lxc_terminal_ptx_cb(int fd, uint32_t events, void *cbdata,
|
||||||
struct lxc_epoll_descr *descr)
|
struct lxc_epoll_descr *descr)
|
||||||
{
|
{
|
||||||
int r, w;
|
int r, w;
|
||||||
char buf[LXC_TERMINAL_BUFFER_SIZE];
|
char buf[LXC_TERMINAL_BUFFER_SIZE];
|
||||||
struct lxc_terminal_state *ts = cbdata;
|
struct lxc_terminal_state *ts = cbdata;
|
||||||
|
|
||||||
if (fd != ts->ptmxfd)
|
if (fd != ts->ptxfd)
|
||||||
return LXC_MAINLOOP_CLOSE;
|
return LXC_MAINLOOP_CLOSE;
|
||||||
|
|
||||||
r = lxc_read_nointr(fd, buf, sizeof(buf));
|
r = lxc_read_nointr(fd, buf, sizeof(buf));
|
||||||
@ -984,16 +984,16 @@ int lxc_terminal_ptmx_cb(int fd, uint32_t events, void *cbdata,
|
|||||||
return LXC_MAINLOOP_CONTINUE;
|
return LXC_MAINLOOP_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_terminal_getfd(struct lxc_container *c, int *ttynum, int *ptmxfd)
|
int lxc_terminal_getfd(struct lxc_container *c, int *ttynum, int *ptxfd)
|
||||||
{
|
{
|
||||||
return lxc_cmd_console(c->name, ttynum, ptmxfd, c->config_path);
|
return lxc_cmd_console(c->name, ttynum, ptxfd, c->config_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_console(struct lxc_container *c, int ttynum,
|
int lxc_console(struct lxc_container *c, int ttynum,
|
||||||
int stdinfd, int stdoutfd, int stderrfd,
|
int stdinfd, int stdoutfd, int stderrfd,
|
||||||
int escape)
|
int escape)
|
||||||
{
|
{
|
||||||
int ptmxfd, ret, ttyfd;
|
int ptxfd, ret, ttyfd;
|
||||||
struct lxc_epoll_descr descr;
|
struct lxc_epoll_descr descr;
|
||||||
struct termios oldtios;
|
struct termios oldtios;
|
||||||
struct lxc_terminal_state *ts;
|
struct lxc_terminal_state *ts;
|
||||||
@ -1002,7 +1002,7 @@ int lxc_console(struct lxc_container *c, int ttynum,
|
|||||||
};
|
};
|
||||||
int istty = 0;
|
int istty = 0;
|
||||||
|
|
||||||
ttyfd = lxc_cmd_console(c->name, &ttynum, &ptmxfd, c->config_path);
|
ttyfd = lxc_cmd_console(c->name, &ttynum, &ptxfd, c->config_path);
|
||||||
if (ttyfd < 0)
|
if (ttyfd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -1010,7 +1010,7 @@ int lxc_console(struct lxc_container *c, int ttynum,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
TRACE("Process is already group leader");
|
TRACE("Process is already group leader");
|
||||||
|
|
||||||
ts = lxc_terminal_signal_init(stdinfd, ptmxfd);
|
ts = lxc_terminal_signal_init(stdinfd, ptxfd);
|
||||||
if (!ts) {
|
if (!ts) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto close_fds;
|
goto close_fds;
|
||||||
@ -1021,8 +1021,8 @@ int lxc_console(struct lxc_container *c, int ttynum,
|
|||||||
|
|
||||||
istty = isatty(stdinfd);
|
istty = isatty(stdinfd);
|
||||||
if (istty) {
|
if (istty) {
|
||||||
lxc_terminal_winsz(stdinfd, ptmxfd);
|
lxc_terminal_winsz(stdinfd, ptxfd);
|
||||||
lxc_terminal_winsz(ts->stdinfd, ts->ptmxfd);
|
lxc_terminal_winsz(ts->stdinfd, ts->ptxfd);
|
||||||
} else {
|
} else {
|
||||||
INFO("File descriptor %d does not refer to a terminal", stdinfd);
|
INFO("File descriptor %d does not refer to a terminal", stdinfd);
|
||||||
}
|
}
|
||||||
@ -1049,10 +1049,10 @@ int lxc_console(struct lxc_container *c, int ttynum,
|
|||||||
goto close_mainloop;
|
goto close_mainloop;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = lxc_mainloop_add_handler(&descr, ts->ptmxfd,
|
ret = lxc_mainloop_add_handler(&descr, ts->ptxfd,
|
||||||
lxc_terminal_ptmx_cb, ts);
|
lxc_terminal_ptx_cb, ts);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ERROR("Failed to add ptmx handler");
|
ERROR("Failed to add ptx handler");
|
||||||
goto close_mainloop;
|
goto close_mainloop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1093,7 +1093,7 @@ sigwinch_fini:
|
|||||||
lxc_terminal_signal_fini(&terminal);
|
lxc_terminal_signal_fini(&terminal);
|
||||||
|
|
||||||
close_fds:
|
close_fds:
|
||||||
close(ptmxfd);
|
close(ptxfd);
|
||||||
close(ttyfd);
|
close(ttyfd);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -1133,7 +1133,7 @@ int lxc_terminal_prepare_login(int fd)
|
|||||||
void lxc_terminal_info_init(struct lxc_terminal_info *terminal)
|
void lxc_terminal_info_init(struct lxc_terminal_info *terminal)
|
||||||
{
|
{
|
||||||
terminal->name[0] = '\0';
|
terminal->name[0] = '\0';
|
||||||
terminal->ptmx = -EBADF;
|
terminal->ptx = -EBADF;
|
||||||
terminal->pts = -EBADF;
|
terminal->pts = -EBADF;
|
||||||
terminal->busy = -1;
|
terminal->busy = -1;
|
||||||
}
|
}
|
||||||
@ -1142,7 +1142,7 @@ void lxc_terminal_init(struct lxc_terminal *terminal)
|
|||||||
{
|
{
|
||||||
memset(terminal, 0, sizeof(*terminal));
|
memset(terminal, 0, sizeof(*terminal));
|
||||||
terminal->pts = -EBADF;
|
terminal->pts = -EBADF;
|
||||||
terminal->ptmx = -EBADF;
|
terminal->ptx = -EBADF;
|
||||||
terminal->peer = -EBADF;
|
terminal->peer = -EBADF;
|
||||||
terminal->log_fd = -EBADF;
|
terminal->log_fd = -EBADF;
|
||||||
lxc_terminal_info_init(&terminal->proxy);
|
lxc_terminal_info_init(&terminal->proxy);
|
||||||
|
@ -18,8 +18,8 @@ struct lxc_terminal_info {
|
|||||||
/* the path name of the pts side */
|
/* the path name of the pts side */
|
||||||
char name[PATH_MAX];
|
char name[PATH_MAX];
|
||||||
|
|
||||||
/* the file descriptor of the ptmx */
|
/* the file descriptor of the ptx */
|
||||||
int ptmx;
|
int ptx;
|
||||||
|
|
||||||
/* the file descriptor of the pts */
|
/* the file descriptor of the pts */
|
||||||
int pts;
|
int pts;
|
||||||
@ -32,7 +32,7 @@ struct lxc_terminal_state {
|
|||||||
struct lxc_list node;
|
struct lxc_list node;
|
||||||
int stdinfd;
|
int stdinfd;
|
||||||
int stdoutfd;
|
int stdoutfd;
|
||||||
int ptmxfd;
|
int ptxfd;
|
||||||
|
|
||||||
/* Escape sequence to use for exiting the terminal. A single char can
|
/* Escape sequence to use for exiting the terminal. A single char can
|
||||||
* be specified. The terminal can then exited by doing: Ctrl +
|
* be specified. The terminal can then exited by doing: Ctrl +
|
||||||
@ -58,7 +58,7 @@ struct lxc_terminal_state {
|
|||||||
|
|
||||||
struct lxc_terminal {
|
struct lxc_terminal {
|
||||||
int pts;
|
int pts;
|
||||||
int ptmx;
|
int ptx;
|
||||||
int peer;
|
int peer;
|
||||||
struct lxc_terminal_info proxy;
|
struct lxc_terminal_info proxy;
|
||||||
struct lxc_epoll_descr *descr;
|
struct lxc_epoll_descr *descr;
|
||||||
@ -102,10 +102,10 @@ extern int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttynum
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new terminal:
|
* Create a new terminal:
|
||||||
* - calls openpty() to allocate a ptmx/pts pair
|
* - calls openpty() to allocate a ptx/pts pair
|
||||||
* - sets the FD_CLOEXEC flag on the ptmx/pts fds
|
* - sets the FD_CLOEXEC flag on the ptx/pts fds
|
||||||
* - allocates either the current controlling terminal (default) or a user
|
* - allocates either the current controlling terminal (default) or a user
|
||||||
* specified terminal as proxy for the newly created ptmx/pts pair
|
* specified terminal as proxy for the newly created ptx/pts pair
|
||||||
* - sets up SIGWINCH handler, winsz, and new terminal settings
|
* - sets up SIGWINCH handler, winsz, and new terminal settings
|
||||||
* (Handlers for SIGWINCH and I/O are not registered in a mainloop.)
|
* (Handlers for SIGWINCH and I/O are not registered in a mainloop.)
|
||||||
*/
|
*/
|
||||||
@ -164,7 +164,7 @@ extern int lxc_console(struct lxc_container *c, int ttynum,
|
|||||||
* the range specified by lxc.tty.max to allocate a specific tty.
|
* the range specified by lxc.tty.max to allocate a specific tty.
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_getfd(struct lxc_container *c, int *ttynum,
|
extern int lxc_terminal_getfd(struct lxc_container *c, int *ttynum,
|
||||||
int *ptmxfd);
|
int *ptxfd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make fd a duplicate of the standard file descriptors. The fd is made a
|
* Make fd a duplicate of the standard file descriptors. The fd is made a
|
||||||
@ -183,12 +183,12 @@ extern int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata,
|
|||||||
struct lxc_epoll_descr *descr);
|
struct lxc_epoll_descr *descr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for events on the ptmx fd of the terminal. To be registered via
|
* Handler for events on the ptx fd of the terminal. To be registered via
|
||||||
* the corresponding functions declared and defined in mainloop.{c,h} or
|
* the corresponding functions declared and defined in mainloop.{c,h} or
|
||||||
* lxc_terminal_mainloop_add().
|
* lxc_terminal_mainloop_add().
|
||||||
* This function exits the loop cleanly when an EPOLLHUP event is received.
|
* This function exits the loop cleanly when an EPOLLHUP event is received.
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_ptmx_cb(int fd, uint32_t events, void *cbdata,
|
extern int lxc_terminal_ptx_cb(int fd, uint32_t events, void *cbdata,
|
||||||
struct lxc_epoll_descr *descr);
|
struct lxc_epoll_descr *descr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -204,7 +204,7 @@ extern int lxc_setup_tios(int fd, struct termios *oldtios);
|
|||||||
* @srcfd
|
* @srcfd
|
||||||
* - terminal to get size from (typically a pts pty)
|
* - terminal to get size from (typically a pts pty)
|
||||||
* @dstfd
|
* @dstfd
|
||||||
* - terminal to set size on (typically a ptmx pty)
|
* - terminal to set size on (typically a ptx pty)
|
||||||
*/
|
*/
|
||||||
extern void lxc_terminal_winsz(int srcfd, int dstfd);
|
extern void lxc_terminal_winsz(int srcfd, int dstfd);
|
||||||
|
|
||||||
|
@ -37,14 +37,14 @@
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static void test_console_close_all(int ttyfd[MAXCONSOLES],
|
static void test_console_close_all(int ttyfd[MAXCONSOLES],
|
||||||
int ptmxfd[MAXCONSOLES])
|
int ptxfd[MAXCONSOLES])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < MAXCONSOLES; i++) {
|
for (i = 0; i < MAXCONSOLES; i++) {
|
||||||
if (ptmxfd[i] != -1) {
|
if (ptxfd[i] != -1) {
|
||||||
close(ptmxfd[i]);
|
close(ptxfd[i]);
|
||||||
ptmxfd[i] = -1;
|
ptxfd[i] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ttyfd[i] != -1) {
|
if (ttyfd[i] != -1) {
|
||||||
@ -59,14 +59,14 @@ static int test_console_running_container(struct lxc_container *c)
|
|||||||
int nrconsoles, i, ret = -1;
|
int nrconsoles, i, ret = -1;
|
||||||
int ttynum [MAXCONSOLES];
|
int ttynum [MAXCONSOLES];
|
||||||
int ttyfd [MAXCONSOLES];
|
int ttyfd [MAXCONSOLES];
|
||||||
int ptmxfd[MAXCONSOLES];
|
int ptxfd[MAXCONSOLES];
|
||||||
|
|
||||||
for (i = 0; i < MAXCONSOLES; i++)
|
for (i = 0; i < MAXCONSOLES; i++)
|
||||||
ttynum[i] = ttyfd[i] = ptmxfd[i] = -1;
|
ttynum[i] = ttyfd[i] = ptxfd[i] = -1;
|
||||||
|
|
||||||
ttynum[0] = 1;
|
ttynum[0] = 1;
|
||||||
|
|
||||||
ret = c->console_getfd(c, &ttynum[0], &ptmxfd[0]);
|
ret = c->console_getfd(c, &ttynum[0], &ptxfd[0]);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
TSTERR("console allocate failed");
|
TSTERR("console allocate failed");
|
||||||
goto err1;
|
goto err1;
|
||||||
@ -79,12 +79,12 @@ static int test_console_running_container(struct lxc_container *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* attempt to alloc same ttynum */
|
/* attempt to alloc same ttynum */
|
||||||
ret = c->console_getfd(c, &ttynum[0], &ptmxfd[1]);
|
ret = c->console_getfd(c, &ttynum[0], &ptxfd[1]);
|
||||||
if (ret != -1) {
|
if (ret != -1) {
|
||||||
TSTERR("console allocate should fail for allocated ttynum %d", ttynum[0]);
|
TSTERR("console allocate should fail for allocated ttynum %d", ttynum[0]);
|
||||||
goto err2;
|
goto err2;
|
||||||
}
|
}
|
||||||
close(ptmxfd[0]); ptmxfd[0] = -1;
|
close(ptxfd[0]); ptxfd[0] = -1;
|
||||||
close(ttyfd[0]); ttyfd[0] = -1;
|
close(ttyfd[0]); ttyfd[0] = -1;
|
||||||
|
|
||||||
/* ensure we can allocate all consoles, we do this a few times to
|
/* ensure we can allocate all consoles, we do this a few times to
|
||||||
@ -92,7 +92,7 @@ static int test_console_running_container(struct lxc_container *c)
|
|||||||
*/
|
*/
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
for (nrconsoles = 0; nrconsoles < MAXCONSOLES; nrconsoles++) {
|
for (nrconsoles = 0; nrconsoles < MAXCONSOLES; nrconsoles++) {
|
||||||
ret = c->console_getfd(c, &ttynum[nrconsoles], &ptmxfd[nrconsoles]);
|
ret = c->console_getfd(c, &ttynum[nrconsoles], &ptxfd[nrconsoles]);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
ttyfd[nrconsoles] = ret;
|
ttyfd[nrconsoles] = ret;
|
||||||
@ -103,13 +103,13 @@ static int test_console_running_container(struct lxc_container *c)
|
|||||||
goto err2;
|
goto err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
test_console_close_all(ttyfd, ptmxfd);
|
test_console_close_all(ttyfd, ptxfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
err2:
|
err2:
|
||||||
test_console_close_all(ttyfd, ptmxfd);
|
test_console_close_all(ttyfd, ptxfd);
|
||||||
|
|
||||||
err1:
|
err1:
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user