Update the interface to not return the size written, as it is not needed anymore. Signed-off-by: Lukáš Hrázký <lhrazky@xxxxxxxxxx> --- src/error.cpp | 3 ++- src/error.hpp | 14 +++++++++++++ src/spice-streaming-agent.cpp | 48 +++++++++++++++---------------------------- src/stream-port.cpp | 7 ++----- src/stream-port.hpp | 2 +- 5 files changed, 35 insertions(+), 39 deletions(-) diff --git a/src/error.cpp b/src/error.cpp index 1b76ea4..4ef275c 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -7,7 +7,6 @@ #include "error.hpp" #include <string.h> -#include <syslog.h> namespace spice { @@ -26,4 +25,6 @@ IOError::IOError(const std::string &msg, int errno_) : ReadError::ReadError(const std::string &msg, int errno_) : IOError(msg, errno_) {} +WriteError::WriteError(const std::string &msg, int errno_) : IOError(msg, errno_) {} + }} // namespace spice::streaming_agent diff --git a/src/error.hpp b/src/error.hpp index de1cb83..d69942c 100644 --- a/src/error.hpp +++ b/src/error.hpp @@ -9,6 +9,7 @@ #include <exception> #include <string> +#include <syslog.h> namespace spice { @@ -39,6 +40,19 @@ public: ReadError(const std::string &msg, int errno_); }; +class WriteError : public IOError +{ +public: + WriteError(const std::string &msg, int errno_); +}; + +template<class T> +const T &syslog(const T &e) noexcept +{ + ::syslog(LOG_ERR, "%s\n", e.what()); + return e; +} + }} // namespace spice::streaming_agent #endif // SPICE_STREAMING_AGENT_ERROR_HPP diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp index 2c0340d..26258d0 100644 --- a/src/spice-streaming-agent.cpp +++ b/src/spice-streaming-agent.cpp @@ -8,6 +8,7 @@ #include "hexdump.h" #include "mjpeg-fallback.hpp" #include "stream-port.hpp" +#include "error.hpp" #include <spice/stream-device.h> #include <spice/enums.h> @@ -113,9 +114,7 @@ static void handle_stream_capabilities(uint32_t len) STREAM_TYPE_CAPABILITIES, 0 }; - if (write_all(streamfd, &hdr, sizeof(hdr)) != sizeof(hdr)) { - throw std::runtime_error("error writing capabilities"); - } + write_all(streamfd, &hdr, sizeof(hdr)); } static void handle_stream_error(size_t len) @@ -186,7 +185,7 @@ static int read_command(bool blocking) return 1; } -static int spice_stream_send_format(unsigned w, unsigned h, unsigned c) +static void spice_stream_send_format(unsigned w, unsigned h, unsigned c) { SpiceStreamFormatMessage msg; @@ -201,40 +200,23 @@ static int spice_stream_send_format(unsigned w, unsigned h, unsigned c) msg.msg.codec = c; syslog(LOG_DEBUG, "writing format\n"); std::lock_guard<std::mutex> stream_guard(stream_mtx); - if (write_all(streamfd, &msg, msgsize) != msgsize) { - return EXIT_FAILURE; - } - return EXIT_SUCCESS; + write_all(streamfd, &msg, msgsize); } -static int spice_stream_send_frame(const void *buf, const unsigned size) +static void spice_stream_send_frame(const void *buf, const unsigned size) { SpiceStreamDataMessage msg; const size_t msgsize = sizeof(msg); - ssize_t n; memset(&msg, 0, msgsize); msg.hdr.protocol_version = STREAM_DEVICE_PROTOCOL; msg.hdr.type = STREAM_TYPE_DATA; msg.hdr.size = size; /* includes only the body? */ std::lock_guard<std::mutex> stream_guard(stream_mtx); - n = write_all(streamfd, &msg, msgsize); - syslog(LOG_DEBUG, - "wrote %ld bytes of header of data msg with frame of size %u bytes\n", - n, msg.hdr.size); - if (n != msgsize) { - syslog(LOG_WARNING, "write_all header: wrote %ld expected %lu\n", - n, msgsize); - return EXIT_FAILURE; - } - n = write_all(streamfd, buf, size); - syslog(LOG_DEBUG, "wrote data msg body of size %ld\n", n); - if (n != size) { - syslog(LOG_WARNING, "write_all header: wrote %ld expected %u\n", - n, size); - return EXIT_FAILURE; - } - return EXIT_SUCCESS; + write_all(streamfd, &msg, msgsize); + write_all(streamfd, buf, size); + + syslog(LOG_DEBUG, "Sent a frame of size %u\n", size); } /* returns current time in micro-seconds */ @@ -403,9 +385,7 @@ do_capture(const char *streamport, FILE *f_log) syslog(LOG_DEBUG, "wXh %uX%u codec=%u\n", width, height, codec); - if (spice_stream_send_format(width, height, codec) == EXIT_FAILURE) { - throw std::runtime_error("FAILED to send format message"); - } + spice_stream_send_format(width, height, codec); } if (f_log) { if (log_binary) { @@ -416,10 +396,14 @@ do_capture(const char *streamport, FILE *f_log) hexdump(frame.buffer, frame.buffer_size, f_log); } } - if (spice_stream_send_frame(frame.buffer, frame.buffer_size) == EXIT_FAILURE) { - syslog(LOG_ERR, "FAILED to send a frame\n"); + + try { + spice_stream_send_frame(frame.buffer, frame.buffer_size); + } catch (const WriteError& e) { + syslog(e); break; } + //usleep(1); if (read_command(false) < 0) { syslog(LOG_ERR, "FAILED to read command\n"); diff --git a/src/stream-port.cpp b/src/stream-port.cpp index f256698..526c564 100644 --- a/src/stream-port.cpp +++ b/src/stream-port.cpp @@ -34,7 +34,7 @@ void read_all(int fd, void *msg, size_t len) } } -size_t write_all(int fd, const void *buf, const size_t len) +void write_all(int fd, const void *buf, const size_t len) { size_t written = 0; while (written < len) { @@ -43,13 +43,10 @@ size_t write_all(int fd, const void *buf, const size_t len) if (errno == EINTR) { continue; } - syslog(LOG_ERR, "write failed - %m"); - return l; + throw WriteError("Writing message to device failed", errno); } 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 index a296a5c..7780a37 100644 --- a/src/stream-port.hpp +++ b/src/stream-port.hpp @@ -14,7 +14,7 @@ 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); +void write_all(int fd, const void *buf, const size_t len); }} // namespace spice::streaming_agent -- 2.16.2 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel