X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f855a7d01ab8401a307bb02cdcdee546df3e2423..a41a1e87182410ec6c2eeaddb0cd961ec554c404:/compat.c diff --git a/compat.c b/compat.c index ee9e0520..e90fa83a 100644 --- a/compat.c +++ b/compat.c @@ -17,57 +17,68 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* compatability routines for older rsync protocol versions */ +/** + * @file compat.c + * + * Compatibility routines for older rsync protocol versions. + **/ #include "rsync.h" -extern int am_server; - -extern int preserve_links; -extern int preserve_perms; -extern int preserve_devices; -extern int preserve_uid; -extern int preserve_gid; -extern int preserve_times; -extern int always_checksum; -extern int checksum_seed; +int remote_protocol = 0; - -extern int remote_version; extern int verbose; +extern int am_server; +extern int am_sender; +extern int read_batch; +extern int checksum_seed; +extern int protocol_version; void setup_protocol(int f_out,int f_in) { - if (remote_version == 0) { - if (am_server) { - remote_version = read_int(f_in); - write_int(f_out,PROTOCOL_VERSION); - } else { - write_int(f_out,PROTOCOL_VERSION); - remote_version = read_int(f_in); - } + if (remote_protocol == 0) { + if (!read_batch) + write_int(f_out, protocol_version); + remote_protocol = read_int(f_in); + if (protocol_version > remote_protocol) + protocol_version = remote_protocol; + } + if (read_batch && remote_protocol > protocol_version) { + rprintf(FERROR, "The protocol version in the batch file is too new (%d > %d).\n", + remote_protocol, protocol_version); + exit_cleanup(RERR_PROTOCOL); } - if (remote_version < MIN_PROTOCOL_VERSION || - remote_version > MAX_PROTOCOL_VERSION) { + if (verbose > 3) { + rprintf(FINFO, "(%s) Protocol versions: remote=%d, negotiated=%d\n", + am_server? "Server" : "Client", remote_protocol, protocol_version); + } + if (remote_protocol < MIN_PROTOCOL_VERSION + || remote_protocol > MAX_PROTOCOL_VERSION) { rprintf(FERROR,"protocol version mismatch - is your shell clean?\n"); rprintf(FERROR,"(see the rsync man page for an explanation)\n"); exit_cleanup(RERR_PROTOCOL); - } - - if (verbose > 2) - rprintf(FINFO, "local_version=%d remote_version=%d\n", - PROTOCOL_VERSION, remote_version); - - if (remote_version >= 12) { - if (am_server) { + } + if (remote_protocol < OLD_PROTOCOL_VERSION) { + rprintf(FINFO,"%s is very old version of rsync, upgrade recommended.\n", + am_server? "Client" : "Server"); + } + if (protocol_version < MIN_PROTOCOL_VERSION) { + rprintf(FERROR, "--protocol must be at least %d on the %s.\n", + MIN_PROTOCOL_VERSION, am_server? "Server" : "Client"); + exit_cleanup(RERR_PROTOCOL); + } + if (protocol_version > PROTOCOL_VERSION) { + rprintf(FERROR, "--protocol must be no more than %d on the %s.\n", + PROTOCOL_VERSION, am_server? "Server" : "Client"); + exit_cleanup(RERR_PROTOCOL); + } + + if (am_server) { + if (!checksum_seed) checksum_seed = time(NULL); - write_int(f_out,checksum_seed); - } else { - checksum_seed = read_int(f_in); - } + write_int(f_out, checksum_seed); + } else { + checksum_seed = read_int(f_in); } - - checksum_init(); } -