mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
serial: Fix file read/write error handling for Windows
File read/write semantics are different between POSIX and Windows. In particular Windows file read/write functions return a boolean type to indicate success or failure, while the POSIX equivalents return a signed integer indicating number of bytes read if successful or -1 if not. This attempts to correct some error handling paths for Windows and avoid invalid comparisons that were causing compilation issues. Reported on https://github.com/flashrom/flashrom/issues/149 Change-Id: Ib179d51ede2dbd38f54f3641bfe90340a6a87e31 Signed-off-by: David Hendricks <david.hendricks@gmail.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/43051 Reviewed-by: Angel Pons <th3fanbus@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
9b6fb745c2
commit
174a0c1b40
30
serial.c
30
serial.c
@ -391,14 +391,17 @@ int serialport_write(const unsigned char *buf, unsigned int writecnt)
|
|||||||
|
|
||||||
while (writecnt > 0) {
|
while (writecnt > 0) {
|
||||||
#if IS_WINDOWS
|
#if IS_WINDOWS
|
||||||
WriteFile(sp_fd, buf, writecnt, &tmp, NULL);
|
if (!WriteFile(sp_fd, buf, writecnt, &tmp, NULL)) {
|
||||||
|
msg_perr("Serial port write error!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
tmp = write(sp_fd, buf, writecnt);
|
tmp = write(sp_fd, buf, writecnt);
|
||||||
#endif
|
|
||||||
if (tmp == -1) {
|
if (tmp == -1) {
|
||||||
msg_perr("Serial port write error!\n");
|
msg_perr("Serial port write error!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
msg_pdbg2("Empty write\n");
|
msg_pdbg2("Empty write\n");
|
||||||
empty_writes--;
|
empty_writes--;
|
||||||
@ -425,14 +428,17 @@ int serialport_read(unsigned char *buf, unsigned int readcnt)
|
|||||||
|
|
||||||
while (readcnt > 0) {
|
while (readcnt > 0) {
|
||||||
#if IS_WINDOWS
|
#if IS_WINDOWS
|
||||||
ReadFile(sp_fd, buf, readcnt, &tmp, NULL);
|
if (!ReadFile(sp_fd, buf, readcnt, &tmp, NULL)) {
|
||||||
|
msg_perr("Serial port read error!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
tmp = read(sp_fd, buf, readcnt);
|
tmp = read(sp_fd, buf, readcnt);
|
||||||
#endif
|
|
||||||
if (tmp == -1) {
|
if (tmp == -1) {
|
||||||
msg_perr("Serial port read error!\n");
|
msg_perr("Serial port read error!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
msg_pdbg2("Empty read\n");
|
msg_pdbg2("Empty read\n");
|
||||||
readcnt -= tmp;
|
readcnt -= tmp;
|
||||||
@ -485,17 +491,21 @@ int serialport_read_nonblock(unsigned char *c, unsigned int readcnt, unsigned in
|
|||||||
for (i = 0; i < timeout; i++) {
|
for (i = 0; i < timeout; i++) {
|
||||||
msg_pspew("readcnt %u rd_bytes %u\n", readcnt, rd_bytes);
|
msg_pspew("readcnt %u rd_bytes %u\n", readcnt, rd_bytes);
|
||||||
#if IS_WINDOWS
|
#if IS_WINDOWS
|
||||||
ReadFile(sp_fd, c + rd_bytes, readcnt - rd_bytes, &rv, NULL);
|
if (!ReadFile(sp_fd, c + rd_bytes, readcnt - rd_bytes, &rv, NULL)) {
|
||||||
|
msg_perr_strerror("Serial port read error: ");
|
||||||
|
ret = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
msg_pspew("read %lu bytes\n", rv);
|
msg_pspew("read %lu bytes\n", rv);
|
||||||
#else
|
#else
|
||||||
rv = read(sp_fd, c + rd_bytes, readcnt - rd_bytes);
|
rv = read(sp_fd, c + rd_bytes, readcnt - rd_bytes);
|
||||||
msg_pspew("read %zd bytes\n", rv);
|
msg_pspew("read %zd bytes\n", rv);
|
||||||
#endif
|
|
||||||
if ((rv == -1) && (errno != EAGAIN)) {
|
if ((rv == -1) && (errno != EAGAIN)) {
|
||||||
msg_perr_strerror("Serial port read error: ");
|
msg_perr_strerror("Serial port read error: ");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (rv > 0)
|
if (rv > 0)
|
||||||
rd_bytes += rv;
|
rd_bytes += rv;
|
||||||
if (rd_bytes == readcnt) {
|
if (rd_bytes == readcnt) {
|
||||||
@ -565,17 +575,21 @@ int serialport_write_nonblock(const unsigned char *buf, unsigned int writecnt, u
|
|||||||
for (i = 0; i < timeout; i++) {
|
for (i = 0; i < timeout; i++) {
|
||||||
msg_pspew("writecnt %u wr_bytes %u\n", writecnt, wr_bytes);
|
msg_pspew("writecnt %u wr_bytes %u\n", writecnt, wr_bytes);
|
||||||
#if IS_WINDOWS
|
#if IS_WINDOWS
|
||||||
WriteFile(sp_fd, buf + wr_bytes, writecnt - wr_bytes, &rv, NULL);
|
if (!WriteFile(sp_fd, buf + wr_bytes, writecnt - wr_bytes, &rv, NULL)) {
|
||||||
|
msg_perr_strerror("Serial port write error: ");
|
||||||
|
ret = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
msg_pspew("wrote %lu bytes\n", rv);
|
msg_pspew("wrote %lu bytes\n", rv);
|
||||||
#else
|
#else
|
||||||
rv = write(sp_fd, buf + wr_bytes, writecnt - wr_bytes);
|
rv = write(sp_fd, buf + wr_bytes, writecnt - wr_bytes);
|
||||||
msg_pspew("wrote %zd bytes\n", rv);
|
msg_pspew("wrote %zd bytes\n", rv);
|
||||||
#endif
|
|
||||||
if ((rv == -1) && (errno != EAGAIN)) {
|
if ((rv == -1) && (errno != EAGAIN)) {
|
||||||
msg_perr_strerror("Serial port write error: ");
|
msg_perr_strerror("Serial port write error: ");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (rv > 0) {
|
if (rv > 0) {
|
||||||
wr_bytes += rv;
|
wr_bytes += rv;
|
||||||
if (wr_bytes == writecnt) {
|
if (wr_bytes == writecnt) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user