From: Christophe de Dinechin <dinechin@xxxxxxxxxx> Signed-off-by: Christophe de Dinechin <dinechin@xxxxxxxxxx> --- src/spice-streaming-agent.cpp | 99 ++++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 39 deletions(-) diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp index f4df6be..b0c09d8 100644 --- a/src/spice-streaming-agent.cpp +++ b/src/spice-streaming-agent.cpp @@ -48,6 +48,17 @@ namespace spice namespace streaming_agent { +/* returns current time in micro-seconds */ +static uint64_t get_time(void) +{ + struct timeval now; + + gettimeofday(&now, NULL); + + return (uint64_t)now.tv_sec * 1000000 + (uint64_t)now.tv_usec; + +} + class Stream { public: @@ -145,6 +156,7 @@ struct FrameMessage : Message<StreamMsgData, FrameMessage> } }; + struct X11CursorMessage : Message<StreamMsgCursorSet, X11CursorMessage> { X11CursorMessage(XFixesCursorImage *cursor) @@ -192,6 +204,46 @@ private: }; +class FrameLog +{ +public: + FrameLog(const char *filename, bool binary = false); + ~FrameLog(); + + operator bool() { return log != NULL; } + void dump(const void *buffer, size_t length); + +private: + FILE *log; + bool binary; +}; + + +FrameLog::FrameLog(const char *filename, bool binary) + : log(filename ? fopen(filename, "wb") : NULL), binary(binary) +{ + if (filename && !log) { + // We do not abort the program in that case, it's only a warning + syslog(LOG_WARNING, "Failed to open hexdump log file '%s': %m\n", filename); + } +} + +FrameLog::~FrameLog() +{ + if (log) + fclose(log); +} + +void FrameLog::dump(const void *buffer, size_t length) +{ + if (binary) { + fwrite(buffer, length, 1, log); + } else { + fprintf(log, "%" PRIu64 ": Frame of %zu bytes:\n", get_time(), length); + hexdump(buffer, length, log); + } +} + class X11CursorThread { public: @@ -260,7 +312,6 @@ void X11CursorThread::cursor_changes() static bool streaming_requested = false; static bool quit_requested = false; -static bool log_binary = false; static std::set<SpiceVideoCodecType> client_codecs; int Stream::have_something_to_read(int timeout) @@ -359,17 +410,6 @@ size_t Stream::write_all(const char *what, const void *buf, const size_t len) return written; } -/* returns current time in micro-seconds */ -static uint64_t get_time(void) -{ - struct timeval now; - - gettimeofday(&now, NULL); - - return (uint64_t)now.tv_sec * 1000000 + (uint64_t)now.tv_usec; - -} - static void handle_interrupt(int intr) { syslog(LOG_INFO, "Got signal %d, exiting", intr); @@ -392,7 +432,7 @@ static void usage(const char *progname) printf("options are:\n"); printf("\t-p portname -- virtio-serial port to use\n"); printf("\t-l file -- log frames to file\n"); - printf("\t--log-binary -- log binary frames (following -l)\n"); + printf("\t-b or --log-binary -- log binary frames (following -l)\n"); printf("\t-d -- enable debug logs\n"); printf("\t-c variable=value -- change settings\n"); printf("\t\tframerate = 1-100 (check 10,20,30,40,50,60)\n"); @@ -403,7 +443,7 @@ static void usage(const char *progname) } static void -do_capture(Stream &stream, const char *streamport, FILE *f_log) +do_capture(Stream &stream, const char *streamport, FrameLog &frame_log) { unsigned int frame_count = 0; while (!quit_requested) { @@ -455,14 +495,8 @@ do_capture(Stream &stream, const char *streamport, FILE *f_log) if (!stream.send<FormatMessage>(width, height, codec)) throw std::runtime_error("FAILED to send format message"); } - if (f_log) { - if (log_binary) { - fwrite(frame.buffer, frame.buffer_size, 1, f_log); - } else { - fprintf(f_log, "%" PRIu64 ": Frame of %zu bytes:\n", - get_time(), frame.buffer_size); - hexdump(frame.buffer, frame.buffer_size, f_log); - } + if (frame_log) { + frame_log.dump(frame.buffer, frame.buffer_size); } if (!stream.send<FrameMessage>(frame.buffer, frame.buffer_size)) { syslog(LOG_ERR, "FAILED to send a frame\n"); @@ -484,6 +518,7 @@ int main(int argc, char* argv[]) const char *streamport = "/dev/virtio-ports/com.redhat.stream.0"; char opt; const char *log_filename = NULL; + bool log_binary = false; int logmask = LOG_UPTO(LOG_WARNING); struct option long_options[] = { { "log-binary", no_argument, NULL, 'b'}, @@ -496,7 +531,7 @@ int main(int argc, char* argv[]) setlogmask(logmask); - while ((opt = getopt_long(argc, argv, "hp:c:l:d", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "bhp:c:l:d", long_options, NULL)) != -1) { switch (opt) { case 0: /* Handle long options if needed */ @@ -534,31 +569,17 @@ int main(int argc, char* argv[]) register_interrupts(); - FILE *f_log = NULL; - if (log_filename) { - f_log = fopen(log_filename, "wb"); - if (!f_log) { - syslog(LOG_ERR, "Failed to open log file '%s': %s\n", - log_filename, strerror(errno)); - return EXIT_FAILURE; - } - } - int ret = EXIT_SUCCESS; try { Stream streamfd(streamport); X11CursorThread cursor_thread(streamfd); - do_capture(streamfd, streamport, f_log); + FrameLog frame_log(log_filename, log_binary); + do_capture(streamfd, streamport, frame_log); } catch (std::runtime_error &err) { syslog(LOG_ERR, "%s\n", err.what()); ret = EXIT_FAILURE; } - - if (f_log) { - fclose(f_log); - f_log = NULL; - } closelog(); return ret; } -- 2.13.5 (Apple Git-94) _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel