aboutsummaryrefslogtreecommitdiffstats
path: root/fileio.c
diff options
context:
space:
mode:
authorJ.W. Schultz <jw@samba.org>2003-09-16 02:49:59 +0000
committerJ.W. Schultz <jw@samba.org>2003-09-16 02:49:59 +0000
commit6a7cc46cb279b9dbf12977177330aeebb912aa34 (patch)
tree6e3b7760f73eb3610228467999714af25378f3d4 /fileio.c
parentaa6dc37ccb73c83f652e72ed1ca7700934a52331 (diff)
downloadandroid_external_rsync-6a7cc46cb279b9dbf12977177330aeebb912aa34.tar.gz
android_external_rsync-6a7cc46cb279b9dbf12977177330aeebb912aa34.tar.bz2
android_external_rsync-6a7cc46cb279b9dbf12977177330aeebb912aa34.zip
Detect and report when open or opendir succeed but read and
readdir fail caused by network filesystems issues and truncated files. Thanks to David Norwood and Michael Brown
Diffstat (limited to 'fileio.c')
-rw-r--r--fileio.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/fileio.c b/fileio.c
index e8eaa100..088ed639 100644
--- a/fileio.c
+++ b/fileio.c
@@ -115,6 +115,7 @@ struct map_struct *map_file(int fd,OFF_T len)
map->p_offset = 0;
map->p_fd_offset = 0;
map->p_len = 0;
+ map->status = 0;
return map;
}
@@ -191,7 +192,11 @@ char *map_ptr(struct map_struct *map,OFF_T offset,int len)
}
if ((nread=read(map->fd,map->p + read_offset,read_size)) != read_size) {
- if (nread < 0) nread = 0;
+ 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);
@@ -206,13 +211,18 @@ char *map_ptr(struct map_struct *map,OFF_T offset,int len)
}
-void unmap_file(struct map_struct *map)
+int unmap_file(struct map_struct *map)
{
+ int ret;
+
if (map->p) {
free(map->p);
map->p = NULL;
}
+ ret = map->status;
memset(map, 0, sizeof(*map));
free(map);
+
+ return ret;
}