RETURN_INT(count);
} else if (GetLastError() == ERROR_IO_PENDING) {
DEBUG("Waiting for write to complete");
- GetOverlappedResult(port->hdl, &port->write_ovl, &bytes_written, TRUE);
+ if (GetOverlappedResult(port->hdl, &port->write_ovl, &bytes_written, TRUE) == 0)
+ RETURN_FAIL("GetOverlappedResult() failed");
DEBUG_FMT("Write completed, %d/%d bytes written", bytes_written, count);
RETURN_INT(bytes_written);
} else {
timeradd(&start, &delta, &end);
}
+ FD_ZERO(&fds);
+ FD_SET(port->fd, &fds);
+
/* Loop until we have written the requested number of bytes. */
while (bytes_written < count) {
/* Wait until space is available. */
- FD_ZERO(&fds);
- FD_SET(port->fd, &fds);
if (timeout_ms) {
gettimeofday(&now, NULL);
- if (timercmp(&now, &end, >)) {
- DEBUG("Write timed out");
- RETURN_INT(bytes_written);
- }
+ if (timercmp(&now, &end, >))
+ /* Timeout has expired. */
+ break;
timersub(&end, &now, &delta);
}
result = select(port->fd + 1, NULL, &fds, NULL, timeout_ms ? &delta : NULL);
RETURN_FAIL("select() failed");
}
} else if (result == 0) {
- DEBUG("Write timed out");
- RETURN_INT(bytes_written);
+ /* Timeout has expired. */
+ break;
}
/* Do write. */
ptr += result;
}
+ if (bytes_written < count)
+ DEBUG("Write timed out");
+
RETURN_INT(bytes_written);
#endif
}
bytes_read = count;
} else if (GetLastError() == ERROR_IO_PENDING) {
DEBUG("Waiting for read to complete");
- GetOverlappedResult(port->hdl, &port->read_ovl, &bytes_read, TRUE);
+ if (GetOverlappedResult(port->hdl, &port->read_ovl, &bytes_read, TRUE) == 0)
+ RETURN_FAIL("GetOverlappedResult() failed");
DEBUG_FMT("Read completed, %d/%d bytes read", bytes_read, count);
} else {
RETURN_FAIL("ReadFile() failed");
timeradd(&start, &delta, &end);
}
+ FD_ZERO(&fds);
+ FD_SET(port->fd, &fds);
+
/* Loop until we have the requested number of bytes. */
while (bytes_read < count) {
/* Wait until data is available. */
- FD_ZERO(&fds);
- FD_SET(port->fd, &fds);
if (timeout_ms) {
gettimeofday(&now, NULL);
if (timercmp(&now, &end, >))
/* Timeout has expired. */
- RETURN_INT(bytes_read);
+ break;
timersub(&end, &now, &delta);
}
result = select(port->fd + 1, &fds, NULL, NULL, timeout_ms ? &delta : NULL);
RETURN_FAIL("select() failed");
}
} else if (result == 0) {
- DEBUG("Read timed out");
- RETURN_INT(bytes_read);
+ /* Timeout has expired. */
+ break;
}
/* Do read. */
ptr += result;
}
+ if (bytes_read < count)
+ DEBUG("Read timed out");
+
RETURN_INT(bytes_read);
#endif
}