Mention the year 2007 in the copyright declarations.
[rsync/rsync.git] / rsync.h
diff --git a/rsync.h b/rsync.h
index 524011a..3cf5dfa 100644 (file)
--- a/rsync.h
+++ b/rsync.h
@@ -2,7 +2,7 @@
  * Copyright (C) 1996, 2000 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
  * Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
- * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #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)
+#define XMIT_USER_NAME_FOLLOWS (1<<12) /* protocols >= 30 */
+#define XMIT_GROUP_NAME_FOLLOWS (1<<13) /* protocols >= 30 */
 
 /* These flags are used in the live flist data. */
 
 #define FLAG_TOP_DIR (1<<0)    /* sender/receiver/generator */
-#define FLAG_SENT (1<<1)       /* sender/generator */
+#define FLAG_FILE_SENT (1<<1)  /* sender/receiver/generator */
+#define FLAG_DIR_CHANGED (1<<1)        /* generator */
 #define FLAG_XFER_DIR (1<<2)   /* sender/receiver/generator */
 #define FLAG_MOUNT_DIR (1<<3)  /* sender/generator */
 #define FLAG_MISSING_DIR (1<<4)        /* generator */
 #define FLAG_HLINK_DONE (1<<8) /* receiver/generator */
 #define FLAG_LENGTH64 (1<<9)   /* sender/receiver/generator */
 
+/* These flags are passed to functions but not stored. */
+
+#define FLAG_DIVERT_DIRS (1<<16)/* sender */
+
 #define BITS_SET(val,bits) (((val) & (bits)) == (bits))
 #define BITS_SETnUNSET(val,onbits,offbits) (((val) & ((onbits)|(offbits))) == (onbits))
 #define BITS_EQUAL(b1,b2,mask) (((unsigned)(b1) & (unsigned)(mask)) \
@@ -179,12 +186,19 @@ enum msgcode {
        MSG_ERROR=FERROR, MSG_INFO=FINFO, /* remote logging */
        MSG_LOG=FLOG, MSG_CLIENT=FCLIENT, MSG_SOCKERR=FSOCKERR, /* sibling logging */
        MSG_REDO=9,     /* reprocess indicated flist index */
+       MSG_FLIST=20,   /* extra file list over sibling socket */
+       MSG_FLIST_EOF=21,/* we've transmitted all the file lists */
+       MSG_IO_ERROR=22,/* the sending side had an I/O error */
+       MSG_NOOP=42,    /* a do-nothing message */
        MSG_SUCCESS=100,/* successfully updated indicated flist index */
        MSG_DELETED=101,/* successfully deleted a file on receiving side */
+       MSG_NO_SEND=102,/* sender failed to open a file we wanted */
        MSG_DONE=86     /* current phase is done */
 };
 
 #define NDX_DONE -1
+#define NDX_FLIST_EOF -2
+#define NDX_FLIST_OFFSET -101
 
 #include "errcode.h"
 
