/* Copyright (C) Andrew Tridgell 1996 Copyright (C) Paul Mackerras 1996 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** * @file compat.c * * Compatibility routines for older rsync protocol versions. **/ #include "rsync.h" int remote_protocol = 0; 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; extern int protocol_version; extern int verbose; extern int read_batch; extern int write_batch; void setup_protocol(int f_out,int f_in) { if (remote_protocol == 0) { if (am_server) { remote_protocol = read_int(f_in); write_int(f_out, protocol_version); } else { write_int(f_out, protocol_version); remote_protocol = read_int(f_in); } if (protocol_version > remote_protocol) protocol_version = remote_protocol; } 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 (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); } }