- if ((nread=read(map->fd,map->p,len)) != len) {
- if (nread < 0) nread = 0;
- /* the best we can do is zero the buffer - the file
- has changed mid transfer! */
- memset(map->p+nread, 0, len - 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 = 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;