[flashrom] [commit] r1905 - trunk

repository service svn at flashrom.org
Mon Jan 4 04:04:37 CET 2016


Author: stefanct
Date: Mon Jan  4 04:04:36 2016
New Revision: 1905
URL: http://flashrom.org/trac/flashrom/changeset/1905

Log:
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.

Signed-off-by: Stefan Tauner <stefan.tauner at alumni.tuwien.ac.at>
Acked-by: Urja Rannikko <urjaman at gmail.com>

Modified:
   trunk/serial.c

Modified: trunk/serial.c
==============================================================================
--- trunk/serial.c	Fri Dec 25 23:42:45 2015	(r1904)
+++ trunk/serial.c	Mon Jan  4 04:04:36 2016	(r1905)
@@ -183,10 +183,6 @@
 	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 @@
 	}
 	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;




More information about the flashrom mailing list