2007-11-17 20:14:51 +03:00
|
|
|
#ifndef QEMU_CHAR_H
|
|
|
|
#define QEMU_CHAR_H
|
|
|
|
|
2009-03-06 02:01:23 +03:00
|
|
|
#include "qemu-common.h"
|
2012-12-17 21:20:00 +04:00
|
|
|
#include "qemu/queue.h"
|
|
|
|
#include "qemu/option.h"
|
|
|
|
#include "qemu/config-file.h"
|
2012-12-17 21:19:44 +04:00
|
|
|
#include "block/aio.h"
|
2012-12-17 21:19:43 +04:00
|
|
|
#include "qapi/qmp/qobject.h"
|
|
|
|
#include "qapi/qmp/qstring.h"
|
2012-12-17 21:20:00 +04:00
|
|
|
#include "qemu/main-loop.h"
|
2009-03-06 02:01:23 +03:00
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
/* character device */
|
|
|
|
|
2009-03-06 02:01:47 +03:00
|
|
|
#define CHR_EVENT_BREAK 0 /* serial break char */
|
|
|
|
#define CHR_EVENT_FOCUS 1 /* focus to this terminal (modal input needed) */
|
2009-10-07 17:01:16 +04:00
|
|
|
#define CHR_EVENT_OPENED 2 /* new connection established */
|
2009-03-06 02:01:47 +03:00
|
|
|
#define CHR_EVENT_MUX_IN 3 /* mux-focus was set to this terminal */
|
|
|
|
#define CHR_EVENT_MUX_OUT 4 /* mux-focus will move on */
|
2009-08-11 19:57:48 +04:00
|
|
|
#define CHR_EVENT_CLOSED 5 /* connection closed */
|
2007-11-17 20:14:51 +03:00
|
|
|
|
|
|
|
|
|
|
|
#define CHR_IOCTL_SERIAL_SET_PARAMS 1
|
|
|
|
typedef struct {
|
|
|
|
int speed;
|
|
|
|
int parity;
|
|
|
|
int data_bits;
|
|
|
|
int stop_bits;
|
|
|
|
} QEMUSerialSetParams;
|
|
|
|
|
|
|
|
#define CHR_IOCTL_SERIAL_SET_BREAK 2
|
|
|
|
|
|
|
|
#define CHR_IOCTL_PP_READ_DATA 3
|
|
|
|
#define CHR_IOCTL_PP_WRITE_DATA 4
|
|
|
|
#define CHR_IOCTL_PP_READ_CONTROL 5
|
|
|
|
#define CHR_IOCTL_PP_WRITE_CONTROL 6
|
|
|
|
#define CHR_IOCTL_PP_READ_STATUS 7
|
|
|
|
#define CHR_IOCTL_PP_EPP_READ_ADDR 8
|
|
|
|
#define CHR_IOCTL_PP_EPP_READ 9
|
|
|
|
#define CHR_IOCTL_PP_EPP_WRITE_ADDR 10
|
|
|
|
#define CHR_IOCTL_PP_EPP_WRITE 11
|
2008-08-22 12:57:09 +04:00
|
|
|
#define CHR_IOCTL_PP_DATA_DIR 12
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2008-08-23 01:25:00 +04:00
|
|
|
#define CHR_IOCTL_SERIAL_SET_TIOCM 13
|
|
|
|
#define CHR_IOCTL_SERIAL_GET_TIOCM 14
|
2008-08-11 18:17:04 +04:00
|
|
|
|
|
|
|
#define CHR_TIOCM_CTS 0x020
|
|
|
|
#define CHR_TIOCM_CAR 0x040
|
|
|
|
#define CHR_TIOCM_DSR 0x100
|
|
|
|
#define CHR_TIOCM_RI 0x080
|
|
|
|
#define CHR_TIOCM_DTR 0x002
|
|
|
|
#define CHR_TIOCM_RTS 0x004
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
typedef void IOEventHandler(void *opaque, int event);
|
|
|
|
|
|
|
|
struct CharDriverState {
|
2014-06-18 10:43:58 +04:00
|
|
|
QemuMutex chr_write_lock;
|
2009-01-18 17:08:04 +03:00
|
|
|
void (*init)(struct CharDriverState *s);
|
2007-11-17 20:14:51 +03:00
|
|
|
int (*chr_write)(struct CharDriverState *s, const uint8_t *buf, int len);
|
2014-05-27 16:03:48 +04:00
|
|
|
int (*chr_sync_read)(struct CharDriverState *s,
|
|
|
|
const uint8_t *buf, int len);
|
2013-03-05 21:51:23 +04:00
|
|
|
GSource *(*chr_add_watch)(struct CharDriverState *s, GIOCondition cond);
|
2007-11-17 20:14:51 +03:00
|
|
|
void (*chr_update_read_handler)(struct CharDriverState *s);
|
|
|
|
int (*chr_ioctl)(struct CharDriverState *s, int cmd, void *arg);
|
2014-05-27 16:04:15 +04:00
|
|
|
int (*get_msgfds)(struct CharDriverState *s, int* fds, int num);
|
2014-05-27 16:04:02 +04:00
|
|
|
int (*set_msgfds)(struct CharDriverState *s, int *fds, int num);
|
Introduce a 'client_add' monitor command accepting an open FD
Allow client connections for VNC and socket based character
devices to be passed in over the monitor using SCM_RIGHTS.
One intended usage scenario is to start QEMU with VNC on a
UNIX domain socket. An unprivileged user which cannot access
the UNIX domain socket, can then connect to QEMU's VNC server
by passing an open FD to libvirt, which passes it onto QEMU.
{ "execute": "get_fd", "arguments": { "fdname": "myclient" } }
{ "return": {} }
{ "execute": "add_client", "arguments": { "protocol": "vnc",
"fdname": "myclient",
"skipauth": true } }
{ "return": {} }
In this case 'protocol' can be 'vnc' or 'spice', or the name
of a character device (eg from -chardev id=XXXX)
The 'skipauth' parameter can be used to skip any configured
VNC authentication scheme, which is useful if the mgmt layer
talking to the monitor has already authenticated the client
in another way.
* console.h: Define 'vnc_display_add_client' method
* monitor.c: Implement 'client_add' command
* qemu-char.c, qemu-char.h: Add 'qemu_char_add_client' method
* qerror.c, qerror.h: Add QERR_ADD_CLIENT_FAILED
* qmp-commands.hx: Declare 'client_add' command
* ui/vnc.c: Implement 'vnc_display_add_client' method
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2011-06-23 16:31:42 +04:00
|
|
|
int (*chr_add_client)(struct CharDriverState *chr, int fd);
|
2007-11-17 20:14:51 +03:00
|
|
|
IOEventHandler *chr_event;
|
2010-03-11 19:55:39 +03:00
|
|
|
IOCanReadHandler *chr_can_read;
|
2007-11-17 20:14:51 +03:00
|
|
|
IOReadHandler *chr_read;
|
|
|
|
void *handler_opaque;
|
|
|
|
void (*chr_close)(struct CharDriverState *chr);
|
2007-11-25 03:55:06 +03:00
|
|
|
void (*chr_accept_input)(struct CharDriverState *chr);
|
2010-12-23 15:42:48 +03:00
|
|
|
void (*chr_set_echo)(struct CharDriverState *chr, bool echo);
|
2013-03-26 14:07:58 +04:00
|
|
|
void (*chr_set_fe_open)(struct CharDriverState *chr, int fe_open);
|
2013-12-02 01:23:39 +04:00
|
|
|
void (*chr_fe_event)(struct CharDriverState *chr, int event);
|
2007-11-17 20:14:51 +03:00
|
|
|
void *opaque;
|
2008-10-31 20:31:29 +03:00
|
|
|
char *label;
|
|
|
|
char *filename;
|
qemu-char: add logfile facility to all chardev backends
Typically a UNIX guest OS will log boot messages to a serial
port in addition to any graphical console. An admin user
may also wish to use the serial port for an interactive
console. A virtualization management system may wish to
collect system boot messages by logging the serial port,
but also wish to allow admins interactive access.
Currently providing such a feature forces the mgmt app
to either provide 2 separate serial ports, one for
logging boot messages and one for interactive console
login, or to proxy all output via a separate service
that can multiplex the two needs onto one serial port.
While both are valid approaches, they each have their
own downsides. The former causes confusion and extra
setup work for VM admins creating disk images. The latter
places an extra burden to re-implement much of the QEMU
chardev backends logic in libvirt or even higher level
mgmt apps and adds extra hops in the data transfer path.
A simpler approach that is satisfactory for many use
cases is to allow the QEMU chardev backends to have a
"logfile" property associated with them.
$QEMU -chardev socket,host=localhost,port=9000,\
server=on,nowait,id-charserial0,\
logfile=/var/log/libvirt/qemu/test-serial0.log
-device isa-serial,chardev=charserial0,id=serial0
This patch introduces a 'ChardevCommon' struct which
is setup as a base for all the ChardevBackend types.
Ideally this would be registered directly as a base
against ChardevBackend, rather than each type, but
the QAPI generator doesn't allow that since the
ChardevBackend is a non-discriminated union. The
ChardevCommon struct provides the optional 'logfile'
parameter, as well as 'logappend' which controls
whether QEMU truncates or appends (default truncate).
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1452516281-27519-1-git-send-email-berrange@redhat.com>
[Call qemu_chr_parse_common if cd->parse is NULL. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2016-01-11 15:44:41 +03:00
|
|
|
int logfd;
|
2013-03-26 14:07:53 +04:00
|
|
|
int be_open;
|
2013-03-26 14:07:55 +04:00
|
|
|
int fe_open;
|
2013-03-26 14:07:56 +04:00
|
|
|
int explicit_fe_open;
|
qemu-char: don't issue CHR_EVENT_OPEN in a BH
When CHR_EVENT_OPENED was initially added, it was CHR_EVENT_RESET,
and it was issued as a bottom-half:
86e94dea5b740dad65446c857f6959eae43e0ba6
Which we basically used to print out a greeting/prompt for the
monitor.
AFAICT the only reason this was ever done in a BH was because in
some cases we'd modify the chr_write handler for a new chardev
backend *after* the site where we issued the reset (see:
86e94d:qemu_chr_open_stdio())
At some point this event was renamed to CHR_EVENT_OPENED, and we've
maintained the use of this BH ever since.
However, due to 9f939df955a4152aad69a19a77e0898631bb2c18, we schedule
the BH via g_idle_add(), which is causing events to sometimes be
delivered after we've already begun processing data from backends,
leading to:
known bugs:
QMP:
session negotation resets with OPENED event, in some cases this
is causing new sessions to get sporadically reset
potential bugs:
hw/usb/redirect.c:
can_read handler checks for dev->parser != NULL, which may be
true if CLOSED BH has not been executed yet. In the past, OPENED
quiesced outstanding CLOSED events prior to us reading client
data. If it's delayed, our check may allow reads to occur even
though we haven't processed the OPENED event yet, and when we
do finally get the OPENED event, our state may get reset.
qtest.c:
can begin session before OPENED event is processed, leading to
a spurious reset of the system and irq_levels
gdbstub.c:
may start a gdb session prior to the machine being paused
To fix these, let's just drop the BH.
Since the initial reasoning for using it still applies to an extent,
work around that by deferring the delivery of CHR_EVENT_OPENED until
after the chardevs have been fully initialized, toward the end of
qmp_chardev_add() (or some cases, qemu_chr_new_from_opts()). This
defers delivery long enough that we can be assured a CharDriverState
is fully initialized before CHR_EVENT_OPENED is sent.
Also, rather than requiring each chardev to do an explicit open, do it
automatically, and allow the small few who don't desire such behavior to
suppress the OPENED-on-init behavior by setting a 'explicit_be_open'
flag.
We additionally add missing OPENED events for stdio backends on w32,
which were previously not being issued, causing us to not recieve the
banner and initial prompts for qmp/hmp.
Reported-by: Stefan Priebe <s.priebe@profihost.ag>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Message-id: 1370636393-21044-1-git-send-email-mdroth@linux.vnet.ibm.com
Cc: qemu-stable@nongnu.org
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2013-06-08 00:19:53 +04:00
|
|
|
int explicit_be_open;
|
2011-04-26 14:19:26 +04:00
|
|
|
int avail_connections;
|
chardev: fix CHR_EVENT_OPENED events for mux chardevs
As of bd5c51ee6c4f1c79cae5ad2516d711a27b4ea8ec, chardevs no longer use
bottom-halves to issue CHR_EVENT_OPENED events. To maintain past
semantics, we instead defer the CHR_EVENT_OPENED events toward the end
of chardev initialization.
For muxes, this isn't good enough, since a range of FEs must be able
to attach to the mux prior to any CHR_EVENT_OPENED being issued, else
each FE will immediately print it's initial output (prompts, banners,
etc.) just prior to us switching to the next FE as part of
initialization.
The is new and confusing behavior for users, as they'll see output for
things like the HMP monitor, even though their the current mux focus
may be a guest serial port with potentially no output.
We fix this by further deferring CHR_EVENT_OPENED events for FEs
associated with muxes until after machine init by flagging mux chardevs
with 'explicit_be_open', which suppresses emission of CHR_EVENT_OPENED
events until we explicitly set the mux as opened later.
Currently, we must defer till after machine init since we potentially
associate FEs with muxes as part of realize (for instance,
serial_isa_realizefn).
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Message-id: 1375207462-8141-1-git-send-email-mdroth@linux.vnet.ibm.com
Cc: qemu-stable@nongnu.org
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2013-07-30 22:04:22 +04:00
|
|
|
int is_mux;
|
2013-08-28 13:48:29 +04:00
|
|
|
guint fd_in_tag;
|
2012-10-15 11:30:59 +04:00
|
|
|
QemuOpts *opts;
|
2009-09-12 11:36:22 +04:00
|
|
|
QTAILQ_ENTRY(CharDriverState) next;
|
2007-11-17 20:14:51 +03:00
|
|
|
};
|
|
|
|
|
2014-06-18 10:43:55 +04:00
|
|
|
/**
|
qemu-char: add logfile facility to all chardev backends
Typically a UNIX guest OS will log boot messages to a serial
port in addition to any graphical console. An admin user
may also wish to use the serial port for an interactive
console. A virtualization management system may wish to
collect system boot messages by logging the serial port,
but also wish to allow admins interactive access.
Currently providing such a feature forces the mgmt app
to either provide 2 separate serial ports, one for
logging boot messages and one for interactive console
login, or to proxy all output via a separate service
that can multiplex the two needs onto one serial port.
While both are valid approaches, they each have their
own downsides. The former causes confusion and extra
setup work for VM admins creating disk images. The latter
places an extra burden to re-implement much of the QEMU
chardev backends logic in libvirt or even higher level
mgmt apps and adds extra hops in the data transfer path.
A simpler approach that is satisfactory for many use
cases is to allow the QEMU chardev backends to have a
"logfile" property associated with them.
$QEMU -chardev socket,host=localhost,port=9000,\
server=on,nowait,id-charserial0,\
logfile=/var/log/libvirt/qemu/test-serial0.log
-device isa-serial,chardev=charserial0,id=serial0
This patch introduces a 'ChardevCommon' struct which
is setup as a base for all the ChardevBackend types.
Ideally this would be registered directly as a base
against ChardevBackend, rather than each type, but
the QAPI generator doesn't allow that since the
ChardevBackend is a non-discriminated union. The
ChardevCommon struct provides the optional 'logfile'
parameter, as well as 'logappend' which controls
whether QEMU truncates or appends (default truncate).
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1452516281-27519-1-git-send-email-berrange@redhat.com>
[Call qemu_chr_parse_common if cd->parse is NULL. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2016-01-11 15:44:41 +03:00
|
|
|
* qemu_chr_alloc:
|
|
|
|
* @backend: the common backend config
|
|
|
|
* @errp: pointer to a NULL-initialized error object
|
2014-06-18 10:43:55 +04:00
|
|
|
*
|
|
|
|
* Allocate and initialize a new CharDriverState.
|
|
|
|
*
|
qemu-char: add logfile facility to all chardev backends
Typically a UNIX guest OS will log boot messages to a serial
port in addition to any graphical console. An admin user
may also wish to use the serial port for an interactive
console. A virtualization management system may wish to
collect system boot messages by logging the serial port,
but also wish to allow admins interactive access.
Currently providing such a feature forces the mgmt app
to either provide 2 separate serial ports, one for
logging boot messages and one for interactive console
login, or to proxy all output via a separate service
that can multiplex the two needs onto one serial port.
While both are valid approaches, they each have their
own downsides. The former causes confusion and extra
setup work for VM admins creating disk images. The latter
places an extra burden to re-implement much of the QEMU
chardev backends logic in libvirt or even higher level
mgmt apps and adds extra hops in the data transfer path.
A simpler approach that is satisfactory for many use
cases is to allow the QEMU chardev backends to have a
"logfile" property associated with them.
$QEMU -chardev socket,host=localhost,port=9000,\
server=on,nowait,id-charserial0,\
logfile=/var/log/libvirt/qemu/test-serial0.log
-device isa-serial,chardev=charserial0,id=serial0
This patch introduces a 'ChardevCommon' struct which
is setup as a base for all the ChardevBackend types.
Ideally this would be registered directly as a base
against ChardevBackend, rather than each type, but
the QAPI generator doesn't allow that since the
ChardevBackend is a non-discriminated union. The
ChardevCommon struct provides the optional 'logfile'
parameter, as well as 'logappend' which controls
whether QEMU truncates or appends (default truncate).
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1452516281-27519-1-git-send-email-berrange@redhat.com>
[Call qemu_chr_parse_common if cd->parse is NULL. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2016-01-11 15:44:41 +03:00
|
|
|
* Returns: a newly allocated CharDriverState, or NULL on error.
|
2014-06-18 10:43:55 +04:00
|
|
|
*/
|
qemu-char: add logfile facility to all chardev backends
Typically a UNIX guest OS will log boot messages to a serial
port in addition to any graphical console. An admin user
may also wish to use the serial port for an interactive
console. A virtualization management system may wish to
collect system boot messages by logging the serial port,
but also wish to allow admins interactive access.
Currently providing such a feature forces the mgmt app
to either provide 2 separate serial ports, one for
logging boot messages and one for interactive console
login, or to proxy all output via a separate service
that can multiplex the two needs onto one serial port.
While both are valid approaches, they each have their
own downsides. The former causes confusion and extra
setup work for VM admins creating disk images. The latter
places an extra burden to re-implement much of the QEMU
chardev backends logic in libvirt or even higher level
mgmt apps and adds extra hops in the data transfer path.
A simpler approach that is satisfactory for many use
cases is to allow the QEMU chardev backends to have a
"logfile" property associated with them.
$QEMU -chardev socket,host=localhost,port=9000,\
server=on,nowait,id-charserial0,\
logfile=/var/log/libvirt/qemu/test-serial0.log
-device isa-serial,chardev=charserial0,id=serial0
This patch introduces a 'ChardevCommon' struct which
is setup as a base for all the ChardevBackend types.
Ideally this would be registered directly as a base
against ChardevBackend, rather than each type, but
the QAPI generator doesn't allow that since the
ChardevBackend is a non-discriminated union. The
ChardevCommon struct provides the optional 'logfile'
parameter, as well as 'logappend' which controls
whether QEMU truncates or appends (default truncate).
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1452516281-27519-1-git-send-email-berrange@redhat.com>
[Call qemu_chr_parse_common if cd->parse is NULL. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2016-01-11 15:44:41 +03:00
|
|
|
CharDriverState *qemu_chr_alloc(ChardevCommon *backend, Error **errp);
|
2014-06-18 10:43:55 +04:00
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_new_from_opts:
|
|
|
|
*
|
|
|
|
* Create a new character backend from a QemuOpts list.
|
|
|
|
*
|
|
|
|
* @opts see qemu-config.c for a list of valid options
|
|
|
|
* @init not sure..
|
|
|
|
*
|
|
|
|
* Returns: a new character backend
|
|
|
|
*/
|
2011-08-15 20:17:37 +04:00
|
|
|
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
2012-10-15 11:28:05 +04:00
|
|
|
void (*init)(struct CharDriverState *s),
|
|
|
|
Error **errp);
|
2011-08-15 20:17:41 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_new:
|
|
|
|
*
|
|
|
|
* Create a new character backend from a URI.
|
|
|
|
*
|
|
|
|
* @label the name of the backend
|
|
|
|
* @filename the URI
|
|
|
|
* @init not sure..
|
|
|
|
*
|
|
|
|
* Returns: a new character backend
|
|
|
|
*/
|
|
|
|
CharDriverState *qemu_chr_new(const char *label, const char *filename,
|
|
|
|
void (*init)(struct CharDriverState *s));
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_delete:
|
|
|
|
*
|
2015-06-22 19:20:18 +03:00
|
|
|
* Destroy a character backend and remove it from the list of
|
|
|
|
* identified character backends.
|
2011-08-15 20:17:41 +04:00
|
|
|
*/
|
|
|
|
void qemu_chr_delete(CharDriverState *chr);
|
|
|
|
|
2015-06-22 19:20:18 +03:00
|
|
|
/**
|
|
|
|
* @qemu_chr_free:
|
|
|
|
*
|
|
|
|
* Destroy a character backend.
|
|
|
|
*/
|
|
|
|
void qemu_chr_free(CharDriverState *chr);
|
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_set_echo:
|
|
|
|
*
|
|
|
|
* Ask the backend to override its normal echo setting. This only really
|
|
|
|
* applies to the stdio backend and is used by the QMP server such that you
|
|
|
|
* can see what you type if you try to type QMP commands.
|
|
|
|
*
|
|
|
|
* @echo true to enable echo, false to disable echo
|
|
|
|
*/
|
2011-08-15 20:17:35 +04:00
|
|
|
void qemu_chr_fe_set_echo(struct CharDriverState *chr, bool echo);
|
2011-08-15 20:17:41 +04:00
|
|
|
|
|
|
|
/**
|
2013-03-26 14:07:57 +04:00
|
|
|
* @qemu_chr_fe_set_open:
|
2011-08-15 20:17:41 +04:00
|
|
|
*
|
2013-03-26 14:07:57 +04:00
|
|
|
* Set character frontend open status. This is an indication that the
|
|
|
|
* front end is ready (or not) to begin doing I/O.
|
2011-08-15 20:17:41 +04:00
|
|
|
*/
|
2013-03-26 14:07:57 +04:00
|
|
|
void qemu_chr_fe_set_open(struct CharDriverState *chr, int fe_open);
|
2011-08-15 20:17:41 +04:00
|
|
|
|
2013-12-02 01:23:39 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_event:
|
|
|
|
*
|
|
|
|
* Send an event from the front end to the back end.
|
|
|
|
*
|
|
|
|
* @event the event to send
|
|
|
|
*/
|
|
|
|
void qemu_chr_fe_event(CharDriverState *s, int event);
|
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_printf:
|
|
|
|
*
|
|
|
|
* Write to a character backend using a printf style interface.
|
2014-06-18 10:43:58 +04:00
|
|
|
* This function is thread-safe.
|
2011-08-15 20:17:41 +04:00
|
|
|
*
|
|
|
|
* @fmt see #printf
|
|
|
|
*/
|
2011-08-15 20:17:29 +04:00
|
|
|
void qemu_chr_fe_printf(CharDriverState *s, const char *fmt, ...)
|
2010-09-23 23:28:05 +04:00
|
|
|
GCC_FMT_ATTR(2, 3);
|
2011-08-15 20:17:41 +04:00
|
|
|
|
2013-03-19 16:38:09 +04:00
|
|
|
int qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond,
|
|
|
|
GIOFunc func, void *user_data);
|
2013-03-05 21:51:23 +04:00
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_write:
|
|
|
|
*
|
2014-06-18 10:43:58 +04:00
|
|
|
* Write data to a character backend from the front end. This function
|
|
|
|
* will send data from the front end to the back end. This function
|
|
|
|
* is thread-safe.
|
2011-08-15 20:17:41 +04:00
|
|
|
*
|
|
|
|
* @buf the data
|
|
|
|
* @len the number of bytes to send
|
|
|
|
*
|
|
|
|
* Returns: the number of bytes consumed
|
|
|
|
*/
|
2011-08-15 20:17:28 +04:00
|
|
|
int qemu_chr_fe_write(CharDriverState *s, const uint8_t *buf, int len);
|
2011-08-15 20:17:41 +04:00
|
|
|
|
2013-03-26 19:04:17 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_write_all:
|
|
|
|
*
|
|
|
|
* Write data to a character backend from the front end. This function will
|
|
|
|
* send data from the front end to the back end. Unlike @qemu_chr_fe_write,
|
|
|
|
* this function will block if the back end cannot consume all of the data
|
2014-06-18 10:43:58 +04:00
|
|
|
* attempted to be written. This function is thread-safe.
|
2013-03-26 19:04:17 +04:00
|
|
|
*
|
|
|
|
* @buf the data
|
|
|
|
* @len the number of bytes to send
|
|
|
|
*
|
|
|
|
* Returns: the number of bytes consumed
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_write_all(CharDriverState *s, const uint8_t *buf, int len);
|
|
|
|
|
2014-05-27 16:03:48 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_read_all:
|
|
|
|
*
|
|
|
|
* Read data to a buffer from the back end.
|
|
|
|
*
|
|
|
|
* @buf the data buffer
|
|
|
|
* @len the number of bytes to read
|
|
|
|
*
|
|
|
|
* Returns: the number of bytes read
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_read_all(CharDriverState *s, uint8_t *buf, int len);
|
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_ioctl:
|
|
|
|
*
|
2014-06-18 10:43:58 +04:00
|
|
|
* Issue a device specific ioctl to a backend. This function is thread-safe.
|
2011-08-15 20:17:41 +04:00
|
|
|
*
|
|
|
|
* @cmd see CHR_IOCTL_*
|
|
|
|
* @arg the data associated with @cmd
|
|
|
|
*
|
|
|
|
* Returns: if @cmd is not supported by the backend, -ENOTSUP, otherwise the
|
|
|
|
* return value depends on the semantics of @cmd
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_ioctl(CharDriverState *s, int cmd, void *arg);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_get_msgfd:
|
|
|
|
*
|
|
|
|
* For backends capable of fd passing, return the latest file descriptor passed
|
|
|
|
* by a client.
|
|
|
|
*
|
|
|
|
* Returns: -1 if fd passing isn't supported or there is no pending file
|
|
|
|
* descriptor. If a file descriptor is returned, subsequent calls to
|
|
|
|
* this function will return -1 until a client sends a new file
|
|
|
|
* descriptor.
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_get_msgfd(CharDriverState *s);
|
|
|
|
|
2014-05-27 16:04:15 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_get_msgfds:
|
|
|
|
*
|
|
|
|
* For backends capable of fd passing, return the number of file received
|
|
|
|
* descriptors and fills the fds array up to num elements
|
|
|
|
*
|
|
|
|
* Returns: -1 if fd passing isn't supported or there are no pending file
|
|
|
|
* descriptors. If file descriptors are returned, subsequent calls to
|
|
|
|
* this function will return -1 until a client sends a new set of file
|
|
|
|
* descriptors.
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_get_msgfds(CharDriverState *s, int *fds, int num);
|
|
|
|
|
2014-05-27 16:04:02 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_set_msgfds:
|
|
|
|
*
|
|
|
|
* For backends capable of fd passing, set an array of fds to be passed with
|
|
|
|
* the next send operation.
|
|
|
|
* A subsequent call to this function before calling a write function will
|
|
|
|
* result in overwriting the fd array with the new value without being send.
|
|
|
|
* Upon writing the message the fd array is freed.
|
|
|
|
*
|
|
|
|
* Returns: -1 if fd passing isn't supported.
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_set_msgfds(CharDriverState *s, int *fds, int num);
|
|
|
|
|
2013-03-27 23:29:39 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_claim:
|
|
|
|
*
|
|
|
|
* Claim a backend before using it, should be called before calling
|
|
|
|
* qemu_chr_add_handlers().
|
|
|
|
*
|
|
|
|
* Returns: -1 if the backend is already in use by another frontend, 0 on
|
|
|
|
* success.
|
|
|
|
*/
|
|
|
|
int qemu_chr_fe_claim(CharDriverState *s);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_claim_no_fail:
|
|
|
|
*
|
|
|
|
* Like qemu_chr_fe_claim, but will exit qemu with an error when the
|
|
|
|
* backend is already in use.
|
|
|
|
*/
|
|
|
|
void qemu_chr_fe_claim_no_fail(CharDriverState *s);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_fe_claim:
|
|
|
|
*
|
|
|
|
* Release a backend for use by another frontend.
|
|
|
|
*
|
|
|
|
* Returns: -1 if the backend is already in use by another frontend, 0 on
|
|
|
|
* success.
|
|
|
|
*/
|
|
|
|
void qemu_chr_fe_release(CharDriverState *s);
|
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
/**
|
|
|
|
* @qemu_chr_be_can_write:
|
|
|
|
*
|
|
|
|
* Determine how much data the front end can currently accept. This function
|
|
|
|
* returns the number of bytes the front end can accept. If it returns 0, the
|
|
|
|
* front end cannot receive data at the moment. The function must be polled
|
|
|
|
* to determine when data can be received.
|
|
|
|
*
|
|
|
|
* Returns: the number of bytes the front end can receive via @qemu_chr_be_write
|
|
|
|
*/
|
|
|
|
int qemu_chr_be_can_write(CharDriverState *s);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_be_write:
|
|
|
|
*
|
|
|
|
* Write data from the back end to the front end. Before issuing this call,
|
|
|
|
* the caller should call @qemu_chr_be_can_write to determine how much data
|
|
|
|
* the front end can currently accept.
|
|
|
|
*
|
|
|
|
* @buf a buffer to receive data from the front end
|
|
|
|
* @len the number of bytes to receive from the front end
|
|
|
|
*/
|
|
|
|
void qemu_chr_be_write(CharDriverState *s, uint8_t *buf, int len);
|
|
|
|
|
2011-11-19 13:22:43 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @qemu_chr_be_event:
|
|
|
|
*
|
|
|
|
* Send an event from the back end to the front end.
|
|
|
|
*
|
|
|
|
* @event the event to send
|
|
|
|
*/
|
|
|
|
void qemu_chr_be_event(CharDriverState *s, int event);
|
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
void qemu_chr_add_handlers(CharDriverState *s,
|
2010-03-11 19:55:39 +03:00
|
|
|
IOCanReadHandler *fd_can_read,
|
2007-11-17 20:14:51 +03:00
|
|
|
IOReadHandler *fd_read,
|
|
|
|
IOEventHandler *fd_event,
|
|
|
|
void *opaque);
|
2011-08-15 20:17:41 +04:00
|
|
|
|
2013-03-26 14:07:54 +04:00
|
|
|
void qemu_chr_be_generic_open(CharDriverState *s);
|
2007-11-25 03:55:06 +03:00
|
|
|
void qemu_chr_accept_input(CharDriverState *s);
|
Introduce a 'client_add' monitor command accepting an open FD
Allow client connections for VNC and socket based character
devices to be passed in over the monitor using SCM_RIGHTS.
One intended usage scenario is to start QEMU with VNC on a
UNIX domain socket. An unprivileged user which cannot access
the UNIX domain socket, can then connect to QEMU's VNC server
by passing an open FD to libvirt, which passes it onto QEMU.
{ "execute": "get_fd", "arguments": { "fdname": "myclient" } }
{ "return": {} }
{ "execute": "add_client", "arguments": { "protocol": "vnc",
"fdname": "myclient",
"skipauth": true } }
{ "return": {} }
In this case 'protocol' can be 'vnc' or 'spice', or the name
of a character device (eg from -chardev id=XXXX)
The 'skipauth' parameter can be used to skip any configured
VNC authentication scheme, which is useful if the mgmt layer
talking to the monitor has already authenticated the client
in another way.
* console.h: Define 'vnc_display_add_client' method
* monitor.c: Implement 'client_add' command
* qemu-char.c, qemu-char.h: Add 'qemu_char_add_client' method
* qerror.c, qerror.h: Add QERR_ADD_CLIENT_FAILED
* qmp-commands.hx: Declare 'client_add' command
* ui/vnc.c: Implement 'vnc_display_add_client' method
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2011-06-23 16:31:42 +04:00
|
|
|
int qemu_chr_add_client(CharDriverState *s, int fd);
|
2009-09-10 12:58:52 +04:00
|
|
|
CharDriverState *qemu_chr_find(const char *name);
|
2014-05-28 02:39:30 +04:00
|
|
|
bool chr_is_ringbuf(const CharDriverState *chr);
|
2007-11-17 20:14:51 +03:00
|
|
|
|
2011-08-15 20:17:41 +04:00
|
|
|
QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename);
|
|
|
|
|
2014-09-02 14:24:17 +04:00
|
|
|
void register_char_driver(const char *name, ChardevBackendKind kind,
|
2015-09-29 15:55:59 +03:00
|
|
|
void (*parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp),
|
|
|
|
CharDriverState *(*create)(const char *id, ChardevBackend *backend,
|
|
|
|
ChardevReturn *ret, Error **errp));
|
2013-03-05 21:51:28 +04:00
|
|
|
|
2008-10-31 21:44:40 +03:00
|
|
|
extern int term_escape_char;
|
|
|
|
|
2011-12-23 01:29:25 +04:00
|
|
|
CharDriverState *qemu_char_get_next_serial(void);
|
|
|
|
|
2014-06-23 11:29:07 +04:00
|
|
|
/* console.c */
|
2015-09-29 16:49:06 +03:00
|
|
|
typedef CharDriverState *(VcHandler)(ChardevVC *vc, Error **errp);
|
2014-06-23 11:29:07 +04:00
|
|
|
void register_vc_handler(VcHandler *handler);
|
2015-09-29 16:49:06 +03:00
|
|
|
|
2007-11-17 20:14:51 +03:00
|
|
|
#endif
|