if (IS_DEVICE(file->mode)) {
if (am_root && preserve_devices) {
make_bak_dir(fname, backup_dir);
- if (do_mknod(keep_name, file->mode, file->rdev) != 0) {
+ if (do_mknod(keep_name, file->mode, file->u.rdev) != 0) {
rprintf(FERROR, "mknod %s failed: %s\n",
full_fname(keep_name), strerror(errno));
} else if (verbose > 2) {
#if SUPPORT_LINKS
if (!kept && preserve_links && S_ISLNK(file->mode)) {
extern int safe_symlinks;
- if (safe_symlinks && unsafe_symlink(file->link, keep_name)) {
+ if (safe_symlinks && unsafe_symlink(file->u.link, keep_name)) {
if (verbose) {
rprintf(FINFO, "ignoring unsafe symlink %s -> %s\n",
- full_fname(keep_name), file->link);
+ full_fname(keep_name), file->u.link);
}
kept = 1;
}
make_bak_dir(fname, backup_dir);
- if (do_symlink(file->link, keep_name) != 0) {
+ if (do_symlink(file->u.link, keep_name) != 0) {
rprintf(FERROR, "link %s -> %s : %s\n",
- full_fname(keep_name), file->link, strerror(errno));
+ full_fname(keep_name), file->u.link, strerror(errno));
}
do_unlink(fname);
kept = 1;
rprintf(FINFO, "%s %11.0f %s %s -> %s\n",
perms,
(double) f->length, timestring(f->modtime),
- f_name(f), f->link);
+ f_name(f), f->u.link);
} else {
rprintf(FINFO, "%s %11.0f %s %s\n",
perms,
mode = file->mode;
if (preserve_devices) {
if (protocol_version < 28) {
- if (IS_DEVICE(mode) && file->rdev == rdev) {
- /* Set both flags so that the test when
- * writing the data is simpler. */
- flags |= SAME_RDEV_pre28|SAME_HIGH_RDEV;
- }
- else
- rdev = file->rdev;
- }
- else if (IS_DEVICE(mode)) {
- if ((file->rdev & ~0xFF) == rdev)
+ if (IS_DEVICE(mode)) {
+ if (file->u.rdev == rdev) {
+ /* Set both flags so that the test when
+ * writing the data is simpler. */
+ flags |= SAME_RDEV_pre28|SAME_HIGH_RDEV;
+ } else
+ rdev = file->u.rdev;
+ } else
+ rdev = 0;
+ } else if (IS_DEVICE(mode)) {
+ if ((file->u.rdev & ~0xFF) == rdev)
flags |= SAME_HIGH_RDEV;
else
- rdev = file->rdev & ~0xFF;
+ rdev = file->u.rdev & ~0xFF;
}
}
if (file->uid == uid)
if (file->dev == dev) {
if (protocol_version >= 28)
flags |= SAME_DEV;
- }
- else
+ } else
dev = file->dev;
flags |= HAS_INODE_DATA;
}
/* If SAME_HIGH_RDEV is off, SAME_RDEV_pre28 is also off.
* Also, avoid using "rdev" because it may be incomplete. */
if (!(flags & SAME_HIGH_RDEV))
- write_int(f, file->rdev);
+ write_int(f, file->u.rdev);
else if (protocol_version >= 28)
- write_byte(f, file->rdev);
+ write_byte(f, file->u.rdev);
}
#if SUPPORT_LINKS
if (preserve_links && S_ISLNK(mode)) {
- write_int(f, strlen(file->link));
- write_buf(f, file->link, strlen(file->link));
+ write_int(f, strlen(file->u.link));
+ write_buf(f, file->u.link, strlen(file->u.link));
}
#endif
}
#endif
- if (always_checksum && (protocol_version < 28 || S_ISREG(mode))) {
- char *sum = file->sum? file->sum : empty_sum;
- write_buf(f, sum, protocol_version < 21? 2
- : MD4_SUM_LENGTH);
+ if (always_checksum) {
+ char *sum;
+ if (S_ISREG(mode))
+ sum = file->u.sum;
+ else if (protocol_version < 28) {
+ /* Prior to 28, we sent a useless set of nulls. */
+ sum = empty_sum;
+ } else
+ sum = NULL;
+ if (sum) {
+ write_buf(f, sum, protocol_version < 21? 2
+ : MD4_SUM_LENGTH);
+ }
}
strlcpy(lastname, fname, MAXPATHLEN);
if (IS_DEVICE(mode)) {
if (!(flags & SAME_RDEV_pre28))
rdev = (DEV64_T)read_int(f);
- file->rdev = rdev;
+ file->u.rdev = rdev;
} else
rdev = 0;
} else if (IS_DEVICE(mode)) {
if (!(flags & SAME_HIGH_RDEV)) {
- file->rdev = (DEV64_T)read_int(f);
- rdev = file->rdev & ~0xFF;
+ file->u.rdev = (DEV64_T)read_int(f);
+ rdev = file->u.rdev & ~0xFF;
} else
- file->rdev = rdev | (DEV64_T)read_byte(f);
+ file->u.rdev = rdev | (DEV64_T)read_byte(f);
}
}
rprintf(FERROR, "overflow: l=%d\n", l);
overflow("receive_file_entry");
}
- file->link = new_array(char, l + 1);
- if (!file->link)
+ if (!(file->u.link = new_array(char, l + 1)))
out_of_memory("receive_file_entry 2");
- read_sbuf(f, file->link, l);
+ read_sbuf(f, file->u.link, l);
if (sanitize_paths)
- sanitize_path(file->link, file->dirname);
+ sanitize_path(file->u.link, file->dirname);
}
#if SUPPORT_HARD_LINKS
if (preserve_hard_links && protocol_version < 28
if (always_checksum) {
char *sum;
if (S_ISREG(mode)) {
- sum = file->sum = new_array(char, MD4_SUM_LENGTH);
+ sum = file->u.sum = new_array(char, MD4_SUM_LENGTH);
if (!sum)
out_of_memory("md4 sum");
} else if (protocol_version < 28) {
}
}
#ifdef HAVE_STRUCT_STAT_ST_RDEV
- file->rdev = st.st_rdev;
+ if (IS_DEVICE(st.st_mode))
+ file->u.rdev = st.st_rdev;
#endif
#if SUPPORT_LINKS
if (S_ISLNK(st.st_mode))
- file->link = STRDUP(ap, linkbuf);
+ file->u.link = STRDUP(ap, linkbuf);
#endif
if (always_checksum && S_ISREG(st.st_mode)) {
- file->sum = (char*)MALLOC(ap, MD4_SUM_LENGTH);
- if (!file->sum)
+ if (!(file->u.sum = (char*)MALLOC(ap, MD4_SUM_LENGTH)))
out_of_memory("md4 sum");
- file_checksum(fname, file->sum, st.st_size);
+ file_checksum(fname, file->u.sum, st.st_size);
}
if (flist_dir) {
return;
if (file->basename)
free(file->basename);
- if (file->link)
- free(file->link);
- if (file->sum)
- free(file->sum);
+ if (!IS_DEVICE(file->mode) && file->u.link)
+ free(file->u.link); /* Handles u.sum too. */
*file = null_file;
}
flist->files[i][0] = null_file;
else
free_file(flist->files[i]);
- }
- else
+ } else
prev_i = i;
}
if (!(c1 = (uchar*)f1->dirname)) {
state1 = fnc_BASE;
c1 = (uchar*)f1->basename;
- }
- else
+ } else
state1 = fnc_DIR;
if (!(c2 = (uchar*)f2->dirname)) {
state2 = fnc_BASE;
c2 = (uchar*)f2->basename;
- }
- else
+ } else
state2 = fnc_DIR;
while (1) {
}
}
file_checksum(fname,sum,st->st_size);
- return memcmp(sum, file->sum, protocol_version < 21? 2
+ return memcmp(sum, file->u.sum, protocol_version < 21 ? 2
: MD4_SUM_LENGTH) == 0;
}
int l;
extern int safe_symlinks;
- if (safe_symlinks && unsafe_symlink(file->link, fname)) {
+ if (safe_symlinks && unsafe_symlink(file->u.link, fname)) {
if (verbose) {
rprintf(FINFO, "ignoring unsafe symlink %s -> \"%s\"\n",
- full_fname(fname), file->link);
+ full_fname(fname), file->u.link);
}
return;
}
/* A link already pointing to the
* right place -- no further action
* required. */
- if (strcmp(lnk,file->link) == 0) {
+ if (strcmp(lnk,file->u.link) == 0) {
set_perms(fname,file,&st,1);
return;
}
* in place. */
delete_file(fname);
}
- if (do_symlink(file->link,fname) != 0) {
+ if (do_symlink(file->u.link,fname) != 0) {
rprintf(FERROR, "symlink %s -> \"%s\" failed: %s\n",
- full_fname(fname), file->link, strerror(errno));
+ full_fname(fname), file->u.link, strerror(errno));
} else {
set_perms(fname,file,NULL,0);
if (verbose) {
- rprintf(FINFO,"%s -> %s\n", fname,file->link);
+ rprintf(FINFO,"%s -> %s\n", fname,file->u.link);
}
}
#endif
if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
if (statret != 0 ||
st.st_mode != file->mode ||
- (DEV64_T)st.st_rdev != file->rdev) {
+ (DEV64_T)st.st_rdev != file->u.rdev) {
delete_file(fname);
if (verbose > 2)
rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
- fname,(int)file->mode,(int)file->rdev);
- if (do_mknod(fname,file->mode,file->rdev) != 0) {
+ fname,(int)file->mode,(int)file->u.rdev);
+ if (do_mknod(fname,file->mode,file->u.rdev) != 0) {
rprintf(FERROR, "mknod %s failed: %s\n",
full_fname(fname), strerror(errno));
} else {