From 647c57259146571b78107e5e8bcfc9b6c81bc031 Mon Sep 17 00:00:00 2001 From: Manuel Menal Date: Tue, 12 Oct 2010 21:14:49 +0200 Subject: 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. --- netfs.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'netfs.c') 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; -- cgit v1.2.3