X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4fe159a81d1f0c39aaa7f05dbb33b36d231e7c80..3fac9b6e93b595f91108c0f9c6b6f40d14a58618:/compat.c diff --git a/compat.c b/compat.c index 2b72f9ba..1c28c253 100644 --- a/compat.c +++ b/compat.c @@ -21,6 +21,10 @@ #include "rsync.h" +extern int am_server; + +extern int csum_length; + extern int preserve_links; extern int preserve_perms; extern int preserve_devices; @@ -28,6 +32,7 @@ extern int preserve_uid; extern int preserve_gid; extern int preserve_times; extern int always_checksum; +extern int checksum_seed; extern int remote_version; @@ -41,7 +46,7 @@ void send_file_entry_v10(struct file_struct *file,int f) { unsigned char flags; static mode_t last_mode=0; - static dev_t last_dev=0; + static dev_t last_rdev=0; static uid_t last_uid=0; static gid_t last_gid=0; static char lastdir[MAXPATHLEN]=""; @@ -57,7 +62,7 @@ void send_file_entry_v10(struct file_struct *file,int f) flags = FILE_VALID; if (file->mode == last_mode) flags |= SAME_MODE; - if (file->dev == last_dev) flags |= SAME_DEV; + if (file->rdev == last_rdev) flags |= SAME_RDEV; if (file->uid == last_uid) flags |= SAME_UID; if (file->gid == last_gid) flags |= SAME_GID; @@ -82,8 +87,8 @@ void send_file_entry_v10(struct file_struct *file,int f) write_int(f,(int)file->uid); if (preserve_gid && !(flags & SAME_GID)) write_int(f,(int)file->gid); - if (preserve_devices && IS_DEVICE(file->mode) && !(flags & SAME_DEV)) - write_int(f,(int)file->dev); + if (preserve_devices && IS_DEVICE(file->mode) && !(flags & SAME_RDEV)) + write_int(f,(int)file->rdev); #if SUPPORT_LINKS if (preserve_links && S_ISLNK(file->mode)) { @@ -93,11 +98,11 @@ void send_file_entry_v10(struct file_struct *file,int f) #endif if (always_checksum) { - write_buf(f,file->sum,SUM_LENGTH); + write_buf(f,file->sum,csum_length); } last_mode = file->mode; - last_dev = file->dev; + last_rdev = file->rdev; last_uid = file->uid; last_gid = file->gid; p = strrchr(file->name,'/'); @@ -116,7 +121,7 @@ void receive_file_entry_v10(struct file_struct *file, unsigned char flags,int f) { static mode_t last_mode=0; - static dev_t last_dev=0; + static dev_t last_rdev=0; static uid_t last_uid=0; static gid_t last_gid=0; static char lastdir[MAXPATHLEN]=""; @@ -146,7 +151,7 @@ void receive_file_entry_v10(struct file_struct *file, if (preserve_gid) file->gid = (flags & SAME_GID) ? last_gid : (gid_t)read_int(f); if (preserve_devices && IS_DEVICE(file->mode)) - file->dev = (flags & SAME_DEV) ? last_dev : (dev_t)read_int(f); + file->rdev = (flags & SAME_RDEV) ? last_rdev : (dev_t)read_int(f); #if SUPPORT_LINKS if (preserve_links && S_ISLNK(file->mode)) { @@ -159,10 +164,10 @@ void receive_file_entry_v10(struct file_struct *file, #endif if (always_checksum) - read_buf(f,file->sum,SUM_LENGTH); + read_buf(f,file->sum,csum_length); last_mode = file->mode; - last_dev = file->dev; + last_rdev = file->rdev; last_uid = file->uid; last_gid = file->gid; p = strrchr(file->name,'/'); @@ -178,8 +183,24 @@ void receive_file_entry_v10(struct file_struct *file, -void setup_protocol(void) +void setup_protocol(int f_out,int f_in) { + if (am_server) { + remote_version = read_int(f_in); + write_int(f_out,PROTOCOL_VERSION); + write_flush(f_out); + } else { + write_int(f_out,PROTOCOL_VERSION); + write_flush(f_out); + remote_version = read_int(f_in); + } + + if (remote_version < MIN_PROTOCOL_VERSION || + remote_version > MAX_PROTOCOL_VERSION) { + fprintf(FERROR,"protocol version mismatch - is your shell clean?\n"); + exit_cleanup(1); + } + if (remote_version == 10) { send_file_entry = send_file_entry_v10; receive_file_entry = receive_file_entry_v10; @@ -187,5 +208,16 @@ void setup_protocol(void) send_file_entry = send_file_entry_v11; receive_file_entry = receive_file_entry_v11; } + + if (remote_version >= 12) { + if (am_server) { + checksum_seed = time(NULL); + write_int(f_out,checksum_seed); + } else { + checksum_seed = read_int(f_in); + } + } + + checksum_init(); }