- if (ok) {
- if (!(flags & DEL_TERSE))
- log_delete(fname, mode);
---- old/options.c
-+++ new/options.c
-@@ -48,6 +48,7 @@ int copy_links = 0;
- int preserve_links = 0;
- int preserve_hard_links = 0;
++#endif
++ *flags_p = flags;
+
+ if (sscanf(bp, "%x ", &mode) != 1) {
+ invalid_data:
+@@ -434,15 +460,15 @@ static int read_delay_line(char *buf, int *own_flag_p)
+
+ static void do_delayed_deletions(char *delbuf)
+ {
+- int mode, own_flag;
++ int mode, flags;
+
+ if (deldelay_fd >= 0) {
+ if (deldelay_cnt && !flush_delete_delay())
+ return;
+ lseek(deldelay_fd, 0, 0);
+ }
+- while ((mode = read_delay_line(delbuf, &own_flag)) >= 0)
+- delete_item(delbuf, mode, own_flag | DEL_RECURSE);
++ while ((mode = read_delay_line(delbuf, &flags)) >= 0)
++ delete_item(delbuf, mode, DEL_RECURSE | flags);
+ if (deldelay_fd >= 0)
+ close(deldelay_fd);
+ }
+@@ -505,6 +531,9 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
+ }
+ if (flist_find(cur_flist, fp) < 0) {
+ int flags = DEL_RECURSE
++#ifdef SUPPORT_FLAGS
++ | (fileflags_ndx && F_FFLAGS(fp) & NODELETE_FLAGS ? DEL_AN_IMMUTABLE : 0)
++#endif
+ | (!uid_ndx || (uid_t)F_OWNER(fp) == our_uid ? DEL_OWNED_BY_US : 0);
+ f_name(fp, delbuf);
+ if (delete_during == 2) {
+@@ -1329,6 +1358,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+
+ if (statret == 0 && sx.st.st_uid == our_uid)
+ del_opts |= DEL_OWNED_BY_US;
++#ifdef SUPPORT_FLAGS
++ if (statret == 0 && fileflags_ndx && sx.st.st_flags & NODELETE_FLAGS)
++ del_opts |= DEL_AN_IMMUTABLE;
++#endif
+
+ if (is_dir) {
+ if (!implied_dirs && file->flags & FLAG_IMPLIED_DIR)
+diff --git a/options.c b/options.c
+--- a/options.c
++++ b/options.c
+@@ -52,6 +52,7 @@ int preserve_hard_links = 0;
+ int preserve_acls = 0;
+ int preserve_xattrs = 0;