diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2009-04-09 09:54:47 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-04-09 09:54:47 +0300 |
commit | 77d8d1ca1a56b23b93f511efe8b0a7d1b0c6905d (patch) | |
tree | ee3543e2965c0aeca3cd3f0a2273603e717fb910 | |
parent | 59c772be51efc66f1f2ecb0114d51917515f210d (diff) | |
download | obexd-77d8d1ca1a56b23b93f511efe8b0a7d1b0c6905d.tar.gz |
Make sure the opened TTY is non-blocking
-rw-r--r-- | src/main.c | 29 |
1 files changed, 24 insertions, 5 deletions
@@ -72,7 +72,7 @@ int tty_init(int services, const gchar *root_path, { struct server *server; struct termios options; - int fd, ret; + int fd, err, arg; glong flags; tty_needs_reinit = TRUE; @@ -88,6 +88,18 @@ int tty_init(int services, const gchar *root_path, cfmakeraw(&options); tcsetattr(fd, TCSANOW, &options); + arg = fcntl(fd, F_GETFL); + if (arg < 0) { + err = -errno; + goto failed; + } + + arg |= O_NONBLOCK; + if (fcntl(fd, F_SETFL, arg) < 0) { + err = -errno; + goto failed; + } + server = g_new0(struct server, 1); server->services = services; server->folder = g_strdup(root_path); @@ -97,14 +109,21 @@ int tty_init(int services, const gchar *root_path, server->rx_mtu = TTY_RX_MTU; server->tx_mtu = TTY_TX_MTU; - ret = obex_session_start(fd, server); - if (ret < 0) { + err = obex_session_start(fd, server); + if (err < 0) { server_free(server); - close(fd); + goto failed; } else tty_needs_reinit = FALSE; - return ret; + debug("Successfully opened %s", devnode); + + return 0; + +failed: + error("tty_init(): %s (%d)", strerror(-err), -err); + close(fd); + return err; } void tty_closed(void) |