aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>2016-01-04 03:04:36 +0000
committerStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>2016-01-04 03:04:36 +0000
commitfa272c55e13ca1f3b91925349afa465b781714fe (patch)
tree63b2175ae000eb80d39702446e5ad1e1180ad380
parent81d0a97a7fe7e4a709a35a27ae8d95d368b0713d (diff)
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.c18
1 files 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;