#include "rsync.h"
+extern int am_server;
+
+extern int csum_length;
+
extern int preserve_links;
extern int preserve_perms;
extern int preserve_devices;
extern int preserve_gid;
extern int preserve_times;
extern int always_checksum;
+extern int checksum_seed;
extern int remote_version;
{
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]="";
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;
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)) {
#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,'/');
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]="";
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)) {
#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,'/');
-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;
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();
}