extern int preserve_uid;
extern int preserve_gid;
extern int relative_paths;
-@@ -303,6 +304,9 @@ static void send_file_entry(struct file_
+@@ -305,6 +306,9 @@ static void send_file_entry(struct file_
unsigned short flags;
static time_t modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
static uint32 rdev_major;
-@@ -333,6 +337,12 @@ static void send_file_entry(struct file_
+@@ -335,6 +339,12 @@ static void send_file_entry(struct file_
flags |= XMIT_SAME_MODE;
else
mode = file->mode;
if ((preserve_devices && IS_DEVICE(mode))
|| (preserve_specials && IS_SPECIAL(mode))) {
if (protocol_version < 28) {
-@@ -416,6 +426,10 @@ static void send_file_entry(struct file_
+@@ -418,6 +428,10 @@ static void send_file_entry(struct file_
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);
-@@ -483,6 +497,9 @@ static struct file_struct *receive_file_
+@@ -485,6 +499,9 @@ static struct file_struct *receive_file_
{
static time_t modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
static uint32 rdev_major;
-@@ -556,9 +573,12 @@ static struct file_struct *receive_file_
+@@ -558,9 +575,12 @@ 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);
-@@ -609,6 +629,9 @@ static struct file_struct *receive_file_
+@@ -611,6 +631,9 @@ static struct file_struct *receive_file_
file->modtime = modtime;
file->length = file_length;
file->mode = mode;
file->uid = uid;
file->gid = gid;
-@@ -862,6 +885,9 @@ struct file_struct *make_file(char *fnam
+@@ -871,6 +894,9 @@ struct file_struct *make_file(char *fnam
file->modtime = st.st_mtime;
file->length = st.st_size;
file->mode = st.st_mode;
--- old/generator.c
+++ new/generator.c
-@@ -109,6 +109,12 @@ static int is_backup_file(char *fn)
- return k > 0 && strcmp(fn+k, backup_suffix) == 0;
- }
+@@ -98,6 +98,12 @@ int non_perishable_cnt = 0;
+
+ static int deletion_count = 0; /* used to implement --max-delete */
+#ifdef SUPPORT_FLAGS
+#define FILEFLAGS(ff) ff
+#define FILEFLAGS(ff) 0
+#endif
+
+ /* For calling delete_item() and delete_dir_contents(). */
+ #define DEL_RECURSE (1<<1) /* recurse */
+ #define DEL_DIR_IS_EMPTY (1<<2) /* internal delete_FUNCTIONS use only */
+@@ -113,7 +119,6 @@ enum delret {
+ /* Forward declaration for delete_item(). */
+ static enum delret delete_dir_contents(char *fname, int flags);
- /* Delete a file or directory. If DEL_FORCE_RECURSE is set in the flags, or if
- * force_delete is set, this will delete recursively.
-@@ -116,7 +122,7 @@ static int is_backup_file(char *fn)
+-
+ static int is_backup_file(char *fn)
+ {
+ int k = strlen(fn) - backup_suffix_len;
+@@ -126,17 +131,20 @@ static int is_backup_file(char *fn)
* 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.)
*/
--static int delete_item(char *fname, int mode, int flags)
-+static int delete_item(char *fname, int mode, uint32 fileflags, int flags)
+-static enum delret delete_item(char *fname, int mode, char *replace, int flags)
++static enum delret delete_item(char *fname, int mode, uint32 fileflags, char *replace, int flags)
{
- struct file_list *dirlist;
- int j, dlen, zap_dir, ok;
-@@ -127,6 +133,9 @@ static int delete_item(char *fname, int
- if (!S_ISDIR(mode)) {
- if (max_delete && ++deletion_count > max_delete)
- return 0;
-+#ifdef SUPPORT_FLAGS
-+ make_mutable(fname, mode, fileflags);
-+#endif
- if (make_backups && (backup_dir || !is_backup_file(fname)))
- ok = make_backup(fname);
- else
-@@ -151,10 +160,17 @@ static int delete_item(char *fname, int
- ok = 0;
- errno = ENOTEMPTY;
- } else if (make_backups && !backup_dir && !is_backup_file(fname)
-- && !(flags & DEL_FORCE_RECURSE))
-+ && !(flags & DEL_FORCE_RECURSE)) {
-+#ifdef SUPPORT_FLAGS
-+ make_mutable(fname, mode, fileflags);
-+#endif
- ok = make_backup(fname);
-- else
-+ } else {
+ enum delret ret;
+ char *what;
+ int ok;
+
+ if (verbose > 2) {
+- rprintf(FINFO, "delete_item(%s) mode=%o flags=%d\n",
+- fname, mode, flags);
++ rprintf(FINFO, "delete_item(%s) mode=%o fileflags=%o flags=%d\n",
++ fname, mode, fileflags, flags);
+ }
+
+#ifdef SUPPORT_FLAGS
-+ make_mutable(fname, mode, fileflags);
++ make_mutable(fname, mode, fileflags);
+#endif
- ok = do_rmdir(fname) == 0;
-+ }
- if (ok) {
- if (!(flags & DEL_TERSE))
- log_delete(fname, mode);
-@@ -189,7 +205,7 @@ static int delete_item(char *fname, int
- continue;
-
- strlcpy(p, fp->basename, remainder);
-- delete_item(fname, fp->mode, flags & ~DEL_TERSE);
-+ delete_item(fname, fp->mode, FILEFLAGS(fp->fileflags), flags & ~DEL_TERSE);
+ if (S_ISDIR(mode) && !(flags & DEL_DIR_IS_EMPTY)) {
+ ignore_perishable = 1;
+ /* If DEL_RECURSE is not set, this just reports emptiness. */
+@@ -248,7 +256,7 @@ static enum delret delete_dir_contents(c
+ if (S_ISDIR(fp->mode)
+ && delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS)
+ ret = DR_NOT_EMPTY;
+- if (delete_item(fname, fp->mode, NULL, flags) != DR_SUCCESS)
++ if (delete_item(fname, fp->mode, FILEFLAGS(fp->fileflags), NULL, flags) != DR_SUCCESS)
+ ret = DR_NOT_EMPTY;
}
- flist_free(dirlist);
-@@ -279,7 +295,7 @@ static void delete_in_dir(struct file_li
- continue;
+@@ -338,7 +346,7 @@ static void delete_in_dir(struct file_li
+ }
if (flist_find(flist, fp) < 0) {
f_name(fp, delbuf);
-- delete_item(delbuf, fp->mode, DEL_FORCE_RECURSE);
-+ delete_item(delbuf, fp->mode, FILEFLAGS(fp->fileflags), DEL_FORCE_RECURSE);
+- delete_item(delbuf, fp->mode, NULL, DEL_RECURSE);
++ delete_item(delbuf, fp->mode, FILEFLAGS(fp->fileflags), NULL, DEL_RECURSE);
}
}
-@@ -978,7 +994,7 @@ static void recv_generator(char *fname,
+@@ -1036,7 +1044,7 @@ static void recv_generator(char *fname,
+ * we need to delete it. If it doesn't exist, then
* (perhaps recursively) create it. */
- int sr;
if (statret == 0 && !S_ISDIR(st.st_mode)) {
-- if (delete_item(fname, st.st_mode, del_opts) < 0)
-+ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), del_opts) < 0)
+- if (delete_item(fname, st.st_mode, "directory", del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), "directory", del_opts) != 0)
return;
statret = -1;
}
-@@ -1069,7 +1085,7 @@ static void recv_generator(char *fname,
+@@ -1130,7 +1138,7 @@ static void recv_generator(char *fname,
}
/* Not the right symlink (or not a symlink), so
* delete it. */
-- if (delete_item(fname, st.st_mode, del_opts) < 0)
-+ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), del_opts) < 0)
+- if (delete_item(fname, st.st_mode, "symlink", del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), "symlink", del_opts) != 0)
return;
} else if (basis_dir[0] != NULL) {
int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
-@@ -1132,7 +1148,7 @@ static void recv_generator(char *fname,
+@@ -1201,7 +1209,7 @@ static void recv_generator(char *fname,
goto return_with_success;
return;
}
-- if (delete_item(fname, st.st_mode, del_opts) < 0)
-+ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), del_opts) < 0)
+- if (delete_item(fname, st.st_mode, t, del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), t, del_opts) != 0)
return;
} else if (basis_dir[0] != NULL) {
int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &st,
-@@ -1218,7 +1234,7 @@ static void recv_generator(char *fname,
+@@ -1287,7 +1295,7 @@ static void recv_generator(char *fname,
fnamecmp_type = FNAMECMP_FNAME;
if (statret == 0 && !S_ISREG(st.st_mode)) {
-- if (delete_item(fname, st.st_mode, del_opts) != 0)
-+ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), del_opts) != 0)
+- if (delete_item(fname, st.st_mode, "regular file", del_opts) != 0)
++ if (delete_item(fname, st.st_mode, FILEFLAGS(st.st_flags), "regular file", del_opts) != 0)
return;
statret = -1;
stat_errno = ENOENT;