incompatible with older versions :-( */
#define CHAR_OFFSET 0
-
-#define FLAG_DELETE (1<<0)
-#define SAME_MODE (1<<1)
-#define SAME_RDEV (1<<2)
-#define SAME_UID (1<<3)
-#define SAME_GID (1<<4)
-#define SAME_DIR (1<<5)
-#define SAME_NAME SAME_DIR
-#define LONG_NAME (1<<6)
-#define SAME_TIME (1<<7)
+/* These flags are only used during the flist transfer. */
+
+#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_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_HIGH_RDEV (1<<8)
+#define XMIT_HAS_IDEV_DATA (1<<9)
+#define XMIT_SAME_DEV (1<<10)
+
+/* These flags are used in the live flist data. */
+
+#define FLAG_TOP_DIR (1<<0)
+#define FLAG_HLINK_EOL (1<<1) /* generator only */
+#define FLAG_MOUNT_POINT (1<<2) /* sender only */
/* update this if you make incompatible changes */
-#define PROTOCOL_VERSION 27
+#define PROTOCOL_VERSION 28
/* We refuse to interoperate with versions that are not in this range.
* Note that we assume we'll work with later versions: the onus is on
#define ADD_INCLUDE 1
#define ADD_EXCLUDE 0
-/* Log values. I *think* what these mean is: FLOG goes to the server
- * logfile; FERROR and FINFO try to end up on the client, with
- * different levels of filtering. */
-enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 };
+#define FULL_FLUSH 1
+#define NORMAL_FLUSH 0
+
+/* Log-message categories. FLOG is only used on the daemon side to
+ * output messages to the log file. */
+enum logcode { FERROR=1, FINFO=2, FLOG=3 };
+
+/* Messages types that are sent over the message channel. The logcode
+ * values must all be present here with identical numbers. */
+enum msgcode {
+ MSG_DATA=0, /* raw data on the multiplexed stream */
+ MSG_ERROR=FERROR, MSG_INFO=FINFO, MSG_LOG=FLOG, /* remote logging */
+ MSG_REDO=4, /* reprocess indicated flist index */
+ MSG_DONE=5, /* current phase is done */
+};
#include "errcode.h"
#define GID_NONE (gid_t) -1
-struct file_struct {
- unsigned flags;
- time_t modtime;
- OFF_T length;
- mode_t mode;
+#define HL_CHECK_MASTER 0
+#define HL_SKIP 1
+struct hlink {
+ int hlindex;
+ struct file_struct *next;
+};
+
+struct idev {
INO64_T inode;
- /** Device this file lives upon */
DEV64_T dev;
+};
- /** If this is a device node, the device number. */
- DEV64_T rdev;
- uid_t uid;
- gid_t gid;
+#define F_DEV link_u.idev->dev
+#define F_INODE link_u.idev->inode
+
+#define F_HLINDEX link_u.links->hlindex
+#define F_NEXT link_u.links->next
+
+struct file_struct {
+ time_t modtime;
+ OFF_T length;
+ mode_t mode;
+ union {
+ DEV64_T rdev; /* The device number, if this is a device */
+ char *sum; /* Only a normal file can have a checksum */
+ char *link; /* Holds symlink string, if a symlink */
+ } u;
+ union {
+ struct idev *idev;
+ struct hlink *links;
+ } link_u;
char *basename;
char *dirname;
char *basedir;
- char *link;
- char *sum;
+ uid_t uid;
+ gid_t gid;
+ uchar flags;
};
-
#define ARENA_SIZE (32 * 1024)
struct string_area {
int flist_size;
int num_files;
int num_transferred_files;
+ int current_file_index;
};