Add support for opening TTYs directly

This commit is contained in:
Marcel Holtmann 2009-06-30 12:48:42 -07:00 committed by Marcel Holtmann
parent 6a2dd31a89
commit 08b81f37a1
2 changed files with 42 additions and 0 deletions

View File

@ -24,8 +24,11 @@
#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)

View 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);