mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-10 04:47:39 +00:00
terminal: non-functional changes
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
d712f9e8f4
commit
e9a55b51b8
@ -1162,22 +1162,22 @@ int lxc_terminal_prepare_login(int fd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lxc_terminal_info_init(struct lxc_terminal_info *pty)
|
void lxc_terminal_info_init(struct lxc_terminal_info *terminal)
|
||||||
{
|
{
|
||||||
pty->name[0] = '\0';
|
terminal->name[0] = '\0';
|
||||||
pty->master = -EBADF;
|
terminal->master = -EBADF;
|
||||||
pty->slave = -EBADF;
|
terminal->slave = -EBADF;
|
||||||
pty->busy = -1;
|
terminal->busy = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lxc_terminal_init(struct lxc_terminal *pty)
|
void lxc_terminal_init(struct lxc_terminal *terminal)
|
||||||
{
|
{
|
||||||
memset(pty, 0, sizeof(*pty));
|
memset(terminal, 0, sizeof(*terminal));
|
||||||
pty->slave = -EBADF;
|
terminal->slave = -EBADF;
|
||||||
pty->master = -EBADF;
|
terminal->master = -EBADF;
|
||||||
pty->peer = -EBADF;
|
terminal->peer = -EBADF;
|
||||||
pty->log_fd = -EBADF;
|
terminal->log_fd = -EBADF;
|
||||||
lxc_terminal_info_init(&pty->proxy);
|
lxc_terminal_info_init(&terminal->proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lxc_terminal_conf_free(struct lxc_terminal *terminal)
|
void lxc_terminal_conf_free(struct lxc_terminal *terminal)
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __LXC_CONSOLE_H
|
#ifndef __LXC_TERMINAL_H
|
||||||
#define __LXC_CONSOLE_H
|
#define __LXC_TERMINAL_H
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@ -36,15 +36,17 @@ struct lxc_container;
|
|||||||
struct lxc_conf;
|
struct lxc_conf;
|
||||||
struct lxc_epoll_descr;
|
struct lxc_epoll_descr;
|
||||||
|
|
||||||
/* Defines a structure containing a pty information for virtualizing a tty
|
|
||||||
* @name : the path name of the slave pty side
|
|
||||||
* @master : the file descriptor of the master
|
|
||||||
* @slave : the file descriptor of the slave
|
|
||||||
*/
|
|
||||||
struct lxc_terminal_info {
|
struct lxc_terminal_info {
|
||||||
|
/* the path name of the slave side */
|
||||||
char name[MAXPATHLEN];
|
char name[MAXPATHLEN];
|
||||||
|
|
||||||
|
/* the file descriptor of the master */
|
||||||
int master;
|
int master;
|
||||||
|
|
||||||
|
/* the file descriptor of the slave */
|
||||||
int slave;
|
int slave;
|
||||||
|
|
||||||
|
/* whether the terminal is currently used */
|
||||||
int busy;
|
int busy;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -53,25 +55,32 @@ struct lxc_terminal_state {
|
|||||||
int stdinfd;
|
int stdinfd;
|
||||||
int stdoutfd;
|
int stdoutfd;
|
||||||
int masterfd;
|
int masterfd;
|
||||||
/* Escape sequence to use for exiting the pty. A single char can be
|
|
||||||
* specified. The pty can then exited by doing: Ctrl + specified_char +
|
/* Escape sequence to use for exiting the terminal. A single char can
|
||||||
* q. This field is checked by lxc_terminal_stdin_cb(). Set to -1 to
|
* be specified. The terminal can then exited by doing: Ctrl +
|
||||||
* disable exiting the pty via a escape sequence.
|
* specified_char + q. This field is checked by
|
||||||
|
* lxc_terminal_stdin_cb(). Set to -1 to disable exiting the terminal
|
||||||
|
* via a escape sequence.
|
||||||
*/
|
*/
|
||||||
int escape;
|
int escape;
|
||||||
|
|
||||||
/* Used internally by lxc_terminal_stdin_cb() to check whether an
|
/* Used internally by lxc_terminal_stdin_cb() to check whether an
|
||||||
* escape sequence has been received.
|
* escape sequence has been received.
|
||||||
*/
|
*/
|
||||||
int saw_escape;
|
int saw_escape;
|
||||||
|
|
||||||
/* Name of the container to forward the SIGWINCH event to. */
|
/* Name of the container to forward the SIGWINCH event to. */
|
||||||
const char *winch_proxy;
|
const char *winch_proxy;
|
||||||
|
|
||||||
/* Path of the container to forward the SIGWINCH event to. */
|
/* Path of the container to forward the SIGWINCH event to. */
|
||||||
const char *winch_proxy_lxcpath;
|
const char *winch_proxy_lxcpath;
|
||||||
|
|
||||||
/* File descriptor that accepts signals. If set to -1 no signal handler
|
/* File descriptor that accepts signals. If set to -1 no signal handler
|
||||||
* could be installed. This also means that the sigset_t oldmask member
|
* could be installed. This also means that the sigset_t oldmask member
|
||||||
* is meaningless.
|
* is meaningless.
|
||||||
*/
|
*/
|
||||||
int sigfd;
|
int sigfd;
|
||||||
|
|
||||||
sigset_t oldmask;
|
sigset_t oldmask;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -86,7 +95,7 @@ struct lxc_terminal {
|
|||||||
struct termios *tios;
|
struct termios *tios;
|
||||||
struct lxc_terminal_state *tty_state;
|
struct lxc_terminal_state *tty_state;
|
||||||
|
|
||||||
struct /* lxc_console_log */ {
|
struct /* lxc_terminal_log */ {
|
||||||
/* size of the log file */
|
/* size of the log file */
|
||||||
uint64_t log_size;
|
uint64_t log_size;
|
||||||
|
|
||||||
@ -109,7 +118,7 @@ struct lxc_terminal {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* lxc_terminal_allocate: allocate the console or a tty
|
* lxc_terminal_allocate: allocate the console or a tty
|
||||||
*
|
*
|
||||||
* @conf : the configuration of the container to allocate from
|
* @conf : the configuration of the container to allocate from
|
||||||
@ -119,61 +128,54 @@ struct lxc_terminal {
|
|||||||
*/
|
*/
|
||||||
extern int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttynum);
|
extern int lxc_terminal_allocate(struct lxc_conf *conf, int sockfd, int *ttynum);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Create a new pty:
|
* Create a new terminal:
|
||||||
* - calls openpty() to allocate a master/slave pty pair
|
* - calls openpty() to allocate a master/slave pair
|
||||||
* - sets the FD_CLOEXEC flag on the master/slave fds
|
* - sets the FD_CLOEXEC flag on the master/slave fds
|
||||||
* - allocates either the current controlling pty (default) or a user specified
|
* - allocates either the current controlling terminal (default) or a user
|
||||||
* pty as peer pty for the newly created master/slave pair
|
* specified terminal as proxy for the newly created master/slave 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.)
|
||||||
* (For an unprivileged container the created pty on the host is not
|
|
||||||
* automatically chowned to the uid/gid of the unprivileged user. For this
|
|
||||||
* ttys_shift_ids() can be called.)
|
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_create(struct lxc_terminal *console);
|
extern int lxc_terminal_create(struct lxc_terminal *console);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lxc_terminal_setup: Create a new pty.
|
* lxc_terminal_setup: Create a new terminal.
|
||||||
* - In addition to lxc_terminal_create() also sets up all pty logs.
|
* - In addition to lxc_terminal_create() also sets up logging.
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_setup(struct lxc_conf *);
|
extern int lxc_terminal_setup(struct lxc_conf *);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Delete a pty created via lxc_terminal_setup():
|
* Delete a terminal created via lxc_terminal_create() or lxc_terminal_setup():
|
||||||
* - set old terminal settings
|
* Note, registered handlers are not automatically deleted.
|
||||||
* - memory allocated via lxc_terminal_setup() is free()ed.
|
|
||||||
* - close master/slave pty pair and allocated fd for the peer (usually
|
|
||||||
* /dev/tty)
|
|
||||||
* Registered handlers in a mainloop are not automatically deleted.
|
|
||||||
*/
|
*/
|
||||||
extern void lxc_terminal_delete(struct lxc_terminal *);
|
extern void lxc_terminal_delete(struct lxc_terminal *);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* lxc_terminal_free: mark the console or a tty as unallocated, free any
|
* lxc_terminal_free: mark the terminal as unallocated and free any resources
|
||||||
* resources allocated by lxc_terminal_allocate().
|
* allocated by lxc_terminal_allocate().
|
||||||
*
|
*
|
||||||
* @conf : the configuration of the container whose tty was closed
|
* @conf : the configuration of the container whose tty was closed
|
||||||
* @fd : the socket fd whose remote side was closed, which indicated
|
* @fd : the socket fd whose remote side was closed, which indicated
|
||||||
* the console or tty is no longer in use. this is used to match
|
* the terminal is no longer in use. this is used to match
|
||||||
* which console/tty is being freed.
|
* which terminal is being freed.
|
||||||
*/
|
*/
|
||||||
extern void lxc_terminal_free(struct lxc_conf *conf, int fd);
|
extern void lxc_terminal_free(struct lxc_conf *conf, int fd);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Register pty event handlers in an open mainloop
|
* Register terminal event handlers in an open mainloop.
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_mainloop_add(struct lxc_epoll_descr *, struct lxc_terminal *);
|
extern int lxc_terminal_mainloop_add(struct lxc_epoll_descr *, struct lxc_terminal *);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Handle SIGWINCH events on the allocated ptys.
|
* Handle SIGWINCH events on the allocated terminals.
|
||||||
*/
|
*/
|
||||||
extern void lxc_terminal_sigwinch(int sig);
|
extern void lxc_terminal_sigwinch(int sig);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Connect to one of the ptys given to the container via lxc.tty.max.
|
* Connect to one of the ttys given to the container via lxc.tty.max.
|
||||||
* - allocates either the current controlling pty (default) or a user specified
|
* - allocates either the current controlling terminal (default) or a user specified
|
||||||
* pty as peer pty for the containers tty
|
* terminal as proxy terminal for the containers tty
|
||||||
* - sets up SIGWINCH handler, winsz, and new terminal settings
|
* - sets up SIGWINCH handler, winsz, and new terminal settings
|
||||||
* - opens mainloop
|
* - opens mainloop
|
||||||
* - registers SIGWINCH, I/O handlers in the mainloop
|
* - registers SIGWINCH, I/O handlers in the mainloop
|
||||||
@ -183,24 +185,24 @@ extern 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);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Allocate one of the ptys given to the container via lxc.tty.max. Returns an
|
* Allocate one of the tty given to the container via lxc.tty.max. Returns an
|
||||||
* open fd to the allocated pty.
|
* open fd to the allocated tty.
|
||||||
* Set ttynum to -1 to allocate the first available pty, or to a value within
|
* Set ttynum to -1 to allocate the first available tty, or to a value within
|
||||||
* the range specified by lxc.tty.max to allocate a specific pty.
|
* 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 *masterfd);
|
int *masterfd);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Make fd a duplicate of the standard file descriptors:
|
* Make fd a duplicate of the standard file descriptors. The fd is made a
|
||||||
* fd is made a duplicate of a specific standard file descriptor iff the
|
* duplicate of a specific standard file descriptor iff the standard file
|
||||||
* standard file descriptor refers to a pty.
|
* descriptor refers to a terminal.
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_set_stdfds(int fd);
|
extern int lxc_terminal_set_stdfds(int fd);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Handler for events on the stdin fd of the pty. To be registered via the
|
* Handler for events on the stdin fd of the terminal. To be registered via the
|
||||||
* corresponding functions declared and defined in mainloop.{c,h} or
|
* 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.
|
||||||
@ -208,42 +210,46 @@ extern int lxc_terminal_set_stdfds(int fd);
|
|||||||
extern int lxc_terminal_stdin_cb(int fd, uint32_t events, void *cbdata,
|
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 master fd of the pty. To be registered via the
|
* Handler for events on the master fd of the terminal. To be registered via
|
||||||
* 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_master_cb(int fd, uint32_t events, void *cbdata,
|
extern int lxc_terminal_master_cb(int fd, uint32_t events, void *cbdata,
|
||||||
struct lxc_epoll_descr *descr);
|
struct lxc_epoll_descr *descr);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Setup new terminal properties. The old terminal settings are stored in
|
* Setup new terminal properties. The old terminal settings are stored in
|
||||||
* oldtios.
|
* oldtios.
|
||||||
*/
|
*/
|
||||||
extern int lxc_setup_tios(int fd, struct termios *oldtios);
|
extern int lxc_setup_tios(int fd, struct termios *oldtios);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* lxc_terminal_winsz: propagate winsz from one terminal to another
|
* lxc_terminal_winsz: propagate winsz from one terminal to another
|
||||||
*
|
*
|
||||||
* @srcfd : terminal to get size from (typically a slave pty)
|
* @srcfd
|
||||||
* @dstfd : terminal to set size on (typically a master pty)
|
* - terminal to get size from (typically a slave pty)
|
||||||
|
* @dstfd
|
||||||
|
* - terminal to set size on (typically a master pty)
|
||||||
*/
|
*/
|
||||||
extern void lxc_terminal_winsz(int srcfd, int dstfd);
|
extern void lxc_terminal_winsz(int srcfd, int dstfd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* lxc_terminal_signal_init: install signal handler
|
* lxc_terminal_signal_init: install signal handler
|
||||||
*
|
*
|
||||||
* @srcfd : src for winsz in SIGWINCH handler
|
* @srcfd
|
||||||
* @dstfd : dst for winsz in SIGWINCH handler
|
* - src for winsz in SIGWINCH handler
|
||||||
|
* @dstfd
|
||||||
|
* - dst for winsz in SIGWINCH handler
|
||||||
*
|
*
|
||||||
* Returns lxc_terminal_state structure on success or NULL on failure. The sigfd
|
* Returns lxc_terminal_state structure on success or NULL on failure. The
|
||||||
* member of the returned lxc_terminal_state can be select()/poll()ed/epoll()ed
|
* sigfd member of the returned lxc_terminal_state can be
|
||||||
* on (ie added to a mainloop) for signals.
|
* select()/poll()ed/epoll()ed on (i.e. added to a mainloop) for signals.
|
||||||
*
|
*
|
||||||
* Must be called with process_lock held to protect the lxc_ttys list, or
|
* Must be called with process_lock held to protect the lxc_ttys list, or from
|
||||||
* from a non-threaded context.
|
* a non-threaded context.
|
||||||
*
|
*
|
||||||
* Note that the signal handler isn't installed as a classic asychronous
|
* Note that the signal handler isn't installed as a classic asychronous
|
||||||
* handler, rather signalfd(2) is used so that we can handle the signal when
|
* handler, rather signalfd(2) is used so that we can handle the signal when
|
||||||
@ -256,17 +262,18 @@ extern void lxc_terminal_winsz(int srcfd, int dstfd);
|
|||||||
*/
|
*/
|
||||||
extern struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd);
|
extern struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Handler for signal events. To be registered via the corresponding functions
|
* Handler for signal events. To be registered via the corresponding functions
|
||||||
* declared and defined in mainloop.{c,h} or lxc_terminal_mainloop_add().
|
* declared and defined in mainloop.{c,h} or lxc_terminal_mainloop_add().
|
||||||
*/
|
*/
|
||||||
extern int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata,
|
extern int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata,
|
||||||
struct lxc_epoll_descr *descr);
|
struct lxc_epoll_descr *descr);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* lxc_terminal_signal_fini: uninstall signal handler
|
* lxc_terminal_signal_fini: uninstall signal handler
|
||||||
*
|
*
|
||||||
* @ts : the lxc_terminal_state returned by lxc_terminal_signal_init
|
* @ts
|
||||||
|
* - the lxc_terminal_state returned by lxc_terminal_signal_init
|
||||||
*
|
*
|
||||||
* Restore the saved signal handler that was in effect at the time
|
* Restore the saved signal handler that was in effect at the time
|
||||||
* lxc_terminal_signal_init() was called.
|
* lxc_terminal_signal_init() was called.
|
||||||
@ -276,16 +283,17 @@ extern int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata,
|
|||||||
*/
|
*/
|
||||||
extern void lxc_terminal_signal_fini(struct lxc_terminal_state *ts);
|
extern void lxc_terminal_signal_fini(struct lxc_terminal_state *ts);
|
||||||
|
|
||||||
extern int lxc_terminal_write_ringbuffer(struct lxc_terminal *console);
|
extern int lxc_terminal_write_ringbuffer(struct lxc_terminal *terminal);
|
||||||
extern int lxc_terminal_create_log_file(struct lxc_terminal *console);
|
extern int lxc_terminal_create_log_file(struct lxc_terminal *terminal);
|
||||||
extern int lxc_terminal_io_cb(int fd, uint32_t events, void *data,
|
extern int lxc_terminal_io_cb(int fd, uint32_t events, void *data,
|
||||||
struct lxc_epoll_descr *descr);
|
struct lxc_epoll_descr *descr);
|
||||||
|
|
||||||
extern int lxc_make_controlling_terminal(int fd);
|
extern int lxc_make_controlling_terminal(int fd);
|
||||||
extern int lxc_terminal_prepare_login(int fd);
|
extern int lxc_terminal_prepare_login(int fd);
|
||||||
extern void lxc_terminal_conf_free(struct lxc_terminal *console);
|
extern void lxc_terminal_conf_free(struct lxc_terminal *terminal);
|
||||||
extern void lxc_terminal_info_init(struct lxc_terminal_info *pty);
|
extern void lxc_terminal_info_init(struct lxc_terminal_info *terminal);
|
||||||
extern void lxc_terminal_init(struct lxc_terminal *pty);
|
extern void lxc_terminal_init(struct lxc_terminal *terminal);
|
||||||
extern int lxc_terminal_map_ids(struct lxc_conf *c, struct lxc_terminal *pty);
|
extern int lxc_terminal_map_ids(struct lxc_conf *c,
|
||||||
|
struct lxc_terminal *terminal);
|
||||||
|
|
||||||
#endif
|
#endif /* __LXC_TERMINAL_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user