X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0e5665d3abcfad22b94727ba8a71ecb6a79b33b3..6d4ecad122887af92dc1363c9e0d4cca542bf2f5:/generator.c diff --git a/generator.c b/generator.c index e645d21f..88abe9c9 100644 --- a/generator.c +++ b/generator.c @@ -69,6 +69,7 @@ extern int ignore_timeout; extern int protocol_version; extern int fuzzy_basis; extern int always_checksum; +extern int checksum_len; extern char *partial_dir; extern char *basis_dir[]; extern int compare_dest; @@ -93,6 +94,10 @@ extern struct filter_list_struct server_filter_list; static int deletion_count = 0; /* used to implement --max-delete */ +/* For calling delete_file() */ +#define DEL_FORCE_RECURSE (1<<1) /* recurse even w/o --force */ +#define DEL_TERSE (1<<3) + static int is_backup_file(char *fn) { @@ -102,8 +107,7 @@ static int is_backup_file(char *fn) /* Delete a file or directory. If DEL_FORCE_RECURSE is set in the flags, or if - * force_delete is set, this will delete recursively as long as DEL_NO_RECURSE - * is not set in the flags. + * force_delete is set, this will delete recursively. * * Note that fname must point to a MAXPATHLEN buffer if the mode indicates it's * a directory! (The buffer is used for recursion, but returned unchanged.) @@ -137,8 +141,7 @@ static int delete_item(char *fname, int mode, int flags) return -1; } - zap_dir = (flags & DEL_FORCE_RECURSE || (force_delete && recurse)) - && !(flags & DEL_NO_RECURSE); + zap_dir = flags & DEL_FORCE_RECURSE || (force_delete && recurse); if ((max_delete && ++deletion_count > max_delete) || (dry_run && zap_dir)) { ok = 0; @@ -307,7 +310,7 @@ static void do_delete_pass(struct file_list *flist) delete_in_dir(flist, fbuf, file); } - //delete_in_dir(NULL, NULL, NULL); + delete_in_dir(NULL, NULL, NULL); if (do_progress && !am_server) rprintf(FINFO, " \r"); @@ -384,8 +387,7 @@ static int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st) if (always_checksum && S_ISREG(st->st_mode)) { char sum[MD4_SUM_LENGTH]; file_checksum(fn, sum, st->st_size); - return memcmp(sum, file->u.sum, protocol_version < 21 ? 2 - : MD4_SUM_LENGTH) == 0; + return memcmp(sum, file->u.sum, checksum_len) == 0; } if (size_only) @@ -659,7 +661,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, S_ISDIR(file->mode)) < 0) { if (S_ISDIR(file->mode)) excluded_below = file->dir.depth; - skipping: + skipping: if (verbose) { rprintf(FINFO, "skipping server-excluded file \"%s\"\n", @@ -1069,6 +1071,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, else if (fnamecmp_type == FNAMECMP_FUZZY) ; else if (unchanged_file(fnamecmp, file, &st)) { + if (partialptr) { + do_unlink(partialptr); + handle_partial_dir(partialptr, PDIR_DELETE); + } if (fnamecmp_type == FNAMECMP_FNAME) { if (itemizing) { itemize(file, ndx, real_ret, &real_st, @@ -1085,7 +1091,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } -prepare_to_open: + prepare_to_open: if (partialptr) { st = partial_st; fnamecmp = partialptr; @@ -1108,7 +1114,7 @@ prepare_to_open: if (fd == -1) { rsyserr(FERROR, errno, "failed to open %s, continuing", full_fname(fnamecmp)); - pretend_missing: + pretend_missing: /* pretend the file didn't exist */ if (preserve_hard_links && file->link_u.links && hard_link_check(file, ndx, fname, statret, &st, @@ -1153,7 +1159,7 @@ prepare_to_open: if (verbose > 2) rprintf(FINFO, "generating and sending sums for %d\n", ndx); -notify_others: + notify_others: write_int(f_out, ndx); if (itemizing) { int iflags = ITEM_TRANSFER;