aboutsummaryrefslogtreecommitdiffstats
path: root/fileio.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2005-09-21 17:37:41 +0000
committerWayne Davison <wayned@samba.org>2005-09-21 17:37:41 +0000
commit134826751819f5763fb0bc7fa1bd9f167c43e97d (patch)
treea52639a6a06d5a5f09a655a00dc234777990845e /fileio.c
parentf0323d68eb0e0b982bb79880527bb9c5b3524f1e (diff)
downloadandroid_external_rsync-134826751819f5763fb0bc7fa1bd9f167c43e97d.tar.gz
android_external_rsync-134826751819f5763fb0bc7fa1bd9f167c43e97d.tar.bz2
android_external_rsync-134826751819f5763fb0bc7fa1bd9f167c43e97d.zip
If we get less data than expected from a read() in map_ptr(), we
need to try to keep reading to see if we get an error or more data.
Diffstat (limited to 'fileio.c')
-rw-r--r--fileio.c49
1 files changed, 27 insertions, 22 deletions
diff --git a/fileio.c b/fileio.c
index 45366f56..18062091 100644
--- a/fileio.c
+++ b/fileio.c
@@ -22,6 +22,10 @@
*/
#include "rsync.h"
+#ifndef ENODATA
+#define ENODATA EAGAIN
+#endif
+
extern int sparse_files;
static char last_byte;
@@ -217,34 +221,35 @@ char *map_ptr(struct map_struct *map, OFF_T offset, int32 len)
rprintf(FERROR, "invalid read_size of %ld in map_ptr\n",
(long)read_size);
exit_cleanup(RERR_FILEIO);
- } else {
- if (map->p_fd_offset != read_start) {
- OFF_T ret = do_lseek(map->fd, read_start, SEEK_SET);
- if (ret != read_start) {
- rsyserr(FERROR, errno,
- "lseek returned %.0f, not %.0f",
- (double)ret, (double)read_start);
- exit_cleanup(RERR_FILEIO);
- }
- map->p_fd_offset = read_start;
- }
+ }
- if ((nread=read(map->fd,map->p + read_offset,read_size)) != read_size) {
- if (nread < 0) {
- nread = 0;
- if (!map->status)
- map->status = errno;
- }
- /* the best we can do is zero the buffer - the file
- has changed mid transfer! */
- memset(map->p+read_offset+nread, 0, read_size - nread);
+ if (map->p_fd_offset != read_start) {
+ OFF_T ret = do_lseek(map->fd, read_start, SEEK_SET);
+ if (ret != read_start) {
+ rsyserr(FERROR, errno, "lseek returned %.0f, not %.0f",
+ (double)ret, (double)read_start);
+ exit_cleanup(RERR_FILEIO);
}
- map->p_fd_offset += nread;
+ map->p_fd_offset = read_start;
}
-
+ map->p_fd_offset += read_size;
map->p_offset = window_start;
map->p_len = window_size;
+ while (read_size > 0) {
+ nread = read(map->fd, map->p + read_offset, read_size);
+ if (nread <= 0) {
+ if (!map->status)
+ map->status = nread ? errno : ENODATA;
+ /* The best we can do is zero the buffer -- the file
+ * has changed mid transfer! */
+ memset(map->p + read_offset, 0, read_size);
+ break;
+ }
+ read_offset += nread;
+ read_size -= nread;
+ }
+
return map->p;
}