+ if (flags & XMIT_HAS_IDEV_DATA)
+ idev_len = sizeof (struct idev);
+ else
+#endif
+ idev_len = 0;
+
+ sum_len = always_checksum && S_ISREG(mode) ? MD4_SUM_LENGTH : 0;
+ file_struct_len = idev_len? sizeof file[0] : min_file_struct_len;
+
+ alloc_len = file_struct_len + dirname_len + basename_len
+ + linkname_len + sum_len + idev_len;
+ if (!(bp = new_array(char, alloc_len)))
+ out_of_memory("receive_file_entry");
+ file = *fptr = (struct file_struct *)bp;
+ memset(bp, 0, min_file_struct_len);
+ bp += file_struct_len;
+
+ file->flags = flags & XMIT_TOP_DIR ? FLAG_TOP_DIR : 0;
+ file->modtime = modtime;
+ file->length = file_length;
+ file->mode = mode;
+ file->uid = uid;
+ file->gid = gid;
+
+#if SUPPORT_HARD_LINKS
+ if (idev_len) {
+ file->link_u.idev = (struct idev *)bp;
+ bp += idev_len;
+ }
+#endif
+
+ 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;
+
+ file->basename = bp;
+ memcpy(bp, basename, basename_len);
+ bp += basename_len;
+
+ if (preserve_devices && IS_DEVICE(mode))
+ file->u.rdev = rdev;
+
+#if SUPPORT_LINKS
+ if (linkname_len) {
+ file->u.link = bp;
+ read_sbuf(f, bp, linkname_len - 1);
+ if (sanitize_paths)
+ sanitize_path(bp, lastdir);
+ bp += linkname_len;
+ }
+#endif
+
+#if SUPPORT_HARD_LINKS
+ if (idev_len) {