rprintf(FINFO, "flist->length=%.0f\n",
(double) fptr[i]->length);
rprintf(FINFO, "flist->mode=%#o\n", (int) fptr[i]->mode);
---- orig/flist.c 2005-02-20 00:16:35
+--- orig/flist.c 2005-02-21 10:51:51
+++ flist.c 2005-02-07 21:06:04
-@@ -54,6 +54,7 @@ extern int relative_paths;
+@@ -56,6 +56,7 @@ extern int relative_paths;
extern int implied_dirs;
extern int copy_links;
extern int copy_unsafe_links;
+extern int copy_atimes;
extern int protocol_version;
extern int sanitize_paths;
- extern int deletion_count;
-@@ -143,16 +144,18 @@ static void list_file_entry(struct file_
+ extern int max_delete;
+@@ -148,16 +149,18 @@ static void list_file_entry(struct file_
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(f->mode)) {
safe_fname(f_name(f)));
}
}
-@@ -316,6 +319,7 @@ void send_file_entry(struct file_struct
+@@ -321,6 +324,7 @@ void send_file_entry(struct file_struct
{
unsigned short flags;
static time_t modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
-@@ -331,7 +335,7 @@ void send_file_entry(struct file_struct
+@@ -336,7 +340,7 @@ void send_file_entry(struct file_struct
if (!file) {
write_byte(f, 0);
dev = 0, rdev = makedev(0, 0);
rdev_major = 0;
uid = 0, gid = 0;
-@@ -380,6 +384,12 @@ void send_file_entry(struct file_struct
+@@ -385,6 +389,12 @@ void send_file_entry(struct file_struct
flags |= XMIT_SAME_TIME;
else
modtime = file->modtime;
#ifdef SUPPORT_HARD_LINKS
if (file->link_u.idev) {
-@@ -435,6 +445,8 @@ void send_file_entry(struct file_struct
+@@ -440,6 +450,8 @@ void send_file_entry(struct file_struct
write_int(f, modtime);
if (!(flags & XMIT_SAME_MODE))
write_int(f, to_wire_mode(mode));
if (preserve_uid && !(flags & XMIT_SAME_UID)) {
if (!numeric_ids)
add_uid(uid);
-@@ -508,6 +520,7 @@ static struct file_struct *receive_file_
+@@ -513,6 +525,7 @@ static struct file_struct *receive_file_
unsigned short flags, int f)
{
static time_t modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
-@@ -526,7 +539,7 @@ static struct file_struct *receive_file_
+@@ -531,7 +544,7 @@ static struct file_struct *receive_file_
struct file_struct *file;
if (!flist) {
dev = 0, rdev = makedev(0, 0);
rdev_major = 0;
uid = 0, gid = 0;
-@@ -582,6 +595,8 @@ static struct file_struct *receive_file_
+@@ -587,6 +600,8 @@ static struct file_struct *receive_file_
modtime = (time_t)read_int(f);
if (!(flags & XMIT_SAME_MODE))
mode = from_wire_mode(read_int(f));
if (preserve_uid && !(flags & XMIT_SAME_UID))
uid = (uid_t)read_int(f);
-@@ -632,6 +647,7 @@ static struct file_struct *receive_file_
+@@ -637,6 +652,7 @@ static struct file_struct *receive_file_
file->flags = 0;
file->modtime = modtime;
file->length = file_length;
file->mode = mode;
file->uid = uid;
-@@ -881,6 +897,7 @@ skip_filters:
+@@ -886,6 +902,7 @@ skip_filters:
file->flags = flags;
file->modtime = st.st_mtime;
if (verbose > 1)
rprintf(FINFO, "%s is newer\n", safe_fname(fname));
return;
---- orig/options.c 2005-02-21 07:28:59
-+++ options.c 2005-01-24 01:51:48
+--- orig/options.c 2005-02-21 10:51:52
++++ options.c 2005-02-21 10:53:28
@@ -50,6 +50,7 @@ int preserve_uid = 0;
int preserve_gid = 0;
int preserve_times = 0;
@@ -408,6 +410,7 @@ static struct poptOption long_options[]
{"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 },
{"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 },
- {"omit-dir-times", 'O', POPT_ARG_NONE, &omit_dir_times, 0, 0, 0 },
+ {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 },
+ {"copy-atimes", 'A', POPT_ARG_NONE, ©_atimes, 0, 0, 0 },
{"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 },
{"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 },
{"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
-@@ -1272,6 +1275,8 @@ void server_options(char **args,int *arg
+@@ -1274,6 +1277,8 @@ void server_options(char **args,int *arg
argstr[x++] = 'D';
if (preserve_times)
argstr[x++] = 't';
+ if (copy_atimes)
+ argstr[x++] = 'A';
- if (omit_dir_times && am_sender)
+ if (omit_dir_times == 2 && am_sender)
argstr[x++] = 'O';
if (preserve_perms)
---- orig/rsync.c 2005-02-20 00:02:23
-+++ rsync.c 2005-01-24 01:59:12
+--- orig/rsync.c 2005-02-21 10:51:52
++++ rsync.c 2005-02-21 10:57:03
@@ -27,6 +27,7 @@ extern int dry_run;
extern int daemon_log_format_has_i;
extern int preserve_times;
extern int am_root;
extern int am_server;
extern int am_sender;
-@@ -173,6 +174,7 @@ int set_perms(char *fname,struct file_st
+@@ -56,6 +57,7 @@ int set_perms(char *fname,struct file_st
int updated = 0;
STRUCT_STAT st2;
int change_uid, change_gid;
if (!st) {
if (dry_run)
-@@ -185,18 +187,28 @@ int set_perms(char *fname,struct file_st
+@@ -68,17 +70,27 @@ int set_perms(char *fname,struct file_st
st = &st2;
}
+ if (!copy_atimes || S_ISLNK(st->st_mode) || S_ISDIR(st->st_mode))
+ flags |= PERMS_SKIP_ATIME;
if (!preserve_times || S_ISLNK(st->st_mode)
- || (S_ISDIR(st->st_mode)
- && (omit_dir_times || (make_backups && !backup_dir))))
+ || (S_ISDIR(st->st_mode) && omit_dir_times))
flags |= PERMS_SKIP_MTIME;
+ if (!(flags & PERMS_SKIP_ATIME)
+ && cmp_time(st->st_atime, file->atime) != 0) {
+ deleting = 0;
+ return ret;
+}
---- orig/options.c 2005-02-20 01:12:42
-+++ options.c 2005-02-20 03:09:33
-@@ -121,10 +121,14 @@ int no_detach = 0;
+--- orig/flist.c 2005-02-21 10:51:51
++++ flist.c 2005-02-21 11:00:19
+@@ -67,6 +67,9 @@ extern char *log_format;
+ extern char *backup_dir;
+ extern char *backup_suffix;
+ extern int backup_suffix_len;
++extern char *backup_dir_rm;
++extern char *backup_suffix_rm;
++extern int backup_suffix_rm_len;
+
+ extern char curr_dir[MAXPATHLEN];
+
+@@ -1773,10 +1776,14 @@ struct file_list *get_dirlist(const char
+
+ static int deletion_count = 0; /* used to implement --max-delete */
+
++/* Function now checks if file matches backup- or delete-suffix patterns. */
+ static int is_backup_file(char *fn)
+ {
+ int k = strlen(fn) - backup_suffix_len;
+- return k > 0 && strcmp(fn+k, backup_suffix) == 0;
++ if (k > 0 && strcmp(fn+k, backup_suffix) == 0)
++ return 1;
++ k += backup_suffix_len - backup_suffix_rm_len;
++ return k > 0 && strcmp(fn+k, backup_suffix_rm) == 0;
+ }
+
+
+@@ -1850,8 +1857,8 @@ int delete_file(char *fname, int mode, i
+ if (max_delete && deletion_count >= max_delete)
+ return -1;
+
+- if (make_backups && !backup_dir && !is_backup_file(fname))
+- ok = make_backup(fname);
++ if (make_backups && !backup_dir_rm && !is_backup_file(fname))
++ ok = safe_delete(fname);
+ else
+ ok = do_rmdir(fname) == 0;
+ if (!ok && errno != ENOENT) {
+--- orig/options.c 2005-02-21 10:51:52
++++ options.c 2005-02-21 11:02:45
+@@ -126,10 +126,14 @@ int no_detach
int write_batch = 0;
int read_batch = 0;
int backup_dir_len = 0;
char *tmpdir = NULL;
char *partial_dir = NULL;
char *basis_dir[MAX_BASIS_DIRS+1];
-@@ -134,7 +138,9 @@ char *log_format = NULL;
+@@ -139,7 +143,9 @@ char *log_format = NULL;
char *password_file = NULL;
char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
int rsync_port = 0;
int compare_dest = 0;
int copy_dest = 0;
-@@ -265,6 +271,8 @@ void usage(enum logcode F)
+@@ -270,6 +276,8 @@ void usage(enum logcode F)
rprintf(F," -b, --backup make backups (see --suffix & --backup-dir)\n");
rprintf(F," --backup-dir=DIR make backups into hierarchy based in DIR\n");
rprintf(F," --suffix=SUFFIX set backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
rprintf(F," -u, --update skip files that are newer on the receiver\n");
rprintf(F," --inplace update destination files in-place (SEE MAN PAGE)\n");
rprintf(F," -d, --dirs transfer directories without recursing\n");
-@@ -360,6 +368,7 @@ static struct poptOption long_options[]
+@@ -365,6 +373,7 @@ static struct poptOption long_options[]
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{"version", 0, POPT_ARG_NONE, 0, OPT_VERSION, 0, 0},
{"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
{"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
{"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 },
{"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
-@@ -440,6 +449,7 @@ static struct poptOption long_options[]
+@@ -445,6 +454,7 @@ static struct poptOption long_options[]
{"itemize-changes", 'i', POPT_ARG_NONE, &itemize_changes, 0, 0, 0 },
{"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 },
{"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 },
{"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
{"read-batch", 0, POPT_ARG_STRING, &batch_name, OPT_READ_BATCH, 0, 0 },
{"write-batch", 0, POPT_ARG_STRING, &batch_name, OPT_WRITE_BATCH, 0, 0 },
-@@ -1006,6 +1016,8 @@ int parse_arguments(int *argc, const cha
+@@ -1013,6 +1023,8 @@ int parse_arguments(int *argc, const cha
partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
if (backup_dir)
backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
if (files_from)
files_from = sanitize_path(NULL, files_from, NULL, 0);
}
-@@ -1038,6 +1050,12 @@ int parse_arguments(int *argc, const cha
+@@ -1045,6 +1057,12 @@ int parse_arguments(int *argc, const cha
if (check_filter(elp, backup_dir, 1) < 0)
goto options_rejected;
}
}
if (server_filter_list.head && files_from) {
if (!*files_from)
-@@ -1060,6 +1078,16 @@ int parse_arguments(int *argc, const cha
+@@ -1067,6 +1085,16 @@ int parse_arguments(int *argc, const cha
backup_suffix);
return 0;
}
if (backup_dir) {
backup_dir_len = strlcpy(backup_dir_buf, backup_dir, sizeof backup_dir_buf);
backup_dir_remainder = sizeof backup_dir_buf - backup_dir_len;
-@@ -1081,6 +1109,31 @@ int parse_arguments(int *argc, const cha
+@@ -1088,6 +1116,31 @@ int parse_arguments(int *argc, const cha
"--suffix cannot be a null string without --backup-dir\n");
return 0;
}
+ "--backup-suffix-rm cannot be a null string without --backup-dir-rm\n");
+ return 0;
+ }
+ if (make_backups && !backup_dir)
+ omit_dir_times = 1;
- if (log_format) {
- if (strstr(log_format, "%i") != NULL)
-@@ -1344,6 +1397,10 @@ void server_options(char **args,int *arg
+@@ -1353,6 +1406,10 @@ void server_options(char **args,int *arg
args[ac++] = "--backup-dir";
args[ac++] = backup_dir;
}
/* Only send --suffix if it specifies a non-default value. */
if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) {
-@@ -1352,7 +1409,13 @@ void server_options(char **args,int *arg
+@@ -1361,7 +1418,13 @@ void server_options(char **args,int *arg
goto oom;
args[ac++] = arg;
}
if (am_sender) {
if (delete_excluded)
args[ac++] = "--delete-excluded";
---- orig/rsync.c 2005-02-20 00:02:23
-+++ rsync.c 2005-02-20 03:08:42
-@@ -44,12 +44,19 @@ extern char *backup_dir;
- extern char *log_format;
- extern char *backup_suffix;
- extern int backup_suffix_len;
-+extern char *backup_dir_rm;
-+extern char *backup_suffix_rm;
-+extern int backup_suffix_rm_len;
-
-
-+/* Function now checks if file matches backup or delete suffix patterns */
- static int is_backup_file(char *fn)
- {
- int k = strlen(fn) - backup_suffix_len;
-- return k > 0 && strcmp(fn+k, backup_suffix) == 0;
-+ if (k > 0 && strcmp(fn+k, backup_suffix) == 0)
-+ return 1;
-+ k += backup_suffix_len - backup_suffix_rm_len;
-+ return k > 0 && strcmp(fn+k, backup_suffix_rm) == 0;
- }
-
-
-@@ -82,8 +89,9 @@ int delete_file(char *fname, int mode, i
-
- if (!S_ISDIR(mode)) {
- int ok;
-- if (make_backups && (backup_dir || !is_backup_file(fname)))
-- ok = make_backup(fname);
-+ int backup_file = is_backup_file(fname);
-+ if (make_backups && (backup_dir_rm || !backup_file))
-+ ok = safe_delete(fname);
- else
- ok = robust_unlink(fname) == 0;
- if (ok) {
#define RERR_SIGNAL 20 /* status returned when sent SIGUSR1, SIGINT */
#define RERR_WAITCHILD 21 /* some error returned by waitpid() */
---- orig/flist.c 2005-02-20 00:16:35
-+++ flist.c 2005-02-19 09:31:41
-@@ -62,6 +62,7 @@ extern int orig_umask;
- extern int list_only;
+--- orig/flist.c 2005-02-21 10:51:51
++++ flist.c 2005-02-21 11:04:00
+@@ -63,6 +63,7 @@ extern int force_delete;
+ extern int orig_umask;
+ extern int make_backups;
extern unsigned int curr_dir_len;
- extern char *log_format;
+extern char *fname_convert_cmd;
-
- extern char curr_dir[MAXPATHLEN];
-
-@@ -341,7 +342,10 @@ void send_file_entry(struct file_struct
+ extern char *log_format;
+ extern char *backup_dir;
+ extern char *backup_suffix;
+@@ -346,7 +347,10 @@ void send_file_entry(struct file_struct
io_write_phase = "send_file_entry";
flags = base_flags;
-@@ -557,6 +561,9 @@ static struct file_struct *receive_file_
+@@ -562,6 +566,9 @@ static struct file_struct *receive_file_
strlcpy(lastname, thisname, MAXPATHLEN);
clean_fname(thisname, 0);
if (sanitize_paths)
-@@ -1070,6 +1077,9 @@ struct file_list *send_file_list(int f,
+@@ -1075,6 +1082,9 @@ struct file_list *send_file_list(int f,
start_write = stats.total_written;
gettimeofday(&start_tv, NULL);
flist = flist_new(WITH_HLINK, "send_file_list");
io_start_buffering_out();
-@@ -1252,6 +1262,9 @@ struct file_list *send_file_list(int f,
+@@ -1257,6 +1267,9 @@ struct file_list *send_file_list(int f,
stats.flist_size = stats.total_written - start_write;
stats.num_files = flist->count;
if (verbose > 3)
output_flist(flist, who_am_i());
-@@ -1273,6 +1286,9 @@ struct file_list *recv_file_list(int f)
+@@ -1278,6 +1291,9 @@ struct file_list *recv_file_list(int f)
start_read = stats.total_read;
flist = flist_new(WITH_HLINK, "recv_file_list");
received_flist = flist;
-@@ -1326,6 +1342,9 @@ struct file_list *recv_file_list(int f)
+@@ -1331,6 +1347,9 @@ struct file_list *recv_file_list(int f)
io_error |= read_int(f);
}
static void recv_generator(char *fname, struct file_list *flist,
struct file_struct *file, int ndx,
int f_out, int f_out_name)
---- orig/log.c 2005-02-20 00:02:23
+--- orig/log.c 2005-02-21 07:28:59
+++ log.c 2004-07-03 20:18:02
@@ -62,6 +62,7 @@ struct {
{ RERR_STREAMIO , "error in rsync protocol data stream" },
if (dir)
free(dir);
---- orig/options.c 2005-02-20 01:12:42
+--- orig/options.c 2005-02-21 10:51:52
+++ options.c 2005-02-14 02:50:32
-@@ -131,6 +131,7 @@ char *basis_dir[MAX_BASIS_DIRS+1];
+@@ -136,6 +136,7 @@ char *basis_dir[MAX_BASIS_DIRS+1];
char *config_file = NULL;
char *shell_cmd = NULL;
char *log_format = NULL;
char *password_file = NULL;
char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
-@@ -314,6 +315,7 @@ void usage(enum logcode F)
+@@ -319,6 +320,7 @@ void usage(enum logcode F)
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
rprintf(F," -z, --compress compress file data during the transfer\n");
rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
-@@ -423,6 +425,7 @@ static struct poptOption long_options[]
+@@ -428,6 +430,7 @@ static struct poptOption long_options[]
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
{"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
+}
+
+#endif
---- orig/options.c 2005-02-20 01:12:42
+--- orig/options.c 2005-02-21 10:51:52
+++ options.c 2005-02-14 02:52:09
-@@ -134,6 +134,7 @@ char *log_format = NULL;
+@@ -139,6 +139,7 @@ char *log_format = NULL;
char *password_file = NULL;
char *rsync_path = RSYNC_PATH;
char *backup_dir = NULL;
char backup_dir_buf[MAXPATHLEN];
int rsync_port = 0;
int compare_dest = 0;
-@@ -314,6 +315,7 @@ void usage(enum logcode F)
+@@ -319,6 +320,7 @@ void usage(enum logcode F)
rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n");
rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n");
rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n");
rprintf(F," -z, --compress compress file data during the transfer\n");
rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n");
rprintf(F," -f, --filter=RULE add a file-filtering RULE\n");
-@@ -353,7 +355,7 @@ void usage(enum logcode F)
+@@ -358,7 +360,7 @@ void usage(enum logcode F)
enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST,
OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
OPT_REFUSED_BASE = 9000};
static struct poptOption long_options[] = {
-@@ -422,6 +424,7 @@ static struct poptOption long_options[]
+@@ -427,6 +429,7 @@ static struct poptOption long_options[]
{"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 },
{"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 },
{"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 },
{"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 },
/* TODO: Should this take an optional int giving the compression level? */
{"compress", 'z', POPT_ARG_NONE, &do_compression, 0, 0, 0 },
-@@ -853,6 +856,21 @@ int parse_arguments(int *argc, const cha
+@@ -860,6 +863,21 @@ int parse_arguments(int *argc, const cha
basis_dir[basis_dir_cnt++] = (char *)arg;
break;
default:
/* A large opt value means that set_refuse_options()
* turned this option off. */
-@@ -1431,6 +1449,11 @@ void server_options(char **args,int *arg
+@@ -1440,6 +1458,11 @@ void server_options(char **args,int *arg
}
}
if (!log_before_transfer)
log_recv(file, &initial_stats, iflags);
---- orig/rsync.c 2005-02-20 00:02:23
-+++ rsync.c 2005-02-19 09:32:31
-@@ -41,6 +41,7 @@ extern int keep_dirlinks;
+--- orig/rsync.c 2005-02-21 10:51:52
++++ rsync.c 2005-02-21 11:04:36
+@@ -38,6 +38,7 @@ extern int recurse;
+ extern int keep_dirlinks;
extern int make_backups;
extern struct stats stats;
- extern char *backup_dir;
+extern char *link_by_hash_dir;
- extern char *log_format;
- extern char *backup_suffix;
- extern int backup_suffix_len;
-@@ -306,7 +307,12 @@ void finish_transfer(char *fname, char *
+
+
+ /*
+@@ -188,7 +189,12 @@ void finish_transfer(char *fname, char *
rprintf(FINFO, "renaming %s to %s\n",
safe_fname(fnametmp), safe_fname(fname));
}