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.

Signed-off-by: Stefan Tauner <stefan.tau...@alumni.tuwien.ac.at>
---
 serial.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/serial.c b/serial.c
index 94f9b7d..63774a5 100644
--- a/serial.c
+++ b/serial.c
@@ -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;
-- 
Kind regards, Stefan Tauner


_______________________________________________
flashrom mailing list
flashrom@flashrom.org
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to