X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/25c2a6ac0e1f45a0c4fcc425ddaa5e9027a868ac..f31514adb780899d886df63edd79ac3d48363f2f:/flist.c diff --git a/flist.c b/flist.c index bd0ad00e..aa1efac3 100644 --- a/flist.c +++ b/flist.c @@ -43,6 +43,7 @@ extern int one_file_system; 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; @@ -337,8 +338,8 @@ int push_flist_dir(const char *dir, int len) 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; } @@ -470,13 +471,13 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) 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; } @@ -489,7 +490,7 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) 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); @@ -501,7 +502,7 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) 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); @@ -516,9 +517,9 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) 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 @@ -530,7 +531,7 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) 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 @@ -596,7 +597,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, l1 = read_byte(f); if (flags & XMIT_LONG_NAME) - l2 = read_abbrevint30(f); + l2 = read_varint30(f); else l2 = read_byte(f); @@ -635,7 +636,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, 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", @@ -677,7 +678,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, 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) @@ -688,7 +689,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, 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)) @@ -704,9 +705,9 @@ static struct file_struct *recv_file_entry(struct file_list *flist, } 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 @@ -720,7 +721,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist, #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); @@ -888,6 +889,10 @@ static struct file_struct *recv_file_entry(struct file_list *flist, 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; @@ -1160,7 +1165,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, int flags, int filter_flags) { struct file_struct *file; -#ifdef SUPPORT_ACLS +#if defined SUPPORT_ACLS || defined SUPPORT_XATTRS statx sx; #endif @@ -1179,6 +1184,13 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, 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); @@ -1191,6 +1203,12 @@ static struct file_struct *send_file_name(int f, struct file_list *flist, 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; @@ -1439,8 +1457,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) 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; @@ -1568,8 +1586,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) } 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; } }