From: Christophe de Dinechin <dinechin@xxxxxxxxxx> C++-style aggregate initialization with explicit field names is more readable and requires less repeated typing. Like zero initialization, aggregate initialization preserves C++ type safety. However, unlike zero initialization, it does not guarantee that padding is properly initialized. This is not a real problem in our code where all padding is explicit, but it it worth keeping in mind. Also note that GCC is a bit picky and will generate strange "unsupported" or "not implemented" errors if the fields are not all initialized in exact declaration order. It is useful, however, to get an error if a field is added and not initialized. Writing this patch also highlighted an inconsistency between the type of a 'codec' local variable and the type used in the actual data type. Changed the type of the variable to uint8_t to match that in the structure declaration. Signed-off-by: Christophe de Dinechin <dinechin@xxxxxxxxxx> --- src/spice-streaming-agent.cpp | 47 ++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp index acae939..7b56458 100644 --- a/src/spice-streaming-agent.cpp +++ b/src/spice-streaming-agent.cpp @@ -221,19 +221,24 @@ write_all(int fd, const void *buf, const size_t len) return written; } -static int spice_stream_send_format(int streamfd, unsigned w, unsigned h, unsigned c) +static int spice_stream_send_format(int streamfd, unsigned w, unsigned h, uint8_t c) { - - SpiceStreamFormatMessage msg; - const size_t msgsize = sizeof(msg); - const size_t hdrsize = sizeof(msg.hdr); - memset(&msg, 0, msgsize); - msg.hdr.protocol_version = STREAM_DEVICE_PROTOCOL; - msg.hdr.type = STREAM_TYPE_FORMAT; - msg.hdr.size = msgsize - hdrsize; /* includes only the body? */ - msg.msg.width = w; - msg.msg.height = h; - msg.msg.codec = c; + const size_t msgsize = sizeof(SpiceStreamFormatMessage); + const size_t hdrsize = sizeof(StreamDevHeader); + SpiceStreamFormatMessage msg = { + .hdr = { + .protocol_version = STREAM_DEVICE_PROTOCOL, + .padding = 0, // Workaround GCC "not implemented" bug + .type = STREAM_TYPE_FORMAT, + .size = msgsize - hdrsize + }, + .msg = { + .width = w, + .height = h, + .codec = c, + .padding1 = { } + } + }; syslog(LOG_DEBUG, "writing format\n"); std::lock_guard<std::mutex> stream_guard(stream_mtx); if (write_all(streamfd, &msg, msgsize) != msgsize) { @@ -244,14 +249,18 @@ static int spice_stream_send_format(int streamfd, unsigned w, unsigned h, unsign static int spice_stream_send_frame(int streamfd, const void *buf, const unsigned size) { - SpiceStreamDataMessage msg; - const size_t msgsize = sizeof(msg); ssize_t n; + const size_t msgsize = sizeof(SpiceStreamFormatMessage); + SpiceStreamDataMessage msg = { + .hdr = { + .protocol_version = STREAM_DEVICE_PROTOCOL, + .padding = 0, // Workaround GCC "not implemented" bug + .type = STREAM_TYPE_DATA, + .size = size /* includes only the body? */ + }, + .msg = {} + }; - 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, @@ -424,7 +433,7 @@ do_capture(int streamfd, const char *streamport, FILE *f_log) if (frame.stream_start) { unsigned width, height; - unsigned char codec; + uint8_t codec; width = frame.size.width; height = frame.size.height; -- 2.13.5 (Apple Git-94) _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel