From 18438f0bac84a084cbec8f6960476ea434dea0ea Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Mon, 12 Mar 2007 04:33:30 +0000 Subject: [PATCH] Changed the sending of device major/minor numbers in protocol 30 to take fewer protocol bytes and use one less bit in the XMIT_* flags. --- flist.c | 72 ++++++++++++++++++++++++++++++++++++--------------------- rsync.h | 18 +++++++-------- 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/flist.c b/flist.c index 33b37b01..a2bbc919 100644 --- a/flist.c +++ b/flist.c @@ -383,8 +383,8 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) flags |= XMIT_SAME_RDEV_MAJOR; else rdev_major = major(rdev); - if ((uint32)minor(rdev) <= 0xFFu) - flags |= XMIT_RDEV_MINOR_IS_SMALL; + if (protocol_version < 30 && (uint32)minor(rdev) <= 0xFFu) + flags |= XMIT_RDEV_MINOR_8_pre30; } } else if (protocol_version < 28) rdev = MAKEDEV(0, 0); @@ -484,19 +484,27 @@ static void send_file_entry(int f, struct file_struct *file, int ndx) if (!(flags & XMIT_SAME_MODE)) write_int(f, to_wire_mode(mode)); if (preserve_uid && !(flags & XMIT_SAME_UID)) { - write_abbrevint30(f, uid); - if (flags & XMIT_USER_NAME_FOLLOWS) { - int len = strlen(user_name); - write_byte(f, len); - write_buf(f, user_name, len); + if (protocol_version < 30) + write_int(f, uid); + else { + write_abbrevint(f, uid); + if (flags & XMIT_USER_NAME_FOLLOWS) { + int len = strlen(user_name); + write_byte(f, len); + write_buf(f, user_name, len); + } } } if (preserve_gid && !(flags & XMIT_SAME_GID)) { - write_abbrevint30(f, gid); - if (flags & XMIT_GROUP_NAME_FOLLOWS) { - int len = strlen(group_name); - write_byte(f, len); - write_buf(f, group_name, len); + if (protocol_version < 30) + write_int(f, gid); + else { + write_abbrevint(f, gid); + if (flags & XMIT_GROUP_NAME_FOLLOWS) { + int len = strlen(group_name); + write_byte(f, len); + write_buf(f, group_name, len); + } } } if ((preserve_devices && IS_DEVICE(mode)) @@ -506,8 +514,10 @@ 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_int(f, major(rdev)); - if (flags & XMIT_RDEV_MINOR_IS_SMALL) + write_abbrevint30(f, major(rdev)); + if (protocol_version >= 30) + write_abbrevint(f, minor(rdev)); + else if (flags & XMIT_RDEV_MINOR_8_pre30) write_byte(f, minor(rdev)); else write_int(f, minor(rdev)); @@ -662,18 +672,26 @@ static struct file_struct *recv_file_entry(struct file_list *flist, mode = tweak_mode(mode, chmod_modes); if (preserve_uid && !(flags & XMIT_SAME_UID)) { - uid = (uid_t)read_abbrevint30(f); - if (flags & XMIT_USER_NAME_FOLLOWS) - uid = recv_user_name(f, uid); - else if (inc_recurse && am_root && !numeric_ids) - uid = match_uid(uid); + if (protocol_version < 30) + uid = (uid_t)read_int(f); + else { + uid = (uid_t)read_abbrevint(f); + if (flags & XMIT_USER_NAME_FOLLOWS) + uid = recv_user_name(f, uid); + else if (inc_recurse && am_root && !numeric_ids) + uid = match_uid(uid); + } } if (preserve_gid && !(flags & XMIT_SAME_GID)) { - gid = (gid_t)read_abbrevint30(f); - if (flags & XMIT_GROUP_NAME_FOLLOWS) - gid = recv_group_name(f, gid); - else if (inc_recurse && (!am_root || !numeric_ids)) - gid = match_gid(gid); + if (protocol_version < 30) + gid = (gid_t)read_int(f); + else { + gid = (gid_t)read_abbrevint(f); + if (flags & XMIT_GROUP_NAME_FOLLOWS) + gid = recv_group_name(f, gid); + else if (inc_recurse && (!am_root || !numeric_ids)) + gid = match_gid(gid); + } } if ((preserve_devices && IS_DEVICE(mode)) @@ -684,8 +702,10 @@ static struct file_struct *recv_file_entry(struct file_list *flist, } else { uint32 rdev_minor; if (!(flags & XMIT_SAME_RDEV_MAJOR)) - rdev_major = read_int(f); - if (flags & XMIT_RDEV_MINOR_IS_SMALL) + rdev_major = read_abbrevint30(f); + if (protocol_version >= 30) + rdev_minor = read_abbrevint(f); + else if (flags & XMIT_RDEV_MINOR_8_pre30) rdev_minor = read_byte(f); else rdev_minor = read_int(f); diff --git a/rsync.h b/rsync.h index b0b4bef5..46a4a8a6 100644 --- a/rsync.h +++ b/rsync.h @@ -42,20 +42,20 @@ #define XMIT_TOP_DIR (1<<0) #define XMIT_SAME_MODE (1<<1) -#define XMIT_EXTENDED_FLAGS (1<<2) -#define XMIT_SAME_RDEV_pre28 XMIT_EXTENDED_FLAGS /* protocols < 28 */ +#define XMIT_SAME_RDEV_pre28 (1<<2) /* protocols 20 - 27 */ +#define XMIT_EXTENDED_FLAGS (1<<2) /* protocols 28 - NOW */ #define XMIT_SAME_UID (1<<3) #define XMIT_SAME_GID (1<<4) #define XMIT_SAME_NAME (1<<5) #define XMIT_LONG_NAME (1<<6) #define XMIT_SAME_TIME (1<<7) -#define XMIT_SAME_RDEV_MAJOR (1<<8) -#define XMIT_HLINKED (1<<9) -#define XMIT_SAME_DEV_pre30 (1<<10) /* protocols < 30 */ -#define XMIT_HLINK_FIRST (1<<10) /* protocols >= 30 */ -#define XMIT_RDEV_MINOR_IS_SMALL (1<<11) -#define XMIT_USER_NAME_FOLLOWS (1<<12) /* protocols >= 30 */ -#define XMIT_GROUP_NAME_FOLLOWS (1<<13) /* protocols >= 30 */ +#define XMIT_SAME_RDEV_MAJOR (1<<8) /* protocols 28 - NOW */ +#define XMIT_HLINKED (1<<9) /* protocols 28 - NOW */ +#define XMIT_SAME_DEV_pre30 (1<<10) /* protocols 28 - 29 */ +#define XMIT_USER_NAME_FOLLOWS (1<<10) /* protocols 30 - NOW */ +#define XMIT_RDEV_MINOR_8_pre30 (1<<11) /* protocols 28 - 29 */ +#define XMIT_GROUP_NAME_FOLLOWS (1<<11) /* protocols 30 - NOW */ +#define XMIT_HLINK_FIRST (1<<12) /* protocols 30 - NOW */ /* These flags are used in the live flist data. */ -- 2.34.1