extern int am_server;
extern int am_daemon;
extern int am_sender;
+extern int am_generator;
extern int inc_recurse;
extern int do_progress;
extern int always_checksum;
extern int copy_dirlinks;
extern int keep_dirlinks;
extern int preserve_acls;
+extern int preserve_xattrs;
extern int preserve_links;
extern int preserve_hard_links;
extern int preserve_devices;
rprintf(FINFO,"copying unsafe symlink \"%s\" -> \"%s\"\n",
path, linkbuf);
}
- return do_stat(path, stp);
+ return x_stat(path, stp, NULL);
}
}
return 0;
#else
- return do_stat(path, stp);
+ return x_stat(path, stp, NULL);
#endif
}
{
#ifdef SUPPORT_LINKS
if (copy_links)
- return do_stat(path, stp);
- if (do_lstat(path, stp) < 0)
+ return x_stat(path, stp, NULL);
+ if (x_lstat(path, stp, NULL) < 0)
return -1;
if (follow_dirlinks && S_ISLNK(stp->st_mode)) {
STRUCT_STAT st;
- if (do_stat(path, &st) == 0 && S_ISDIR(st.st_mode))
+ if (x_stat(path, &st, NULL) == 0 && S_ISDIR(st.st_mode))
*stp = st;
}
return 0;
#else
- return do_stat(path, stp);
+ return x_stat(path, stp, NULL);
#endif
}
return 0;
}
-static int to_wire_mode(mode_t mode)
-{
-#ifdef SUPPORT_LINKS
-#if _S_IFLNK != 0120000
- if (S_ISLNK(mode))
- return (mode & ~(_S_IFMT)) | 0120000;
-#endif
-#endif
- return mode;
-}
-
-static mode_t from_wire_mode(int mode)
-{
-#if _S_IFLNK != 0120000
- if ((mode & (_S_IFMT)) == 0120000)
- return (mode & ~(_S_IFMT)) | _S_IFLNK;
-#endif
- return mode;
-}
-
static void send_directory(int f, struct file_list *flist, int ndx,
char *fbuf, int len, int flags);
if (dir && !push_dir(dir, 0)) {
io_error |= IOERR_GENERAL;
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(dir));
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(dir), curr_dir);
return 0;
}
if (flags & XMIT_SAME_NAME)
write_byte(f, l1);
if (flags & XMIT_LONG_NAME)
- write_abbrevint30(f, l2);
+ write_varint30(f, l2);
else
write_byte(f, l2);
write_buf(f, fname + l1, l2);
if (first_hlink_ndx >= 0) {
- write_abbrevint30(f, first_hlink_ndx);
+ write_varint30(f, first_hlink_ndx);
goto the_end;
}
- write_longint(f, F_LENGTH(file));
- if (!(flags & XMIT_SAME_TIME))
- write_int(f, modtime);
+ write_varlong30(f, F_LENGTH(file), 3);
+ if (!(flags & XMIT_SAME_TIME)) {
+ if (protocol_version >= 30)
+ write_varlong(f, modtime, 4);
+ else
+ write_int(f, modtime);
+ }
if (!(flags & XMIT_SAME_MODE))
write_int(f, to_wire_mode(mode));
if (preserve_uid && !(flags & XMIT_SAME_UID)) {
if (protocol_version < 30)
write_int(f, uid);
else {
- write_abbrevint(f, uid);
+ write_varint(f, uid);
if (flags & XMIT_USER_NAME_FOLLOWS) {
int len = strlen(user_name);
write_byte(f, len);
if (protocol_version < 30)
write_int(f, gid);
else {
- write_abbrevint(f, gid);
+ write_varint(f, gid);
if (flags & XMIT_GROUP_NAME_FOLLOWS) {
int len = strlen(group_name);
write_byte(f, len);
write_int(f, (int)rdev);
} else {
if (!(flags & XMIT_SAME_RDEV_MAJOR))
- write_abbrevint30(f, major(rdev));
+ write_varint30(f, major(rdev));
if (protocol_version >= 30)
- write_abbrevint(f, minor(rdev));
+ write_varint(f, minor(rdev));
else if (flags & XMIT_RDEV_MINOR_8_pre30)
write_byte(f, minor(rdev));
else
if (preserve_links && S_ISLNK(mode)) {
const char *sl = F_SYMLINK(file);
int len = strlen(sl);
- write_abbrevint30(f, len);
+ write_varint30(f, len);
write_buf(f, sl, len);
}
#endif
static struct file_struct *recv_file_entry(struct file_list *flist,
int flags, int f)
{
- static time_t modtime;
+ static int64 modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
l1 = read_byte(f);
if (flags & XMIT_LONG_NAME)
- l2 = read_abbrevint30(f);
+ l2 = read_varint30(f);
else
l2 = read_byte(f);
if (protocol_version >= 30
&& BITS_SETnUNSET(flags, XMIT_HLINKED, XMIT_HLINK_FIRST)) {
struct file_struct *first;
- first_hlink_ndx = read_abbrevint30(f);
+ first_hlink_ndx = read_varint30(f);
if (first_hlink_ndx < 0 || first_hlink_ndx >= flist->count) {
rprintf(FERROR,
"hard-link reference out of range: %d (%d)\n",
}
#endif
- file_length = read_longint(f);
- if (!(flags & XMIT_SAME_TIME))
- modtime = (time_t)read_int(f);
+ file_length = read_varlong30(f, 3);
+ if (!(flags & XMIT_SAME_TIME)) {
+ if (protocol_version >= 30) {
+ modtime = read_varlong(f, 4);
+#if SIZEOF_TIME_T < SIZEOF_INT64
+ if ((modtime > INT_MAX || modtime < INT_MIN) && !am_generator) {
+ rprintf(FERROR,
+ "Time value of %s truncated on receiver.\n",
+ lastname);
+ }
+#endif
+ } else
+ modtime = read_int(f);
+ }
if (!(flags & XMIT_SAME_MODE))
mode = from_wire_mode(read_int(f));
if (protocol_version < 30)
uid = (uid_t)read_int(f);
else {
- uid = (uid_t)read_abbrevint(f);
+ uid = (uid_t)read_varint(f);
if (flags & XMIT_USER_NAME_FOLLOWS)
uid = recv_user_name(f, uid);
else if (inc_recurse && am_root && !numeric_ids)
if (protocol_version < 30)
gid = (gid_t)read_int(f);
else {
- gid = (gid_t)read_abbrevint(f);
+ gid = (gid_t)read_varint(f);
if (flags & XMIT_GROUP_NAME_FOLLOWS)
gid = recv_group_name(f, gid);
else if (inc_recurse && (!am_root || !numeric_ids))
} else {
uint32 rdev_minor;
if (!(flags & XMIT_SAME_RDEV_MAJOR))
- rdev_major = read_abbrevint30(f);
+ rdev_major = read_varint30(f);
if (protocol_version >= 30)
- rdev_minor = read_abbrevint(f);
+ rdev_minor = read_varint(f);
else if (flags & XMIT_RDEV_MINOR_8_pre30)
rdev_minor = read_byte(f);
else
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(mode)) {
- linkname_len = read_abbrevint30(f) + 1; /* count the '\0' */
+ linkname_len = read_varint30(f) + 1; /* count the '\0' */
if (linkname_len <= 0 || linkname_len > MAXPATHLEN) {
rprintf(FERROR, "overflow: linkname_len=%d\n",
linkname_len - 1);
if (flags & XMIT_HLINKED)
file->flags |= FLAG_HLINKED;
#endif
- file->modtime = modtime;
+ file->modtime = (time_t)modtime;
file->len32 = (uint32)file_length;
if (file_length > 0xFFFFFFFFu && S_ISREG(mode)) {
file->flags |= FLAG_LENGTH64;
if (preserve_acls && !S_ISLNK(mode))
receive_acl(file, f);
#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs)
+ receive_xattr(file, f );
+#endif
if (S_ISREG(mode) || S_ISLNK(mode))
stats.total_size += file_length;
if (save_errno == ENOENT) {
#ifdef SUPPORT_LINKS
/* Avoid "vanished" error if symlink points nowhere. */
- if (copy_links && do_lstat(thisname, &st) == 0
+ if (copy_links && x_lstat(thisname, &st, NULL) == 0
&& S_ISLNK(st.st_mode)) {
io_error |= IOERR_GENERAL;
rprintf(FERROR, "symlink has no referent: %s\n",
int save_mode = file->mode;
file->mode = S_IFDIR; /* Find a directory with our name. */
if (flist_find(dir_flist, file) >= 0
- && do_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) {
+ && x_stat(thisname, &st2, NULL) == 0 && S_ISDIR(st2.st_mode)) {
file->modtime = st2.st_mtime;
file->len32 = 0;
file->mode = st2.st_mode;
int flags, int filter_flags)
{
struct file_struct *file;
-#ifdef SUPPORT_ACLS
+#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS
statx sx;
#endif
return NULL;
}
#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs && f >= 0) {
+ sx.xattr = NULL;
+ if (get_xattr(fname, &sx) < 0)
+ return NULL;
+ }
+#endif
maybe_emit_filelist_progress(flist->count + flist_count_offset);
send_acl(&sx, f);
free_acl(&sx);
}
+#endif
+#ifdef SUPPORT_XATTRS
+ if (preserve_xattrs) {
+ F_XATTR(file) = send_xattr(&sx, f);
+ free_xattr(&sx);
+ }
#endif
}
return file;
disable_buffering = io_start_buffering_out(f);
if (filesfrom_fd >= 0) {
if (argv[0] && !push_dir(argv[0], 0)) {
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(argv[0]));
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(argv[0]), curr_dir);
exit_cleanup(RERR_FILESELECT);
}
use_ff_fd = 1;
} else if (!push_flist_dir(lastdir, lastdir_len)) {
push_error:
io_error |= IOERR_GENERAL;
- rsyserr(FERROR, errno, "push_dir %s failed",
- full_fname(dir));
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(dir), curr_dir);
continue;
}
}