Add support for opening TTYs directly
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 30 Jun 2009 19:48:42 +0000 (12:48 -0700)
committerMarcel Holtmann <marcel.holtmann@intel.com>
Tue, 30 Jun 2009 19:53:26 +0000 (12:53 -0700)
gatchat/gatchat.c
gatchat/gatchat.h

index b400157..dc0d7c9 100644 (file)
 #endif
 
 #include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
 #include <string.h>
 #include <assert.h>
+#include <termios.h>
 
 #include <glib.h>
 
@@ -935,6 +938,44 @@ error:
        return NULL;
 }
 
+static int open_device(const char *device)
+{
+       struct termios ti;
+       int fd;
+
+       fd = open(device, O_RDWR | O_NOCTTY);
+       if (fd < 0)
+               return -1;
+
+       tcflush(fd, TCIOFLUSH);
+
+       /* Switch TTY to raw mode */
+       memset(&ti, 0, sizeof(ti));
+       cfmakeraw(&ti);
+
+       tcsetattr(fd, TCSANOW, &ti);
+
+       return fd;
+}
+
+GAtChat *g_at_chat_new_from_tty(const char *device, int flags)
+{
+       GIOChannel *channel;
+       int fd;
+
+       fd = open_device(device);
+       if (fd < 0)
+               return NULL;
+
+       channel = g_io_channel_unix_new(fd);
+       if (!channel) {
+               close(fd);
+               return NULL;
+       }
+
+       return g_at_chat_new(channel, flags);
+}
+
 GAtChat *g_at_chat_ref(GAtChat *chat)
 {
        if (chat == NULL)
index 52c6b36..3c8a889 100644 (file)
@@ -44,6 +44,7 @@ enum _GAtChatFlags {
 typedef enum _GAtChatFlags GAtChatFlags;
 
 GAtChat *g_at_chat_new(GIOChannel *channel, int flags);
+GAtChat *g_at_chat_new_from_tty(const char *device, int flags);
 
 GAtChat *g_at_chat_ref(GAtChat *chat);
 void g_at_chat_unref(GAtChat *chat);