#include <sys/types.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)
{
char buf[PATH_MAX];
- int ptmx, pts;
+ int ptx, pts;
- ptmx = open(_PATH_DEVPTMX, O_RDWR);
- if (ptmx == -1)
+ ptx = open(_PATH_DEVPTMX, O_RDWR);
+ if (ptx == -1)
return -1;
- if (grantpt(ptmx))
+ if (grantpt(ptx))
goto fail;
- if (unlockpt(ptmx))
+ if (unlockpt(ptx))
goto fail;
- if (ptsname_r(ptmx, buf, sizeof buf))
+ if (ptsname_r(ptx, buf, sizeof buf))
goto fail;
pts = open(buf, O_RDWR | O_NOCTTY);
if (winp)
ioctl(pts, TIOCSWINSZ, winp);
- *aptmx = ptmx;
+ *aptx = ptx;
*apts = pts;
if (name != NULL)
strcpy(name, buf);
return 0;
fail:
- close(ptmx);
+ close(ptx);
return -1;
}
#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
- * 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 winsize *__winp);
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)
close_prot_errno_disarm(ipc_sockets[0]);
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_log(&terminal);
}
* stored directly in data and datalen will be 0.
*
* 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.
*/
static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
ENOMEM, "Failed to receive response for command \"%s\"",
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);
rsp->data = rspdata;
}
* @name : name of container to connect to
* @ttynum : in: the tty to open or -1 for next available
* : 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
*
* Returns fd holding tty allocated on success, < 0 on failure
if (ret == 0)
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);
ret = cmd.rsp.ret; /* socket fd */
- *fd = rspdata->ptmxfd;
+ *fd = rspdata->ptxfd;
*ttynum = rspdata->ttynum;
return log_info(ret, "Alloced fd %d for tty %d via socket %d", *fd, rspdata->ttynum, ret);
struct lxc_handler *handler,
struct lxc_epoll_descr *descr)
{
- int ptmxfd, ret;
+ int ptxfd, ret;
struct lxc_cmd_rsp rsp;
int ttynum = PTR_TO_INT(req->data);
- ptmxfd = lxc_terminal_allocate(handler->conf, fd, &ttynum);
- if (ptmxfd < 0)
+ ptxfd = lxc_terminal_allocate(handler->conf, fd, &ttynum);
+ if (ptxfd < 0)
return LXC_CMD_REAP_CLIENT_FD;
memset(&rsp, 0, sizeof(rsp));
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) {
lxc_terminal_free(handler->conf, fd);
return log_error_errno(LXC_CMD_REAP_CLIENT_FD, errno,
};
struct lxc_cmd_console_rsp_data {
- int ptmxfd;
+ int ptxfd;
int ttynum;
};
for (size_t i = 0; i < ttys->max; i++) {
struct lxc_terminal_info *tty = &ttys->tty[i];
- tty->ptmx = -EBADF;
+ tty->ptx = -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) {
ttys->max = i;
return log_error_errno(-ENOTTY, ENOTTY, "Failed to create tty %zu", 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",
- tty->name, tty->ptmx, tty->pts);
+ DEBUG("Created tty \"%s\" with ptx fd %d and pts fd %d",
+ tty->name, tty->ptx, tty->pts);
/* Prevent leaking the file descriptors to the container */
- ret = fd_cloexec(tty->ptmx, true);
+ ret = fd_cloexec(tty->ptx, true);
if (ret < 0)
- SYSWARN("Failed to set FD_CLOEXEC flag on ptmx fd %d of tty device \"%s\"",
- tty->ptmx, tty->name);
+ SYSWARN("Failed to set FD_CLOEXEC flag on ptx fd %d of tty device \"%s\"",
+ tty->ptx, tty->name);
ret = fd_cloexec(tty->pts, true);
if (ret < 0)
for (int i = 0; i < ttys->max; 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);
}
int ttyfds[2];
struct lxc_terminal_info *tty = &ttys->tty[i];
- ttyfds[0] = tty->ptmx;
+ ttyfds[0] = tty->ptx;
ttyfds[1] = tty->pts;
ret = lxc_abstract_unix_send_fds(sock, ttyfds, 2, NULL, 0);
if (ret < 0)
break;
- TRACE("Sent tty \"%s\" with ptmx fd %d and pts fd %d to parent",
- tty->name, tty->ptmx, tty->pts);
+ TRACE("Sent tty \"%s\" with ptx fd %d and pts fd %d to parent",
+ tty->name, tty->ptx, tty->pts);
}
if (ret < 0)
new->console.path = NULL;
new->console.peer = -1;
new->console.proxy.busy = -1;
- new->console.proxy.ptmx = -1;
+ new->console.proxy.ptx = -1;
new->console.proxy.pts = -1;
- new->console.ptmx = -1;
+ new->console.ptx = -1;
new->console.pts = -1;
new->console.name[0] = '\0';
memset(&new->console.ringbuf, 0, sizeof(struct lxc_ringbuf));
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)
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 *)
* \param c Container.
* \param[in,out] ttynum Terminal number to attempt to allocate,
* 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
* failure.
* descriptor when no longer required so that it may be allocated
* 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.
tty = &ttys->tty[i];
tty->busy = -1;
- tty->ptmx = ttyfds[0];
+ tty->ptx = ttyfds[0];
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)
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,
memset(ts, 0, sizeof(*ts));
ts->stdinfd = srcfd;
- ts->ptmxfd = dstfd;
+ ts->ptxfd = dstfd;
ts->sigfd = -1;
ret = sigemptyset(&mask);
INFO("Terminal client on fd %d has exited", fd);
lxc_mainloop_del_handler(descr, fd);
- if (fd == terminal->ptmx) {
- terminal->ptmx = -EBADF;
+ if (fd == terminal->ptx) {
+ terminal->ptx = -EBADF;
} else if (fd == terminal->peer) {
lxc_terminal_signal_fini(terminal);
terminal->peer = -EBADF;
}
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;
- if (fd == terminal->ptmx) {
+ if (fd == terminal->ptx) {
/* write to peer first */
if (terminal->peer >= 0)
w = lxc_write_nointr(terminal->peer, buf, r);
{
int ret;
- if (terminal->ptmx < 0) {
+ if (terminal->ptx < 0) {
INFO("Terminal is not initialized");
return 0;
}
- ret = lxc_mainloop_add_handler(descr, terminal->ptmx,
+ ret = lxc_mainloop_add_handler(descr, terminal->ptx,
lxc_terminal_io_cb, terminal);
if (ret < 0) {
- ERROR("Failed to add handler for terminal ptmx fd %d to "
- "mainloop", terminal->ptmx);
+ ERROR("Failed to add handler for terminal ptx fd %d to "
+ "mainloop", terminal->ptx);
return -1;
}
{
lxc_terminal_signal_fini(terminal);
- close(terminal->proxy.ptmx);
- terminal->proxy.ptmx = -1;
+ close(terminal->proxy.ptx);
+ terminal->proxy.ptx = -1;
close(terminal->proxy.pts);
terminal->proxy.pts = -1;
struct termios oldtermio;
struct lxc_terminal_state *ts;
- if (terminal->ptmx < 0) {
+ if (terminal->ptx < 0) {
ERROR("Terminal not set up");
return -1;
}
}
/* 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);
if (ret < 0) {
SYSERROR("Failed to open proxy terminal");
goto on_error;
}
- ret = fd_cloexec(terminal->proxy.ptmx, true);
+ ret = fd_cloexec(terminal->proxy.ptx, true);
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;
}
if (ret < 0)
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)
goto on_error;
if (ret < 0)
goto on_error;
- NOTICE("Opened proxy terminal with ptmx fd %d and pts fd %d",
- terminal->proxy.ptmx, terminal->proxy.pts);
+ NOTICE("Opened proxy terminal with ptx fd %d and pts fd %d",
+ terminal->proxy.ptx, terminal->proxy.pts);
return 0;
on_error:
int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq)
{
int ttynum;
- int ptmxfd = -1;
+ int ptxfd = -1;
struct lxc_tty_info *ttys = &conf->ttys;
struct lxc_terminal *terminal = &conf->console;
if (ret < 0)
goto out;
- ptmxfd = terminal->proxy.ptmx;
+ ptxfd = terminal->proxy.ptx;
goto out;
}
out_tty:
ttys->tty[ttynum - 1].busy = sockfd;
- ptmxfd = ttys->tty[ttynum - 1].ptmx;
+ ptxfd = ttys->tty[ttynum - 1].ptx;
out:
- return ptmxfd;
+ return ptxfd;
}
void lxc_terminal_free(struct lxc_conf *conf, int fd)
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;
if (!ts) {
WARN("Failed to install signal handler");
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));
if (!terminal->tios)
close(terminal->peer);
terminal->peer = -1;
- if (terminal->ptmx >= 0)
- close(terminal->ptmx);
- terminal->ptmx = -1;
+ if (terminal->ptx >= 0)
+ close(terminal->ptx);
+ terminal->ptx = -1;
if (terminal->pts >= 0)
close(terminal->pts);
/**
* 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.
*/
static int lxc_terminal_create_ringbuf(struct lxc_terminal *terminal)
{
int ret;
- ret = openpty(&terminal->ptmx, &terminal->pts, NULL, NULL, NULL);
+ ret = openpty(&terminal->ptx, &terminal->pts, NULL, NULL, NULL);
if (ret < 0) {
SYSERROR("Failed to open terminal");
return -1;
goto err;
}
- ret = fd_cloexec(terminal->ptmx, true);
+ ret = fd_cloexec(terminal->ptx, true);
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;
}
ts->saw_escape = 0;
}
- ret = lxc_write_nointr(ts->ptmxfd, &c, 1);
+ ret = lxc_write_nointr(ts->ptxfd, &c, 1);
if (ret <= 0)
return LXC_MAINLOOP_CLOSE;
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)
{
int r, w;
char buf[LXC_TERMINAL_BUFFER_SIZE];
struct lxc_terminal_state *ts = cbdata;
- if (fd != ts->ptmxfd)
+ if (fd != ts->ptxfd)
return LXC_MAINLOOP_CLOSE;
r = lxc_read_nointr(fd, buf, sizeof(buf));
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 stdinfd, int stdoutfd, int stderrfd,
int escape)
{
- int ptmxfd, ret, ttyfd;
+ int ptxfd, ret, ttyfd;
struct lxc_epoll_descr descr;
struct termios oldtios;
struct lxc_terminal_state *ts;
};
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)
return -1;
if (ret < 0)
TRACE("Process is already group leader");
- ts = lxc_terminal_signal_init(stdinfd, ptmxfd);
+ ts = lxc_terminal_signal_init(stdinfd, ptxfd);
if (!ts) {
ret = -1;
goto close_fds;
istty = isatty(stdinfd);
if (istty) {
- lxc_terminal_winsz(stdinfd, ptmxfd);
- lxc_terminal_winsz(ts->stdinfd, ts->ptmxfd);
+ lxc_terminal_winsz(stdinfd, ptxfd);
+ lxc_terminal_winsz(ts->stdinfd, ts->ptxfd);
} else {
INFO("File descriptor %d does not refer to a terminal", stdinfd);
}
goto close_mainloop;
}
- ret = lxc_mainloop_add_handler(&descr, ts->ptmxfd,
- lxc_terminal_ptmx_cb, ts);
+ ret = lxc_mainloop_add_handler(&descr, ts->ptxfd,
+ lxc_terminal_ptx_cb, ts);
if (ret < 0) {
- ERROR("Failed to add ptmx handler");
+ ERROR("Failed to add ptx handler");
goto close_mainloop;
}
lxc_terminal_signal_fini(&terminal);
close_fds:
- close(ptmxfd);
+ close(ptxfd);
close(ttyfd);
return ret;
void lxc_terminal_info_init(struct lxc_terminal_info *terminal)
{
terminal->name[0] = '\0';
- terminal->ptmx = -EBADF;
+ terminal->ptx = -EBADF;
terminal->pts = -EBADF;
terminal->busy = -1;
}
{
memset(terminal, 0, sizeof(*terminal));
terminal->pts = -EBADF;
- terminal->ptmx = -EBADF;
+ terminal->ptx = -EBADF;
terminal->peer = -EBADF;
terminal->log_fd = -EBADF;
lxc_terminal_info_init(&terminal->proxy);
/* the path name of the pts side */
char name[PATH_MAX];
- /* the file descriptor of the ptmx */
- int ptmx;
+ /* the file descriptor of the ptx */
+ int ptx;
/* the file descriptor of the pts */
int pts;
struct lxc_list node;
int stdinfd;
int stdoutfd;
- int ptmxfd;
+ int ptxfd;
/* Escape sequence to use for exiting the terminal. A single char can
* be specified. The terminal can then exited by doing: Ctrl +
struct lxc_terminal {
int pts;
- int ptmx;
+ int ptx;
int peer;
struct lxc_terminal_info proxy;
struct lxc_epoll_descr *descr;
/**
* Create a new terminal:
- * - calls openpty() to allocate a ptmx/pts pair
- * - sets the FD_CLOEXEC flag on the ptmx/pts fds
+ * - calls openpty() to allocate a ptx/pts pair
+ * - sets the FD_CLOEXEC flag on the ptx/pts fds
* - 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
* (Handlers for SIGWINCH and I/O are not registered in a mainloop.)
*/
* the range specified by lxc.tty.max to allocate a specific tty.
*/
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
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
* lxc_terminal_mainloop_add().
* 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);
/**
* @srcfd
* - terminal to get size from (typically a pts pty)
* @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);
} while (0)
static void test_console_close_all(int ttyfd[MAXCONSOLES],
- int ptmxfd[MAXCONSOLES])
+ int ptxfd[MAXCONSOLES])
{
int i;
for (i = 0; i < MAXCONSOLES; i++) {
- if (ptmxfd[i] != -1) {
- close(ptmxfd[i]);
- ptmxfd[i] = -1;
+ if (ptxfd[i] != -1) {
+ close(ptxfd[i]);
+ ptxfd[i] = -1;
}
if (ttyfd[i] != -1) {
int nrconsoles, i, ret = -1;
int ttynum [MAXCONSOLES];
int ttyfd [MAXCONSOLES];
- int ptmxfd[MAXCONSOLES];
+ int ptxfd[MAXCONSOLES];
for (i = 0; i < MAXCONSOLES; i++)
- ttynum[i] = ttyfd[i] = ptmxfd[i] = -1;
+ ttynum[i] = ttyfd[i] = ptxfd[i] = -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) {
TSTERR("console allocate failed");
goto err1;
}
/* 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) {
TSTERR("console allocate should fail for allocated ttynum %d", ttynum[0]);
goto err2;
}
- close(ptmxfd[0]); ptmxfd[0] = -1;
+ close(ptxfd[0]); ptxfd[0] = -1;
close(ttyfd[0]); ttyfd[0] = -1;
/* ensure we can allocate all consoles, we do this a few times to
*/
for (i = 0; i < 10; i++) {
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)
break;
ttyfd[nrconsoles] = ret;
goto err2;
}
- test_console_close_all(ttyfd, ptmxfd);
+ test_console_close_all(ttyfd, ptxfd);
}
ret = 0;
err2:
- test_console_close_all(ttyfd, ptmxfd);
+ test_console_close_all(ttyfd, ptxfd);
err1:
return ret;