extern struct stats stats;
extern int verbose;
-extern int do_progress;
extern int am_root;
extern int am_server;
extern int am_daemon;
extern int am_sender;
+extern int do_progress;
extern int always_checksum;
extern int module_id;
extern int ignore_errors;
extern int numeric_ids;
-
extern int recurse;
extern int xfer_dirs;
-extern char curr_dir[MAXPATHLEN];
-extern unsigned int curr_dir_len;
-extern char *backup_dir;
-extern char *backup_suffix;
extern int filesfrom_fd;
-
extern int one_file_system;
extern int keep_dirlinks;
extern int preserve_links;
extern int preserve_gid;
extern int relative_paths;
extern int implied_dirs;
-extern int make_backups;
-extern int backup_suffix_len;
extern int copy_links;
extern int copy_unsafe_links;
extern int protocol_version;
extern int sanitize_paths;
+extern int deletion_count;
extern int max_delete;
extern int orig_umask;
extern int list_only;
+extern unsigned int curr_dir_len;
+extern char *log_format;
+
+extern char curr_dir[MAXPATHLEN];
extern struct filter_list_struct filter_list;
extern struct filter_list_struct server_filter_list;
static unsigned int file_struct_len;
static struct file_list *received_flist, *sorting_flist;
static dev_t filesystem_dev; /* used to implement -x */
-static int deletion_count = 0; /* used to implement --max-delete */
static void clean_flist(struct file_list *flist, int strip_root, int no_dups);
static void output_flist(struct file_list *flist, const char *whose_list);
char fname[MAXPATHLEN];
int l1, l2;
- if (f == -1)
+ if (f < 0)
return;
if (!file) {
struct file_struct *file;
char fbuf[MAXPATHLEN];
- if (!(file = make_file(fname, flist, ALL_FILTERS)))
+ file = make_file(fname, flist, f == -2 ? SERVER_FILTERS : ALL_FILTERS);
+ if (!file)
return;
maybe_emit_filelist_progress(flist);
* or a number >= 0 indicating how many levels of recursion we will allow.
* This function is normally called by the sender, but the receiving side
* also calls it from delete_in_dir() with f set to -1 so that we just
- * construct the file list in memory without sending it over the wire. */
+ * construct the file list in memory without sending it over the wire. Also,
+ * get_dirlist() calls this with f set to -2, which indicates that local
+ * filter rules should be ignored. */
static void send_directory(int f, struct file_list *flist,
char *fbuf, unsigned int len)
{
clean_flist(flist, relative_paths, 1);
- if (f != -1) {
+ if (f >= 0) {
/* Now send the uid/gid list. This was introduced in
* protocol version 15 */
recv_uid_list(f, flist);
}
-static int is_backup_file(char *fn)
+struct file_list *get_dirlist(const char *dirname, int ignore_filter_rules)
{
- int k = strlen(fn) - backup_suffix_len;
- return k > 0 && strcmp(fn+k, backup_suffix) == 0;
+ struct file_list *dirlist;
+ char dirbuf[MAXPATHLEN];
+ int dlen;
+ int save_recurse = recurse;
+
+ dlen = strlcpy(dirbuf, dirname, MAXPATHLEN);
+ if (dlen >= MAXPATHLEN)
+ return NULL;
+
+ dirlist = flist_new(WITHOUT_HLINK, "get_dirlist");
+ recurse = 0;
+ send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirbuf, dlen);
+ recurse = save_recurse;
+
+ return dirlist;
}
void delete_missing(struct file_list *full_list, struct file_list *dir_list,
const char *dirname)
{
- int i, mode;
+ char fbuf[MAXPATHLEN];
+ int i;
if (max_delete && deletion_count >= max_delete)
return;
for (i = dir_list->count; i--; ) {
if (!dir_list->files[i]->basename)
continue;
- mode = dir_list->files[i]->mode;
if (flist_find(full_list, dir_list->files[i]) < 0) {
- char *f = f_name(dir_list->files[i]);
- if (make_backups && (backup_dir || !is_backup_file(f))
- && !S_ISDIR(mode)) {
- make_backup(f);
- if (verbose) {
- rprintf(FINFO, "deleting %s\n",
- safe_fname(f));
- }
- } else if (S_ISDIR(mode))
- delete_file(f, DEL_DIR | DEL_FORCE_RECURSE);
- else
- delete_file(f, 0);
- deletion_count++;
- if (max_delete && deletion_count >= max_delete)
+ char *fn = f_name_to(dir_list->files[i], fbuf);
+ int mode = dir_list->files[i]->mode;
+ int dflag = S_ISDIR(mode) ? DEL_FORCE_RECURSE : 0;
+ if (delete_file(fn, mode, dflag) < 0)
break;
}
}