X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/18438f0bac84a084cbec8f6960476ea434dea0ea..25c2a6ac0e1f45a0c4fcc425ddaa5e9027a868ac:/flist.c diff --git a/flist.c b/flist.c index a2bbc919..bd0ad00e 100644 --- a/flist.c +++ b/flist.c @@ -85,9 +85,9 @@ static dev_t tmp_rdev; #ifdef SUPPORT_HARD_LINKS static int64 tmp_dev, tmp_ino; #endif -static char tmp_sum[MD4_SUM_LENGTH]; +static char tmp_sum[MAX_DIGEST_LEN]; -static char empty_sum[MD4_SUM_LENGTH]; +static char empty_sum[MAX_DIGEST_LEN]; static int flist_count_offset; /* for --delete --progress */ static void clean_flist(struct file_list *flist, int strip_root, int no_dups); @@ -99,7 +99,9 @@ void init_flist(void) rprintf(FINFO, "FILE_STRUCT_LEN=%d, EXTRA_LEN=%d\n", (int)FILE_STRUCT_LEN, (int)EXTRA_LEN); } - checksum_len = protocol_version < 21 ? 2 : MD4_SUM_LENGTH; + checksum_len = protocol_version < 21 ? 2 + : protocol_version < 30 ? MD4_DIGEST_LEN + : MD5_DIGEST_LEN; } static int show_filelist_p(void) @@ -1334,7 +1336,7 @@ void send_extra_file_list(int f, int at_least) int64 start_write; int future_cnt, save_io_error = io_error; - if (send_dir_ndx < 0) + if (flist_eof) return; /* Keep sending data until we have the requested number of @@ -1489,18 +1491,6 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) && (len == 1 || fbuf[len-2] == '/'); } - if (link_stat(fbuf, &st, copy_dirlinks) != 0) { - io_error |= IOERR_GENERAL; - rsyserr(FERROR, errno, "link_stat %s failed", - full_fname(fbuf)); - continue; - } - - if (S_ISDIR(st.st_mode) && !xfer_dirs) { - rprintf(FINFO, "skipping directory %s\n", fbuf); - continue; - } - dir = NULL; if (!relative_paths) { @@ -1587,6 +1577,18 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (fn != fbuf) memmove(fbuf, fn, len + 1); + if (link_stat(fbuf, &st, copy_dirlinks) != 0) { + io_error |= IOERR_GENERAL; + rsyserr(FERROR, errno, "link_stat %s failed", + full_fname(fbuf)); + continue; + } + + if (S_ISDIR(st.st_mode) && !xfer_dirs) { + rprintf(FINFO, "skipping directory %s\n", fbuf); + continue; + } + if (implied_dirs && (p=strrchr(fbuf,'/')) && p != fbuf) { /* Send the implied directories at the start of the * source spec, so we get their permissions right. */ @@ -1687,14 +1689,15 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (inc_recurse) { add_dirs_to_tree(-1, 0, dir_flist->count - 1); - if (file_total == 1) { + if (send_dir_ndx < 0) { + write_ndx(f, NDX_FLIST_EOF); + flist_eof = 1; + } + else if (file_total == 1) { /* If we're creating incremental file-lists and there * was just 1 item in the first file-list, send 1 more * file-list to check if this is a 1-file xfer. */ - if (send_dir_ndx < 0) - write_ndx(f, NDX_DONE); - else - send_extra_file_list(f, 1); + send_extra_file_list(f, 1); } } @@ -1803,7 +1806,7 @@ void recv_additional_file_list(int f) { struct file_list *flist; int ndx = read_ndx(f); - if (ndx == NDX_DONE) { + if (ndx == NDX_FLIST_EOF) { flist_eof = 1; change_local_filter_dir(NULL, 0, 0); } else {