same path. A directory still cannot be replaced by a
regular file unless --delete specified. (J.W. Schultz)
+ * Detect and report when open or opendir succeed but read and
+ readdir fail caused by network filesystems issues and truncated
+ files. (David Norwood, Michael Brown, J.W. Schultz)
+
INTERNAL:
* Eliminated vestigial support for old versions that we stopped
map->p_offset = 0;
map->p_fd_offset = 0;
map->p_len = 0;
+ map->status = 0;
return map;
}
}
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);
}
-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;
}
}
}
- for (di = readdir(d); di; di = readdir(d)) {
+ for (errno = 0, di = readdir(d); di; errno = 0, di = readdir(d)) {
char *dname = d_name(di);
- if (dname[0] == '.' && (dname[1] == '\0' ||
- (dname[1] == '.' && dname[2] == '\0')))
+ if (dname[0] == '.' && (dname[1] == '\0'
+ || (dname[1] == '.' && dname[2] == '\0')))
continue;
strlcpy(p, dname, MAXPATHLEN - l);
send_file_name(f, flist, fname, recurse, 0);
}
+ if (errno) {
+ io_error = 1;
+ rprintf(FERROR, "readdir(%s): (%d) %s\n",
+ dir, errno, strerror(errno));
+ }
if (local_exclude_list)
free_exclude_list(&local_exclude_list); /* Zeros pointer too */
return -1;
}
- for (di=readdir(d); di; di=readdir(d)) {
+ for (errno = 0, di = readdir(d); di; errno = 0, di = readdir(d)) {
char *dname = d_name(di);
- if (strcmp(dname,".")==0 ||
- strcmp(dname,"..")==0)
+ if (strcmp(dname,".") == 0
+ || strcmp(dname,"..") == 0)
continue;
snprintf(buf, sizeof(buf), "%s/%s", fname, dname);
if (verbose > 0)
return -1;
}
}
+ if (errno) {
+ rprintf(FERROR, "delete_file: readdir(%s): (%d) %s\n",
+ fname, errno, strerror(errno));
+ closedir(d);
+ return -1;
+ }
closedir(d);
}
int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
- int report)
+ int report)
{
int updated = 0;
STRUCT_STAT st2;
}
}
#endif
-
+
if (verbose > 1 && report) {
if (updated)
rprintf(FINFO,"%s\n",fname);
/* move tmp file over real file */
if (robust_rename(fnametmp,fname) != 0) {
if (errno == EXDEV) {
- /* rename failed on cross-filesystem link.
+ /* rename failed on cross-filesystem link.
Copy the file instead. */
if (copy_file(fnametmp,fname, file->mode & INITACCESSPERMS)) {
rprintf(FERROR, "copy %s -> \"%s\": %s\n",
};
struct map_struct {
- char *p;
- int fd,p_size,p_len;
- OFF_T file_size, p_offset, p_fd_offset;
+ char *p; /* Window pointer */
+ int fd; /* File Descriptor */
+ int p_size; /* Window size at allocation */
+ int p_len; /* Window size after fill */
+ /* p_size and p_len could be
+ * consolodated by using a local
+ * variable in map_ptr() */
+ int status; /* first errno from read errors */
+ OFF_T file_size; /* File size (from stat) */
+ OFF_T p_offset; /* Window start */
+ OFF_T p_fd_offset; /* offset of cursor in fd ala lseek */
};
#define MATCHFLG_WILD 0x0001 /* pattern has '*', '[', and/or '?' */
}
if (!read_batch) { /* dw */
- if (buf) unmap_file(buf);
+ if (buf) {
+ j = unmap_file(buf);
+ if (j) {
+ io_error = 1;
+ rprintf(FERROR,
+ "read errors mapping %s: (%d) %s\n",
+ full_fname(fname),
+ j,
+ strerror(j));
+ }
+ }
close(fd);
}