From: Victor Toso <me@xxxxxxxxxxxxxx> This patch export two existing functions `udscs_do_read()` and `udscs_do_write()` and also creates a new one `udscs_client_get_fd()`. The intention of this functions is to allow vdagent to check if connection's socket is ready to read or write. This will be done together with GMainLoop integration in a followup patch. Signed-off-by: Victor Toso <victortoso@xxxxxxxxxx> --- src/udscs.c | 17 +++++++++-------- src/udscs.h | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/udscs.c b/src/udscs.c index f67d0a0..2761cbb 100644 --- a/src/udscs.c +++ b/src/udscs.c @@ -31,6 +31,7 @@ #include <errno.h> #include <sys/socket.h> #include <sys/un.h> +#include <glib.h> #include "udscs.h" struct udscs_buf { @@ -246,8 +247,7 @@ static void udscs_read_complete(struct udscs_connection **connp) conn->header_read = 0; } -/* A helper for udscs_client_handle_fds() */ -static void udscs_do_read(struct udscs_connection **connp) +void udscs_do_read(struct udscs_connection **connp) { ssize_t n; size_t to_read; @@ -298,19 +298,15 @@ static void udscs_do_read(struct udscs_connection **connp) } /* A helper for udscs_client_handle_fds() */ -static void udscs_do_write(struct udscs_connection **connp) +void udscs_do_write(struct udscs_connection **connp) { ssize_t n; size_t to_write; struct udscs_connection *conn = *connp; struct udscs_buf* wbuf = conn->write_buf; - if (!wbuf) { - syslog(LOG_ERR, - "%p do_write called on a connection without a write buf ?!", - conn); + if (!wbuf) return; - } to_write = wbuf->size - wbuf->pos; n = write(conn->fd, wbuf->buf + wbuf->pos, to_write); @@ -357,6 +353,11 @@ int udscs_client_fill_fds(struct udscs_connection *conn, fd_set *readfds, return conn->fd + 1; } +int udscs_client_get_fd(struct udscs_connection *conn) +{ + g_return_val_if_fail(conn != NULL, -1); + return conn->fd; +} #ifndef UDSCS_NO_SERVER diff --git a/src/udscs.h b/src/udscs.h index 04377ba..08e71c8 100644 --- a/src/udscs.h +++ b/src/udscs.h @@ -109,6 +109,23 @@ void udscs_set_user_data(struct udscs_connection *conn, void *data); */ void *udscs_get_user_data(struct udscs_connection *conn); +/* Get fd from connection or return -1 if NULL */ +int udscs_client_get_fd(struct udscs_connection *conn); + +/* Performs a read in socket's connection. Note that fd should be ready for read + * otherwise it will destroy the connection. Use udscs_client_fill_fds(), + * select() and udscs_client_handle_fds() to delegate those checks to udscs. + */ +void udscs_do_read(struct udscs_connection **connp); + +/* Performs a write in socket's connection. Note that fd should be ready for + * write otherwise it will destroy the connection. Use udscs_client_fill_fds(), + * select() and udscs_client_handle_fds() to delegate those checks to udscs. + * If no buffer is ready to be written from udscs side, this function simply + * returns. + */ +void udscs_do_write(struct udscs_connection **connp); + #ifndef UDSCS_NO_SERVER -- 2.13.5 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel