1/* 2 * Compatibility routines for older rsync protocol versions. 3 * 4 * Copyright (C) Andrew Tridgell 1996 5 * Copyright (C) Paul Mackerras 1996 6 * Copyright (C) 2004, 2005, 2006 Wayne Davison 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License along 19 * with this program; if not, write to the Free Software Foundation, Inc., 20 * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 21 */ 22 23#include "rsync.h" 24 25int remote_protocol = 0; 26 27extern int verbose; 28extern int am_server; 29extern int inplace; 30extern int fuzzy_basis; 31extern int read_batch; 32extern int checksum_seed; 33extern int basis_dir_cnt; 34extern int prune_empty_dirs; 35extern int protocol_version; 36extern char *dest_option; 37 38void setup_protocol(int f_out,int f_in) 39{ 40 if (remote_protocol == 0) { 41 if (!read_batch) 42 write_int(f_out, protocol_version); 43 remote_protocol = read_int(f_in); 44 if (protocol_version > remote_protocol) 45 protocol_version = remote_protocol; 46 } 47 if (read_batch && remote_protocol > protocol_version) { 48 rprintf(FERROR, "The protocol version in the batch file is too new (%d > %d).\n", 49 remote_protocol, protocol_version); 50 exit_cleanup(RERR_PROTOCOL); 51 } 52 53 if (verbose > 3) { 54 rprintf(FINFO, "(%s) Protocol versions: remote=%d, negotiated=%d\n", 55 am_server? "Server" : "Client", remote_protocol, protocol_version); 56 } 57 if (remote_protocol < MIN_PROTOCOL_VERSION 58 || remote_protocol > MAX_PROTOCOL_VERSION) { 59 rprintf(FERROR,"protocol version mismatch -- is your shell clean?\n"); 60 rprintf(FERROR,"(see the rsync man page for an explanation)\n"); 61 exit_cleanup(RERR_PROTOCOL); 62 } 63 if (remote_protocol < OLD_PROTOCOL_VERSION) { 64 rprintf(FINFO,"%s is very old version of rsync, upgrade recommended.\n", 65 am_server? "Client" : "Server"); 66 } 67 if (protocol_version < MIN_PROTOCOL_VERSION) { 68 rprintf(FERROR, "--protocol must be at least %d on the %s.\n", 69 MIN_PROTOCOL_VERSION, am_server? "Server" : "Client"); 70 exit_cleanup(RERR_PROTOCOL); 71 } 72 if (protocol_version > PROTOCOL_VERSION) { 73 rprintf(FERROR, "--protocol must be no more than %d on the %s.\n", 74 PROTOCOL_VERSION, am_server? "Server" : "Client"); 75 exit_cleanup(RERR_PROTOCOL); 76 } 77 78 if (protocol_version < 29) { 79 if (fuzzy_basis) { 80 rprintf(FERROR, 81 "--fuzzy requires protocol 29 or higher" 82 " (negotiated %d).\n", 83 protocol_version); 84 exit_cleanup(RERR_PROTOCOL); 85 } 86 87 if (basis_dir_cnt && inplace) { 88 rprintf(FERROR, 89 "%s with --inplace requires protocol 29 or higher" 90 " (negotiated %d).\n", 91 dest_option, protocol_version); 92 exit_cleanup(RERR_PROTOCOL); 93 } 94 95 if (basis_dir_cnt > 1) { 96 rprintf(FERROR, 97 "Using more than one %s option requires protocol" 98 " 29 or higher (negotiated %d).\n", 99 dest_option, protocol_version); 100 exit_cleanup(RERR_PROTOCOL); 101 } 102 103 if (prune_empty_dirs) { 104 rprintf(FERROR, 105 "--prune-empty-dirs requires protocol 29 or higher" 106 " (negotiated %d).\n", 107 protocol_version); 108 exit_cleanup(RERR_PROTOCOL); 109 } 110 } 111 112 if (am_server) { 113 if (!checksum_seed) 114 checksum_seed = time(NULL); 115 write_int(f_out, checksum_seed); 116 } else { 117 checksum_seed = read_int(f_in); 118 } 119} 120