Fix bogus return values from libc_r's write() routine in situations where

a partial-write is followed by an error.

PR:		43335
MFC after:	1 week
This commit is contained in:
Archie Cobbs 2002-11-05 00:59:18 +00:00
parent 1da3a922f9
commit 83189ac197

View File

@ -110,20 +110,35 @@ _write(int fd, const void *buf, size_t nbytes)
* interrupted by a signal
*/
if (curthread->interrupted) {
/* Return an error: */
ret = -1;
if (num > 0) {
/* Return partial success: */
ret = num;
} else {
/* Return an error: */
errno = EINTR;
ret = -1;
}
}
/*
* If performing a non-blocking write or if an
* error occurred, just return whatever the write
* syscall did:
* If performing a non-blocking write,
* just return whatever the write syscall did:
*/
} else if (!blocking || n < 0) {
} else if (!blocking) {
/* A non-blocking call might return zero: */
ret = n;
break;
/*
* If there was an error, return partial success
* (if any bytes were written) or else the error:
*/
} else if (n < 0) {
if (num > 0)
ret = num;
else
ret = n;
/* Check if the write has completed: */
} else if (num >= nbytes)
/* Return the number of bytes written: */