|
|
| version 1.1, 2012/02/17 15:09:30 | version 1.1.1.1.2.1, 2013/07/22 00:20:20 |
|---|---|
| Line 60 extern int non_perishable_cnt; | Line 60 extern int non_perishable_cnt; |
| extern int prune_empty_dirs; | extern int prune_empty_dirs; |
| extern int copy_links; | extern int copy_links; |
| extern int copy_unsafe_links; | extern int copy_unsafe_links; |
| extern int detect_renamed; | |
| extern int protocol_version; | extern int protocol_version; |
| extern int sanitize_paths; | extern int sanitize_paths; |
| extern int munge_symlinks; | extern int munge_symlinks; |
| Line 120 static int64 tmp_dev = -1, tmp_ino; | Line 121 static int64 tmp_dev = -1, tmp_ino; |
| #endif | #endif |
| static char tmp_sum[MAX_DIGEST_LEN]; | static char tmp_sum[MAX_DIGEST_LEN]; |
| struct file_list the_fattr_list; | |
| static char empty_sum[MAX_DIGEST_LEN]; | static char empty_sum[MAX_DIGEST_LEN]; |
| static int flist_count_offset; /* for --delete --progress */ | static int flist_count_offset; /* for --delete --progress */ |
| static int dir_count = 0; | static int dir_count = 0; |
| Line 287 static int is_excluded(const char *fname, int is_dir, | Line 290 static int is_excluded(const char *fname, int is_dir, |
| return 0; | return 0; |
| } | } |
| static int fattr_compare(struct file_struct **file1, struct file_struct **file2) | |
| { | |
| struct file_struct *f1 = *file1; | |
| struct file_struct *f2 = *file2; | |
| int64 len1 = F_LENGTH(f1), len2 = F_LENGTH(f2); | |
| int diff; | |
| if (!f1->basename || !S_ISREG(f1->mode) || !len1) { | |
| if (!f2->basename || !S_ISREG(f2->mode) || !len2) | |
| return 0; | |
| return 1; | |
| } | |
| if (!f2->basename || !S_ISREG(f2->mode) || !len2) | |
| return -1; | |
| /* Don't use diff for values that are longer than an int. */ | |
| if (len1 != len2) | |
| return len1 < len2 ? -1 : 1; | |
| if (always_checksum) { | |
| diff = u_memcmp(F_SUM(f1), F_SUM(f2), checksum_len); | |
| if (diff) | |
| return diff; | |
| } else if (f1->modtime != f2->modtime) | |
| return f1->modtime < f2->modtime ? -1 : 1; | |
| diff = u_strcmp(f1->basename, f2->basename); | |
| if (diff) | |
| return diff; | |
| if (f1->dirname == f2->dirname) | |
| return 0; | |
| if (!f1->dirname) | |
| return -1; | |
| if (!f2->dirname) | |
| return 1; | |
| return u_strcmp(f1->dirname, f2->dirname); | |
| } | |
| static void send_directory(int f, struct file_list *flist, | static void send_directory(int f, struct file_list *flist, |
| char *fbuf, int len, int flags); | char *fbuf, int len, int flags); |
| Line 2426 struct file_list *recv_file_list(int f) | Line 2468 struct file_list *recv_file_list(int f) |
| recv_id_list(f, flist); | recv_id_list(f, flist); |
| flist_sort_and_clean(flist, relative_paths); | flist_sort_and_clean(flist, relative_paths); |
| if (detect_renamed) { | |
| int j = flist->used; | |
| the_fattr_list.used = j; | |
| the_fattr_list.files = new_array(struct file_struct *, j); | |
| if (!the_fattr_list.files) | |
| out_of_memory("recv_file_list"); | |
| memcpy(the_fattr_list.files, flist->files, | |
| j * sizeof (struct file_struct *)); | |
| qsort(the_fattr_list.files, j, | |
| sizeof the_fattr_list.files[0], (int (*)())fattr_compare); | |
| the_fattr_list.low = 0; | |
| while (j-- > 0) { | |
| struct file_struct *fp = the_fattr_list.files[j]; | |
| if (fp->basename && S_ISREG(fp->mode) && F_LENGTH(fp)) | |
| break; | |
| } | |
| the_fattr_list.high = j; | |
| } | |
| if (protocol_version < 30) { | if (protocol_version < 30) { |
| /* Recv the io_error flag */ | /* Recv the io_error flag */ |