diff options
author | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2016-01-04 03:04:36 +0000 |
---|---|---|
committer | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2016-01-04 03:04:36 +0000 |
commit | fa272c55e13ca1f3b91925349afa465b781714fe (patch) | |
tree | 63b2175ae000eb80d39702446e5ad1e1180ad380 | |
parent | 81d0a97a7fe7e4a709a35a27ae8d95d368b0713d (diff) | |
download | flashrom-fa272c55e13ca1f3b91925349afa465b781714fe.zip flashrom-fa272c55e13ca1f3b91925349afa465b781714fe.tar.gz |
serprog: clear NDELAY flag only once after opening the port
Change sp_openserport() to directly clear the O_NONBLOCK flag that
is potentially set by opening the device with O_NDELAY instead of
clearing ALL flags in serialport_config() unconditionally.
Corresponding to flashrom svn r1905.
Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Urja Rannikko <urjaman@gmail.com>
-rw-r--r-- | serial.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -183,10 +183,6 @@ int serialport_config(fdtype fd, unsigned int baud) msg_pdbg("Baud rate is %ld.\n", dcb.BaudRate); #else struct termios wanted, observed; - if (fcntl(fd, F_SETFL, 0) != 0) { - msg_perr_strerror("Could not clear serial port mode: "); - return 1; - } if (tcgetattr(fd, &observed) != 0) { msg_perr_strerror("Could not fetch original serial port configuration: "); return 1; @@ -254,11 +250,23 @@ fdtype sp_openserport(char *dev, unsigned int baud) } return fd; #else - fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY); + fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY); // Use O_NDELAY to ignore DCD state if (fd < 0) { msg_perr_strerror("Cannot open serial port: "); return SER_INV_FD; } + + /* Ensure that we use blocking I/O */ + const int flags = fcntl(fd, F_GETFL); + if (flags == -1) { + msg_perr_strerror("Could not get serial port mode: "); + return SER_INV_FD; + } + if (fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { + msg_perr_strerror("Could not set serial port mode to blocking: "); + return SER_INV_FD; + } + if (serialport_config(fd, baud) != 0) { close(fd); return SER_INV_FD; |