From 1db37820aaa0e83cfc7f26270f5bb3a6d9a27189 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 23 Dec 2016 22:49:39 +0100 Subject: serial: Open devie in non-blocking mode and then switch to blocking There are some serial ports that apparently block during the open in some circumstances. We don't want that. We want to either open it immediately, or fail fast. Change-Id: I626b138574bc50f4f4b09c4d609f3623ff512dff --- src/serial.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/serial.c b/src/serial.c index 66ee7564..44032263 100644 --- a/src/serial.c +++ b/src/serial.c @@ -59,16 +59,30 @@ int osmo_serial_init(const char *dev, speed_t baudrate) { - int rc, fd=0, v24; + int rc, fd=0, v24, flags; struct termios tio; - /* Open device */ - fd = open(dev, O_RDWR | O_NOCTTY); + /* Use nonblock as the device might block otherwise */ + fd = open(dev, O_RDWR | O_NOCTTY | O_SYNC | O_NONBLOCK); if (fd < 0) { dbg_perror("open"); return -errno; } + /* now put it into blcoking mode */ + flags = fcntl(fd, F_GETFL, 0); + if (flags < 0) { + dbg_perror("fcntl get flags"); + return -1; + } + + flags &= ~O_NONBLOCK; + rc = fcntl(fd, F_SETFL, flags); + if (rc != 0) { + dbg_perror("fcntl set flags"); + return -1; + } + /* Configure serial interface */ rc = tcgetattr(fd, &tio); if (rc < 0) { -- cgit v1.2.3