Make idev, hlink and file_struct + strings use allocation
[rsync/rsync.git] / rsync.h
diff --git a/rsync.h b/rsync.h
index b1adc0c..37a5d53 100644 (file)
--- a/rsync.h
+++ b/rsync.h
@@ -24,6 +24,7 @@
 
 #define BLOCK_SIZE 700
 #define RSYNC_RSH_ENV "RSYNC_RSH"
+#define RSYNC_RSH_IO_ENV "RSYNC_RSH_IO"
 
 #define RSYNC_NAME "rsync"
 #define RSYNCD_SYSCONF "/etc/rsyncd.conf"
    incompatible with older versions :-( */
 #define CHAR_OFFSET 0
 
+/* These flags are only used during the flist transfer. */
 
-#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)
+#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
@@ -69,7 +80,7 @@
  * unlikely to begin by sending a byte between MIN_PROTOCL_VERSION and
  * MAX_PROTOCOL_VERSION. */
 
-#define MIN_PROTOCOL_VERSION 17
+#define MIN_PROTOCOL_VERSION 19
 #define OLD_PROTOCOL_VERSION 20
 #define MAX_PROTOCOL_VERSION 40
 
 #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"
 
 #include "config.h"
 
-/* The default RSYNC_RSH is always set in config.h, either to "remsh",
- * "rsh", or otherwise something specified by the user.  HAVE_REMSH
- * controls parameter munging for HP/UX, etc. */
+/* The default RSYNC_RSH is always set in config.h. */
 
 #include <sys/types.h>
 
@@ -231,6 +252,7 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 };
 
 #include <assert.h>
 
+#include "lib/pool_alloc.h"
 
 #define BOOL int
 
@@ -363,47 +385,81 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 };
 #define IN_LOOPBACKNET 127
 #endif
 
-struct file_struct {
-       unsigned flags;
-       time_t modtime;
-       OFF_T length;
-       mode_t mode;
+#define GID_NONE (gid_t) -1
+
+#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;    /* this item MUST remain last */
 };
 
+/*
+ * Start the flist array at FLIST_START entries and grow it
+ * by doubling until FLIST_LINEAR then grow by FLIST_LINEAR
+ */
+#define FLIST_START    (32 * 1024)
+#define FLIST_LINEAR   (FLIST_START * 512)
+/*
+ * Extent size for allocation pools A minimum size of 128KB
+ * is needed to mmap them so that freeing will release the
+ * space to the OS.
+ *
+ * Larger sizes reduce leftover fragments and speed free calls
+ * (when they happen) Smaller sizes increase the chance of
+ * freed allocations freeing whole extents.
+ */
 
-#define ARENA_SIZE     (32 * 1024)
+#define FILE_EXTENT    (256 * 1024)
+#define HLINK_EXTENT   (128 * 1024)
 
-struct string_area {
-       char *base;
-       char *end;
-       char *current;
-       struct string_area *next;
-};
+#define WITH_HLINK     1
+#define WITHOUT_HLINK  0
 
 struct file_list {
        int count;
        int malloced;
+       alloc_pool_t file_pool;
+       alloc_pool_t hlink_pool;
        struct file_struct **files;
-       struct string_area *string_area;
 };
 
 struct sum_buf {
        OFF_T offset;           /**< offset in file of this chunk */
-       int len;                /**< length of chunk of file */
+       unsigned int len;       /**< length of chunk of file */
        int i;                  /**< index of this chunk */
        uint32 sum1;            /**< simple checksum */
        char sum2[SUM_LENGTH];  /**< checksum  */
@@ -412,9 +468,9 @@ struct sum_buf {
 struct sum_struct {
        OFF_T flength;          /**< total file length */
        size_t count;           /**< how many chunks */
-       size_t remainder;       /**< flength % block_length */
-       size_t blength;         /**< block_length */
-       size_t s2length;        /**< sum2_length */
+       unsigned int blength;   /**< block_length */
+       unsigned int remainder; /**< flength % block_length */
+       int s2length;           /**< sum2_length */
        struct sum_buf *sums;   /**< points to info for each chunk */
 };
 
@@ -454,6 +510,7 @@ struct stats {
        int flist_size;
        int num_files;
        int num_transferred_files;
+       int current_file_index;
 };
 
 
@@ -668,6 +725,17 @@ size_t strlcat(char *d, const char *s, size_t bufsize);
 
 #define exit_cleanup(code) _exit_cleanup(code, __FILE__, __LINE__)
 
+#ifdef HAVE_GETEUID
+#define MY_UID() geteuid()
+#else
+#define MY_UID() getuid()
+#endif
+
+#ifdef HAVE_GETEGID
+#define MY_GID() getegid()
+#else
+#define MY_GID() getgid()
+#endif
 
 extern int verbose;