diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | netfs.c | 23 |
2 files changed, 19 insertions, 9 deletions
@@ -1,3 +1,8 @@ +2010-10-12 Manuel Menal <mmenal@hurdfr.org> + + * netfs.c (netfs_attempt_read): try reading until the requested amount + or EOF is reached. Close file descriptor. + 2010-10-09 Manuel Menal <mmenal@hurdfr.org> * args.c: modify -D option to take a filename. @@ -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; |