#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
+ 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)