+void maybe_log_item(struct file_struct *file, int iflags, int itemizing,
+ char *buf)
+{
+ int significant_flags = iflags & SIGNIFICANT_ITEM_FLAGS;
+ int see_item = itemizing && (significant_flags || *buf
+ || (verbose > 1 && log_format_has_i));
+ int local_change = iflags & ITEM_LOCAL_CHANGE && significant_flags;
+ if (am_server) {
+ if (am_daemon && !dry_run && see_item)
+ log_item(file, &stats, iflags, buf);
+ } else if (see_item || local_change || *buf
+ || (S_ISDIR(file->mode) && significant_flags))
+ log_item(file, &stats, iflags, buf);
+}
+
+void log_delete(char *fname, int mode)
+{
+ static struct file_struct file;
+ int len = strlen(fname);
+ char *fmt;
+
+ file.mode = mode;
+ file.basename = fname;
+
+ if (!verbose && !log_format)
+ ;
+ else if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
+ if (S_ISDIR(mode))
+ len++; /* directories include trailing null */
+ send_msg(MSG_DELETED, fname, len);
+ } else {
+ fmt = log_format_has_o_or_i ? log_format : "deleting %n";
+ log_formatted(FCLIENT, fmt, "del.", &file, &stats,
+ ITEM_DELETED, NULL);
+ }
+
+ if (!am_daemon || dry_run || !lp_transfer_logging(module_id))
+ return;