diff options
| author | Wayne Davison <wayned@samba.org> | 2005-09-21 17:37:41 +0000 |
|---|---|---|
| committer | Wayne Davison <wayned@samba.org> | 2005-09-21 17:37:41 +0000 |
| commit | 134826751819f5763fb0bc7fa1bd9f167c43e97d (patch) | |
| tree | a52639a6a06d5a5f09a655a00dc234777990845e /fileio.c | |
| parent | f0323d68eb0e0b982bb79880527bb9c5b3524f1e (diff) | |
| download | android_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.c | 49 |
1 files changed, 27 insertions, 22 deletions
@@ -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; } |