@@ -216,6 +230,9 @@ enum msgcode {
 #ifdef HAVE_STRINGS_H
 # include <strings.h>
 #endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
@@ -355,11 +372,30 @@ enum msgcode {
 #define schar char
 #endif
 
+#ifndef int16
+#if SIZEOF_INT16_T == 2
+# define int16 int16_t
+#else
+# define int16 short
+#endif
+#endif
+
+#ifndef uint16
+#if SIZEOF_UINT16_T == 2
+# define uint16 uint16_t
+#else
+# define uint16 unsigned int16
+#endif
+#endif
+
 /* Find a variable that is either exactly 32-bits or longer.
  * If some code depends on 32-bit truncation, it will need to
  * take special action in a "#if SIZEOF_INT32 > 4" section. */
 #ifndef int32
-#if SIZEOF_INT == 4
+#if SIZEOF_INT32_T == 4
+# define int32 int32_t
+# define SIZEOF_INT32 4
+#elif SIZEOF_INT == 4
 # define int32 int
 # define SIZEOF_INT32 4
 #elif SIZEOF_LONG == 4
@@ -382,7 +418,11 @@ enum msgcode {
 #endif
 
 #ifndef uint32
-#define uint32 unsigned int32
+#if SIZEOF_UINT32_T == 4
+# define uint32 uint32_t
+#else
+# define uint32 unsigned int32
+#endif
 #endif
 
 #if SIZEOF_OFF_T == 8 || !SIZEOF_OFF64_T || !defined HAVE_STRUCT_STAT64
@@ -400,7 +440,10 @@ enum msgcode {
  * to ensure that any code that really requires a 64-bit integer has
  * it (e.g. the checksum code uses two 32-bit integers for its 64-bit
  * counter). */
-#if SIZEOF_LONG == 8
+#if SIZEOF_INT64_T == 8
+# define int64 int64_t
+# define SIZEOF_INT64 8
+#elif SIZEOF_LONG == 8
 # define int64 long
 # define SIZEOF_INT64 8
 #elif SIZEOF_INT == 8
@@ -511,15 +554,15 @@ union file_extras {
 };
 
 struct file_struct {
-       const char *dirname;         /* The dir info inside the transfer */
-       time_t modtime;              /* When the item was last modified */
-       uint32 len32;                /* Lowest 32 bits of the file's length */
-       unsigned short mode;         /* The item's type and permissions */
-       unsigned short flags;        /* The FLAG_* bits for this item */
-       const char basename[1];      /* The basename (AKA filename) follows */
+       const char *dirname;    /* The dir info inside the transfer */
+       time_t modtime;         /* When the item was last modified */
+       uint32 len32;           /* Lowest 32 bits of the file's length */
+       uint16 mode;            /* The item's type and permissions */
+       uint16 flags;           /* The FLAG_* bits for this item */
+       const char basename[1]; /* The basename (AKA filename) follows */
 };
 
-extern int flist_extra_cnt;
+extern int file_extra_cnt;
 extern int preserve_uid;
 extern int preserve_gid;
 
@@ -529,7 +572,7 @@ extern int preserve_gid;
 #define SUM_EXTRA_CNT ((MD4_SUM_LENGTH + EXTRA_LEN - 1) / EXTRA_LEN)
 
 #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 OPT_EXTRA(f,bump) ((union file_extras*)(f) - file_extra_cnt - 1 - (bump))
 
 #define LEN64_BUMP(f) ((f)->flags & FLAG_LENGTH64 ? 1 : 0)
 #define HLINK_BUMP(f) (F_IS_HLINKED(f) ? 1 : 0)
@@ -552,12 +595,14 @@ extern int preserve_gid;
 #define F_DEPTH(f) REQ_EXTRA(f, 1)->num
 
 /* When the associated option is on, all entries will have these present: */
-#define F_UID(f) REQ_EXTRA(f, preserve_uid)->unum
-#define F_GID(f) REQ_EXTRA(f, preserve_gid)->unum
+#define F_OWNER(f) REQ_EXTRA(f, preserve_uid)->unum
+#define F_GROUP(f) REQ_EXTRA(f, preserve_gid)->unum
 
 /* These items are per-entry optional and mutally exclusive: */
 #define F_HL_GNUM(f) OPT_EXTRA(f, LEN64_BUMP(f))->num
 #define F_HL_PREV(f) OPT_EXTRA(f, LEN64_BUMP(f))->num
+#define F_DIRDEV_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + 2 - 1)->unum)
+#define F_DIRNODE_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + 3 - 1)->num)
 
 /* This optional item might follow an F_HL_*() item.
  * (Note: a device doesn't need to check LEN64_BUMP(f).) */
@@ -570,12 +615,20 @@ extern int preserve_gid;
 /* Some utility defines: */
 #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)
 
+#define F_UID(f) ((uid_t)F_OWNER(f))
+#define F_GID(f) ((gid_t)F_GROUP(f))
+
 #define DEV_MAJOR(a) (a)[0]
 #define DEV_MINOR(a) (a)[1]
 
+#define DIR_PARENT(a) (a)[0]
+#define DIR_FIRST_CHILD(a) (a)[1]
+#define DIR_NEXT_SIBLING(a) (a)[2]
+
 /*
  * Start the flist array at FLIST_START entries and grow it
  * by doubling until FLIST_LINEAR then grow by FLIST_LINEAR
@@ -595,11 +648,17 @@ extern int preserve_gid;
 #define FILE_EXTENT    (256 * 1024)
 #define HLINK_EXTENT   (128 * 1024)
 
+#define FLIST_TEMP     (1<<1)
+
 struct file_list {
+       struct file_list *next, *prev;
        struct file_struct **files;
        alloc_pool_t file_pool;
        int count, malloced;
        int low, high; /* 0-relative index values excluding empties */
+       int ndx_start; /* the start offset for inc_recurse mode */
+       int parent_ndx; /* dir_flist index of parent directory */
+       int in_progress, to_redo;
 };
 
 #define SUMFLG_SAME_OFFSET     (1<<0)