From: Christophe de Dinechin <dinechin@xxxxxxxxxx> This lets us get rid of C-style 'goto done' in do_capture. Signed-off-by: Christophe de Dinechin <dinechin@xxxxxxxxxx> --- src/spice-streaming-agent.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp index 973192b..d46e308 100644 --- a/src/spice-streaming-agent.cpp +++ b/src/spice-streaming-agent.cpp @@ -51,6 +51,23 @@ struct SpiceStreamDataMessage StreamMsgData msg; }; +struct Stream +{ + Stream(const char *name, int &fd): fd(fd) + { + fd = open(name, O_RDWR); + if (fd < 0) + throw std::runtime_error("failed to open streaming device"); + } + ~Stream() + { + if (fd >= 0) + close(fd); + fd = -1; + } + int &fd; +}; + static int streaming_requested; static bool quit; static int streamfd = -1; @@ -349,17 +366,14 @@ do_capture(const char *streamport, FILE *f_log) if (!capture) throw std::runtime_error("cannot find a suitable capture system"); - streamfd = open(streamport, O_RDWR); - if (streamfd < 0) - // TODO was syslog(LOG_ERR, "Failed to open %s: %s\n", streamport, strerror(errno)); - throw std::runtime_error("failed to open streaming device"); + Stream stream(streamport, streamfd); unsigned int frame_count = 0; while (! quit) { while (!quit && !streaming_requested) { if (read_command(1) < 0) { syslog(LOG_ERR, "FAILED to read command\n"); - goto done; + return; } } @@ -410,19 +424,13 @@ do_capture(const char *streamport, FILE *f_log) //usleep(1); if (read_command(0) < 0) { syslog(LOG_ERR, "FAILED to read command\n"); - goto done; + return; } if (!streaming_requested) { capture->Reset(); } } } - -done: - if (streamfd >= 0) { - close(streamfd); - streamfd = -1; - } } #define arg_error(...) syslog(LOG_ERR, ## __VA_ARGS__); -- 2.13.5 (Apple Git-94) _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel