Miscellaneous 'sendfile' fixes and improved tests.
* libguile/filesys.c (scm_sendfile): In Linux-style sendfile(2) code, if
EINTR or EAGAIN occurs, set result to 1 (not 0) so that we actually
keep going. In non-sendfile(2) code, deal gracefully with short reads
due to EOF.
* test-suite/tests/filesys.test ("sendfile"): Use 'let*' to guarantee
the needed order of operations: write (test-file) and then read it.
Add code to check the written data (not just the returned length) in
all tests, including the cases that hit EOF prematurely.
This commit is contained in:
parent
eed0d26cc0
commit
7f3be1db99
2 changed files with 51 additions and 31 deletions
|
|
@ -1160,7 +1160,7 @@ SCM_DEFINE (scm_sendfile, "sendfile", 3, 1, 0,
|
|||
total += result;
|
||||
else if (result < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
/* Keep going. */
|
||||
result = 0;
|
||||
result = 1;
|
||||
}
|
||||
while (total < c_count && result > 0);
|
||||
}
|
||||
|
|
@ -1175,6 +1175,7 @@ SCM_DEFINE (scm_sendfile, "sendfile", 3, 1, 0,
|
|||
{
|
||||
char buf[8192];
|
||||
size_t left;
|
||||
int reached_eof = 0;
|
||||
|
||||
if (!SCM_UNBNDP (offset))
|
||||
{
|
||||
|
|
@ -1187,22 +1188,27 @@ SCM_DEFINE (scm_sendfile, "sendfile", 3, 1, 0,
|
|||
}
|
||||
}
|
||||
|
||||
for (total = 0, left = c_count; total < c_count; )
|
||||
for (total = 0, left = c_count; total < c_count && !reached_eof; )
|
||||
{
|
||||
size_t asked, obtained;
|
||||
size_t asked, obtained, written;
|
||||
|
||||
asked = SCM_MIN (sizeof buf, left);
|
||||
obtained = full_read (in_fd, buf, asked);
|
||||
if (obtained < asked)
|
||||
SCM_SYSERROR;
|
||||
{
|
||||
if (errno == 0)
|
||||
reached_eof = 1;
|
||||
else
|
||||
SCM_SYSERROR;
|
||||
}
|
||||
|
||||
left -= obtained;
|
||||
|
||||
obtained = full_write (out_fd, buf, asked);
|
||||
if (obtained < asked)
|
||||
written = full_write (out_fd, buf, obtained);
|
||||
if (written < obtained)
|
||||
SCM_SYSERROR;
|
||||
|
||||
total += obtained;
|
||||
total += written;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue