diff options
author | J.W. Schultz <jw@samba.org> | 2003-09-16 02:49:59 +0000 |
---|---|---|
committer | J.W. Schultz <jw@samba.org> | 2003-09-16 02:49:59 +0000 |
commit | 6a7cc46cb279b9dbf12977177330aeebb912aa34 (patch) | |
tree | 6e3b7760f73eb3610228467999714af25378f3d4 /fileio.c | |
parent | aa6dc37ccb73c83f652e72ed1ca7700934a52331 (diff) | |
download | android_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.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -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; } |