[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 07/15] libxl_qmp: Handle write to QMP socket
The libxl__ev_qmp_* will now send the command to QEMU when the socket is ready for writes. Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- Notes: v5: rename buf_fd to send_fd tools/libxl/libxl_qmp.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index b5cc0af513..351fb1a292 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -1326,6 +1326,8 @@ static int qmp_ev_prepare_cmd(libxl__gc *gc, ev->tx_buf = buf; ev->tx_buf_len = len; + libxl__ev_fd_modify(gc, &ev->qmp_efd, ev->qmp_efd.events | POLLOUT); + return 0; } @@ -1429,6 +1431,43 @@ static int qmp_ev_callback_readable(libxl__egc *egc, libxl__ev_qmp *ev, int fd) return 0; } +static int qmp_ev_callback_writable(libxl__gc *gc, libxl__ev_qmp *ev, int fd) +{ + int rc; + char *buf; + size_t len; + int send_fd = -1; + + /* No need to call qmp_ev_callback_writable again, everything that needs to + * be send for now will be in this call. */ + libxl__ev_fd_modify(gc, &ev->qmp_efd, ev->qmp_efd.events & ~POLLOUT); + + if (ev->qmp_state == qmp_state_connected) { + if (!ev->tx_buf) + return 0; + + buf = ev->tx_buf; + len = ev->tx_buf_len; + send_fd = libxl__carefd_fd(ev->cfd); + + ev->tx_buf = NULL; + } else { + return 0; + } + + LOG_QMP("sending: '%.*s'", (int)len, buf); + + if (send_fd >= 0) { + rc = libxl__sendmsg_fds(gc, fd, buf, len, 1, &send_fd, "QMP socket"); + } else { + rc = libxl_write_exactly(CTX, fd, buf, len, + "QMP command", "QMP socket"); + } + + free(buf); + return rc; +} + static void qmp_ev_callback_error(libxl__egc *egc, libxl__ev_qmp *ev) { EGC_GC; @@ -1464,6 +1503,11 @@ static void qmp_ev_fd_callback(libxl__egc *egc, libxl__ev_fd *ev_fd, goto out; } + if (revents & POLLOUT) { + rc = qmp_ev_callback_writable(gc, ev, fd); + if (rc) + goto out; + } if (revents & POLLIN) { rc = qmp_ev_callback_readable(egc, ev, fd); if (rc) -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |