#define FLAG_DELETE (1<<0)
#define SAME_MODE (1<<1)
#define EXTENDED_FLAGS (1<<2)
-#define OLD_SAME_RDEV EXTENDED_FLAGS
+#define SAME_RDEV_pre28 EXTENDED_FLAGS /* Only use in protocols < 28 */
#define SAME_UID (1<<3)
#define SAME_GID (1<<4)
#define SAME_DIR (1<<5)
#define LONG_NAME (1<<6)
#define SAME_TIME (1<<7)
#define SAME_HIGH_RDEV (1<<8)
+#define HAS_INODE_DATA (1<<9)
+#define SAME_DEV (1<<10)
+
+/* What flags are relevant after the transfer of the flist is complete? */
+#define LIVE_FLAGS FLAG_DELETE
/* 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 {
- time_t modtime;
- OFF_T length;
- mode_t mode;
+struct hlink {
+ struct file_struct *head;
+ 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_HEAD link_u.links->head
+#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;
unsigned short flags;
};
-
#define ARENA_SIZE (32 * 1024)
struct string_area {
int flist_size;
int num_files;
int num_transferred_files;
+ int current_file_index;
};