#define XMIT_TOP_DIR (1<<0)
#define XMIT_SAME_MODE (1<<1)
#define XMIT_EXTENDED_FLAGS (1<<2)
-#define XMIT_SAME_RDEV_pre28 XMIT_EXTENDED_FLAGS /* Only in protocols < 28 */
+#define XMIT_SAME_RDEV_pre28 XMIT_EXTENDED_FLAGS /* protocols < 28 */
#define XMIT_SAME_UID (1<<3)
#define XMIT_SAME_GID (1<<4)
#define XMIT_SAME_NAME (1<<5)
#define XMIT_LONG_NAME (1<<6)
#define XMIT_SAME_TIME (1<<7)
#define XMIT_SAME_RDEV_MAJOR (1<<8)
-#define XMIT_HAS_IDEV_DATA (1<<9)
-#define XMIT_SAME_DEV (1<<10)
+#define XMIT_HLINKED (1<<9)
+#define XMIT_SAME_DEV_pre30 (1<<10) /* protocols < 30 */
+#define XMIT_HLINK_FIRST (1<<10) /* protocols >= 30 */
#define XMIT_RDEV_MINOR_IS_SMALL (1<<11)
/* These flags are used in the live flist data. */
int64 dev;
};
+struct idev_node {
+ int64 key;
+ void *data;
+};
+
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
#define GID_NONE ((gid_t)-1)
+union file_extras {
+ uid_t uid; /* The user ID number */
+ uid_t gid; /* The group ID number or GID_NONE */
+ struct idev *idev; /* The hard-link info during matching */
+ int32 num; /* A signed number */
+ uint32 unum; /* An unsigned number */
+};
+
struct file_struct {
- union flist_extras {
- uid_t uid; /* The user ID number */
- uid_t gid; /* The group ID number or GID_NONE */
- struct idev *idev; /* The hard-link info during matching */
- int32 num; /* A signed number */
- uint32 unum; /* An unsigned number */
- } extras[1];
time_t modtime; /* When the item was last modified */
const char *dirname; /* The dir info inside the transfer */
union {
} dir;
uint32 len32; /* Lowest 32 bits of the file's length */
unsigned short mode; /* The item's type and permissions */
- unsigned short flags; /* This item MUST remain last! */
+ unsigned short flags; /* The FLAG_* bits for this item */
+ const char basename[1]; /* The basename (AKA filename) follows */
};
extern int flist_extra_cnt;
extern int preserve_uid;
extern int preserve_gid;
-#define FILE_STRUCT_LEN (offsetof(struct file_struct, flags) \
- + sizeof (unsigned short))
-#define EXTRA_LEN (sizeof (union flist_extras))
+#define FILE_STRUCT_LEN (offsetof(struct file_struct, basename))
+#define EXTRA_LEN (sizeof (union file_extras))
#define SUM_EXTRA_CNT ((MD4_SUM_LENGTH + EXTRA_LEN - 1) / EXTRA_LEN)
-#define REQ_EXTRA(f,ndx) ((f)->extras - (ndx - 1))
-#define OPT_EXTRA(f,bump) ((f)->extras - flist_extra_cnt - (bump))
+#define REQ_EXTRA(f,ndx) ((union file_extras*)(f) - (ndx))
+#define OPT_EXTRA(f,bump) ((union file_extras*)(f) - flist_extra_cnt - 1 - (bump))
#define LEN64_BUMP(f) ((f)->flags & FLAG_LENGTH64 ? 1 : 0)
#define HLINK_BUMP(f) (F_IS_HLINKED(f) ? 1 : 0)
-/* Basename (AKA filename) and length applies to all items */
-#define F_BASENAME(f) ((const char*)(f) + FILE_STRUCT_LEN)
+/* The length applies to all items. */
#if SIZEOF_INT64 < 8
#define F_LENGTH(f) ((int64)(f)->len32)
#else
#endif
/* If there is a symlink string, it is always right after the basename */
-#define F_SYMLINK(f) (F_BASENAME(f) + strlen(F_BASENAME(f)) + 1)
+#define F_SYMLINK(f) ((f)->basename + strlen((f)->basename) + 1)
/* When the associated option is on, all entries will have these present: */
#define F_UID(f) REQ_EXTRA(f, preserve_uid)->uid
/* These items are per-entry optional and mutally exclusive: */
#define F_HL_IDEV(f) OPT_EXTRA(f, LEN64_BUMP(f))->idev
+#define F_HL_GNUM(f) OPT_EXTRA(f, LEN64_BUMP(f))->num
#define F_HL_PREV(f) OPT_EXTRA(f, LEN64_BUMP(f))->num
/* This optional item might follow an F_HL_*() item.
+ SUM_EXTRA_CNT - 1))
/* Some utility defines: */
-#define F_IS_ACTIVE(f) F_BASENAME(f)[0]
+#define F_IS_ACTIVE(f) (f)->basename[0]
#define F_IS_HLINKED(f) ((f)->flags & FLAG_HLINKED)
#define F_HLINK_NOT_FIRST(f) BITS_SETnUNSET((f)->flags, FLAG_HLINKED, FLAG_HLINK_FIRST)
#define F_HLINK_NOT_LAST(f) BITS_SETnUNSET((f)->flags, FLAG_HLINKED, FLAG_HLINK_LAST)