| /* |
| 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 verbose; |
| extern int am_server; |
| extern int inplace; |
| extern int fuzzy_basis; |
| extern int read_batch; |
| extern int checksum_seed; |
| extern int basis_dir_cnt; |
| extern int prune_empty_dirs; |
| extern int protocol_version; |
| extern char *dest_option; |
| |
| void setup_protocol(int f_out,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 (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 (protocol_version < 29) { |
| if (fuzzy_basis) { |
| rprintf(FERROR, |
| "--fuzzy requires protocol 29 or higher" |
| " (negotiated %d).\n", |
| protocol_version); |
| exit_cleanup(RERR_PROTOCOL); |
| } |
| |
| if (basis_dir_cnt && inplace) { |
| rprintf(FERROR, |
| "%s with --inplace requires protocol 29 or higher" |
| " (negotiated %d).\n", |
| dest_option, protocol_version); |
| exit_cleanup(RERR_PROTOCOL); |
| } |
| |
| if (basis_dir_cnt > 1) { |
| rprintf(FERROR, |
| "Using more than one %s option requires protocol" |
| " 29 or higher (negotiated %d).\n", |
| dest_option, protocol_version); |
| exit_cleanup(RERR_PROTOCOL); |
| } |
| |
| if (prune_empty_dirs) { |
| rprintf(FERROR, |
| "--prune-empty-dirs requires protocol 29 or higher" |
| " (negotiated %d).\n", |
| protocol_version); |
| 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); |
| } |
| } |