[Spice-devel] [PATCH spice-streaming-agent v2 2/9] Move out {read, write}_all() to a separate module
Lukáš Hrázký
lhrazky at redhat.com
Wed May 16 16:26:00 UTC 2018
This starts at the bottom and prepares for gradually moving more stuff
out of the main file.
Signed-off-by: Lukáš Hrázký <lhrazky at redhat.com>
---
src/Makefile.am | 2 ++
src/spice-streaming-agent.cpp | 48 ++++---------------------------------
src/stream-port.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++
src/stream-port.hpp | 21 +++++++++++++++++
4 files changed, 83 insertions(+), 43 deletions(-)
create mode 100644 src/stream-port.cpp
create mode 100644 src/stream-port.hpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 606f51a..604c1e5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -56,4 +56,6 @@ spice_streaming_agent_SOURCES = \
mjpeg-fallback.hpp \
jpeg.cpp \
jpeg.hpp \
+ stream-port.cpp \
+ stream-port.hpp \
$(NULL)
diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 5dd41a9..7b166d3 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -7,6 +7,7 @@
#include "concrete-agent.hpp"
#include "hexdump.h"
#include "mjpeg-fallback.hpp"
+#include "stream-port.hpp"
#include <spice/stream-device.h>
#include <spice/enums.h>
@@ -40,8 +41,6 @@
using namespace spice::streaming_agent;
-static size_t write_all(int fd, const void *buf, const size_t len);
-
static ConcreteAgent agent;
struct SpiceStreamFormatMessage
@@ -79,24 +78,6 @@ static int have_something_to_read(int timeout)
return 0;
}
-static void read_all(void *msg, size_t len)
-{
- while (len > 0) {
- ssize_t n = read(streamfd, msg, len);
-
- if (n < 0) {
- if (errno == EINTR) {
- continue;
- }
- throw std::runtime_error("Reading message from device failed: " +
- std::string(strerror(errno)));
- }
-
- len -= n;
- msg = (uint8_t *) msg + n;
- }
-}
-
static void handle_stream_start_stop(uint32_t len)
{
uint8_t msg[256];
@@ -106,7 +87,7 @@ static void handle_stream_start_stop(uint32_t len)
"(longer than " + std::to_string(sizeof(msg)) + ")");
}
- read_all(msg, len);
+ read_all(streamfd, msg, len);
streaming_requested = (msg[0] != 0); /* num_codecs */
syslog(LOG_INFO, "GOT START_STOP message -- request to %s streaming\n",
streaming_requested ? "START" : "STOP");
@@ -124,7 +105,7 @@ static void handle_stream_capabilities(uint32_t len)
throw std::runtime_error("capability message too long");
}
- read_all(caps, len);
+ read_all(streamfd, caps, len);
// we currently do not support extensions so just reply so
StreamDevHeader hdr = {
STREAM_DEVICE_PROTOCOL,
@@ -151,7 +132,7 @@ static void handle_stream_error(size_t len)
size_t len_to_read = std::min(len, sizeof(msg) - 1);
- read_all(&msg, len_to_read);
+ read_all(streamfd, &msg, len_to_read);
msg.msg[len_to_read - sizeof(StreamMsgNotifyError)] = '\0';
syslog(LOG_ERR, "Received NotifyError message from the server: %d - %s\n",
@@ -169,7 +150,7 @@ static void read_command_from_device(void)
std::lock_guard<std::mutex> stream_guard(stream_mtx);
- read_all(&hdr, sizeof(hdr));
+ read_all(streamfd, &hdr, sizeof(hdr));
if (hdr.protocol_version != STREAM_DEVICE_PROTOCOL) {
throw std::runtime_error("BAD VERSION " + std::to_string(hdr.protocol_version) +
@@ -205,25 +186,6 @@ static int read_command(bool blocking)
return 1;
}
-static size_t
-write_all(int fd, const void *buf, const size_t len)
-{
- size_t written = 0;
- while (written < len) {
- int l = write(fd, (const char *) buf + written, len - written);
- if (l < 0) {
- if (errno == EINTR) {
- continue;
- }
- syslog(LOG_ERR, "write failed - %m");
- return l;
- }
- written += l;
- }
- syslog(LOG_DEBUG, "write_all -- %u bytes written\n", (unsigned)written);
- return written;
-}
-
static int spice_stream_send_format(unsigned w, unsigned h, unsigned c)
{
diff --git a/src/stream-port.cpp b/src/stream-port.cpp
new file mode 100644
index 0000000..3699d92
--- /dev/null
+++ b/src/stream-port.cpp
@@ -0,0 +1,55 @@
+/* A module for low-level communication over the streaming virtio port.
+ *
+ * \copyright
+ * Copyright 2018 Red Hat Inc. All rights reserved.
+ */
+
+#include "stream-port.hpp"
+
+#include <errno.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <stdexcept>
+
+
+namespace spice {
+namespace streaming_agent {
+
+void read_all(int fd, void *msg, size_t len)
+{
+ while (len > 0) {
+ ssize_t n = read(fd, msg, len);
+
+ if (n < 0) {
+ if (errno == EINTR) {
+ continue;
+ }
+ throw std::runtime_error("Reading message from device failed: " +
+ std::string(strerror(errno)));
+ }
+
+ len -= n;
+ msg = (uint8_t *) msg + n;
+ }
+}
+
+size_t write_all(int fd, const void *buf, const size_t len)
+{
+ size_t written = 0;
+ while (written < len) {
+ int l = write(fd, (const char *) buf + written, len - written);
+ if (l < 0) {
+ if (errno == EINTR) {
+ continue;
+ }
+ syslog(LOG_ERR, "write failed - %m");
+ return l;
+ }
+ written += l;
+ }
+ syslog(LOG_DEBUG, "write_all -- %u bytes written\n", (unsigned)written);
+ return written;
+}
+
+}} // namespace spice::streaming_agent
diff --git a/src/stream-port.hpp b/src/stream-port.hpp
new file mode 100644
index 0000000..a296a5c
--- /dev/null
+++ b/src/stream-port.hpp
@@ -0,0 +1,21 @@
+/* A module for low-level communication over the streaming virtio port.
+ *
+ * \copyright
+ * Copyright 2018 Red Hat Inc. All rights reserved.
+ */
+
+#ifndef SPICE_STREAMING_AGENT_STREAM_PORT_HPP
+#define SPICE_STREAMING_AGENT_STREAM_PORT_HPP
+
+#include <cstddef>
+
+
+namespace spice {
+namespace streaming_agent {
+
+void read_all(int fd, void *msg, size_t len);
+size_t write_all(int fd, const void *buf, const size_t len);
+
+}} // namespace spice::streaming_agent
+
+#endif // SPICE_STREAMING_AGENT_STREAM_PORT_HPP
--
2.16.2
More information about the Spice-devel
mailing list