summaryrefslogtreecommitdiff
path: root/netfs.c
diff options
context:
space:
mode:
authorManuel Menal <mmenal@hurdfr.org>2010-10-12 21:14:49 +0200
committerManuel Menal <mmenal@hurdfr.org>2010-10-12 21:14:49 +0200
commit647c57259146571b78107e5e8bcfc9b6c81bc031 (patch)
treea411a74990f41a5fb6993701447fe55b5e2b8f3b /netfs.c
parent55f1bab01b1efb0a37ac8426936ba62aa49fb987 (diff)
Fix reading bug on some gopher servers.
* netfs.c (netfs_attempt_read): try reading until the requested amount or EOF is reached. Close file descriptor.
Diffstat (limited to 'netfs.c')
-rw-r--r--netfs.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/netfs.c b/netfs.c
index b4310647f..bcd6e093b 100644
--- a/netfs.c
+++ b/netfs.c
@@ -488,34 +488,39 @@ netfs_attempt_readlink (struct iouser *user, struct node *node,
successfully read upon return. */
error_t
netfs_attempt_read (struct iouser *cred, struct node *node,
- off_t offset, size_t *len, void *data)
+ loff_t offset, size_t *len, void *data)
{
int remote_fd;
void *buf;
- ssize_t size;
- error_t err;
+ ssize_t size, total_size = 0;
+ error_t err = 0;
- debug("Reading contents of file %s (offset: %d, len: %d)",
+ debug("Reading contents of file %s (offset: %qd, *len: %d)",
node->nn->e->name, offset, *len);
err = gopher_open (node->nn->e, &remote_fd);
if (err)
return err;
- /* We can't seek into a socket. Read offset + *len bytes and then
- copy only the last *len bytes.*/
buf = malloc (offset + *len);
- size = read (remote_fd, buf, *len + offset);
+ /* Read until the requested amount of data or EOF is reached. */
+ do
+ {
+ size = read (remote_fd, buf + total_size, offset + *len);
+ total_size += size;
+ }
+ while (size > 0 && total_size < offset + *len);
+
if (size < 0)
err = errno;
else
{
- *len = size - offset;
+ *len = total_size - offset;
memcpy (data, buf + offset, *len);
- err = 0;
}
+ close (remote_fd);
free (buf);
return err;