[Spice-devel] [PATCH spice-streaming-agent 2/9] Move out {read, write}_all() to a separate module
Frediano Ziglio
fziglio at redhat.com
Tue May 15 20:31:32 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
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list