[Spice-devel] [PATCH vdagent 09/11] udscs: allow fd control outside udscs
Jakub Janků
janku.jakub.jj at gmail.com
Tue Sep 26 20:59:45 UTC 2017
From: Victor Toso <me at victortoso.com>
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 at redhat.com>
---
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
More information about the Spice-devel
mailing list