+ file->flags = flags;
+ file->modtime = st.st_mtime;
+ file->len32 = (uint32)st.st_size;
+ if (st.st_size > 0xFFFFFFFFu && S_ISREG(st.st_mode)) {
+ file->flags |= FLAG_LENGTH64;
+ OPT_EXTRA(file, 0)->unum = (uint32)(st.st_size >> 32);
+ }
+ file->mode = st.st_mode;
+ if (preserve_uid)
+ F_UID(file) = st.st_uid;
+ if (preserve_gid)
+ F_GID(file) = st.st_gid;
+
+ if (dirname_len) {
+ file->dirname = lastdir = bp;
+ lastdir_len = dirname_len - 1;
+ memcpy(bp, dirname, dirname_len - 1);
+ bp += dirname_len;
+ bp[-1] = '\0';
+ } else if (dirname)
+ file->dirname = dirname;
+
+#ifdef SUPPORT_LINKS
+ if (linkname_len) {
+ bp = (char*)F_BASENAME(file) + basename_len;
+ memcpy(bp, linkname, linkname_len);
+ }
+#endif
+
+ if (always_checksum && am_sender && S_ISREG(st.st_mode))
+ file_checksum(thisname, tmp_sum, st.st_size);
+
+ file->dir.root = flist_dir;
+
+ /* This code is only used by the receiver when it is building
+ * a list of files for a delete pass. */
+ if (keep_dirlinks && linkname_len && flist) {
+ STRUCT_STAT st2;
+ int save_mode = file->mode;
+ file->mode = S_IFDIR; /* Find a directory with our name. */
+ if (flist_find(the_file_list, file) >= 0
+ && do_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) {
+ file->modtime = st2.st_mtime;
+ file->len32 = 0;
+ file->mode = st2.st_mode;
+ if (preserve_uid)
+ F_UID(file) = st2.st_uid;
+ if (preserve_gid)
+ F_GID(file) = st2.st_gid;
+ } else
+ file->mode = save_mode;
+ }