diff options
author | Manuel Menal <mmenal@hurdfr.org> | 2010-10-12 21:14:49 +0200 |
---|---|---|
committer | Manuel Menal <mmenal@hurdfr.org> | 2010-10-12 21:14:49 +0200 |
commit | 647c57259146571b78107e5e8bcfc9b6c81bc031 (patch) | |
tree | a411a74990f41a5fb6993701447fe55b5e2b8f3b /netfs.c | |
parent | 55f1bab01b1efb0a37ac8426936ba62aa49fb987 (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.c | 23 |
1 files changed, 14 insertions, 9 deletions
@@ -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; |