]> sigrok.org Git - sigrok-cli.git/blobdiff - anykey.c
valgrind: Clear more unfreed memory issues
[sigrok-cli.git] / anykey.c
index 7c801f1ce8b8bb6dbb3983346ff264330c8e1ab3..b1ac9ef430a80df681ee1442e99d8bbc6712fe11 100644 (file)
--- a/anykey.c
+++ b/anykey.c
@@ -23,8 +23,8 @@
 #include <windows.h>
 #else
 #include <termios.h>
-#endif
 #include <unistd.h>
+#endif
 #include <string.h>
 #include <glib.h>
 #include "sigrok-cli.h"
@@ -35,32 +35,38 @@ static DWORD stdin_mode;
 #else
 static struct termios term_orig;
 #endif
+static unsigned int watch_id = 0;
 
-static int received_anykey(int fd, int revents, void *cb_data)
+static gboolean received_anykey(GIOChannel *source,
+               GIOCondition condition, void *data)
 {
        struct sr_session *session;
 
-       (void)fd;
-       (void)revents;
+       (void)source;
+       (void)condition;
+       session = data;
 
-       session = cb_data;
-       sr_session_source_remove(session, STDIN_FILENO);
+       watch_id = 0;
        sr_session_stop(session);
 
-       return TRUE;
+       return G_SOURCE_REMOVE;
 }
 
-/* Turn off buffering on stdin. */
+/* Turn off buffering on stdin and watch for input.
+ */
 void add_anykey(struct sr_session *session)
 {
+       GIOChannel *channel;
+
 #ifdef _WIN32
        stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
 
        if (!GetConsoleMode(stdin_handle, &stdin_mode)) {
                /* TODO: Error handling. */
        }
-
        SetConsoleMode(stdin_handle, 0);
+
+       channel = g_io_channel_win32_new_fd(0);
 #else
        struct termios term;
 
@@ -68,17 +74,26 @@ void add_anykey(struct sr_session *session)
        memcpy(&term_orig, &term, sizeof(struct termios));
        term.c_lflag &= ~(ECHO | ICANON | ISIG);
        tcsetattr(STDIN_FILENO, TCSADRAIN, &term);
+
+       channel = g_io_channel_unix_new(STDIN_FILENO);
 #endif
+       g_io_channel_set_encoding(channel, NULL, NULL);
+       g_io_channel_set_buffered(channel, FALSE);
 
-       sr_session_source_add(session, STDIN_FILENO, G_IO_IN, -1,
-                       received_anykey, session);
+       watch_id = g_io_add_watch(channel, G_IO_IN, &received_anykey, session);
+       g_io_channel_unref(channel);
 
        g_message("Press any key to stop acquisition.");
 }
 
-/* Restore stdin attributes. */
+/* Remove the event watch and restore stdin attributes.
+ */
 void clear_anykey(void)
 {
+       if (watch_id != 0) {
+               g_source_remove(watch_id);
+               watch_id = 0;
+       }
 #ifdef _WIN32
        SetConsoleMode(stdin_handle, stdin_mode);
 #else