X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/fbc0bc4d53b6cffeaa17d96d18f2e87544cc3156..d17e1dd2dae6bfd9e2e147a0dd3039848dd43abc:/rsync.h diff --git a/rsync.h b/rsync.h index d144e3be..bc009582 100644 --- 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" @@ -41,16 +42,23 @@ #define FLAG_DELETE (1<<0) #define SAME_MODE (1<<1) -#define SAME_RDEV (1<<2) +#define EXTENDED_FLAGS (1<<2) +#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 SAME_NAME SAME_DIR #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 26 +#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 @@ -62,12 +70,14 @@ * the old protocol will become the minimum and * compatibility code removed. * - * There are two possible explanations for the limit at thirty: either - * to allow new major-rev versions that do not interoperate with us, - * and (more likely) so that we can detect an attempt to connect rsync - * to a non-rsync server, which is unlikely to begin by sending a byte - * between 15 and 30. */ -#define MIN_PROTOCOL_VERSION 15 + * There are two possible explanations for the limit at + * MAX_PROTOCOL_VERSION: either to allow new major-rev versions that + * do not interoperate with us, and (more likely) so that we can + * detect an attempt to connect rsync to a non-rsync server, which is + * unlikely to begin by sending a byte between MIN_PROTOCL_VERSION and + * MAX_PROTOCOL_VERSION. */ + +#define MIN_PROTOCOL_VERSION 19 #define OLD_PROTOCOL_VERSION 20 #define MAX_PROTOCOL_VERSION 40 @@ -79,10 +89,23 @@ #define MAX_MAP_SIZE (256*1024) #define IO_BUFFER_SIZE (4092) +#define IOERR_GENERAL (1<<0) /* For backward compatibility, this must == 1 */ +#define IOERR_VANISHED (1<<1) + #define MAX_ARGS 1000 #define MPLEX_BASE 7 +#define NO_EXCLUDES 0 +#define SERVER_EXCLUDES 1 +#define ALL_EXCLUDES 2 + +#define MISSING_OK 0 +#define MISSING_FATAL 1 + +#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. */ @@ -92,9 +115,7 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 }; #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 @@ -112,6 +133,10 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 }; #include #endif +#if defined(HAVE_MALLOC_H) && (defined(HAVE_MALLINFO) || !defined(HAVE_STDLIB_H)) +#include +#endif + #ifdef HAVE_SYS_SOCKET_H #include #endif @@ -120,10 +145,6 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 }; #include #endif -#ifdef HAVE_MALLOC_H -#include -#endif - #ifdef TIME_WITH_SYS_TIME #include #include @@ -180,20 +201,10 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 }; #endif #endif -#ifdef HAVE_FNMATCH -#include -#else -#include "lib/fnmatch.h" -#endif - #ifdef HAVE_GLOB_H #include #endif -#ifdef HAVE_MALLOC_H -# include -#endif - /* these are needed for the uid/gid mapping code */ #include #include @@ -267,23 +278,29 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 }; #if HAVE_OFF64_T #define int64 off64_t -#define uint64 unsigned off64_t #elif (SIZEOF_LONG == 8) #define int64 long -#define uint64 unigned long #elif (SIZEOF_INT == 8) #define int64 int -#define uint64 unsigned int #elif HAVE_LONGLONG #define int64 long long -#define uint64 unsigned long long #else /* As long as it gets... */ #define int64 off_t -#define uint64 unsigned off_t #define NO_INT64 #endif +#if (SIZEOF_LONG == 8) +#define uint64 unsigned long +#elif (SIZEOF_INT == 8) +#define uint64 unsigned int +#elif HAVE_LONGLONG +#define uint64 unsigned long long +#else +/* As long as it gets... */ +#define uint64 unsigned off_t +#endif + /* Starting from protocol version 26, we always use 64-bit * ino_t and dev_t internally, even if this platform does not * allow files to have 64-bit inums. That's because the @@ -333,11 +350,17 @@ enum logcode {FNONE=0, FERROR=1, FINFO=2, FLOG=3 }; /* the length of the md4 checksum */ #define MD4_SUM_LENGTH 16 #define SUM_LENGTH 16 +#define SHORT_SUM_LENGTH 2 +#define BLOCKSUM_BIAS 10 #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif +#ifndef NAME_MAX +#define NAME_MAX 255 +#endif + #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif @@ -346,28 +369,45 @@ 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 +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 { @@ -386,7 +426,7 @@ struct file_list { 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 */ @@ -395,24 +435,36 @@ 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 n; /**< block_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 */ }; struct map_struct { - char *p; - int fd,p_size,p_len; - OFF_T file_size, p_offset, p_fd_offset; + char *p; /* Window pointer */ + int fd; /* File Descriptor */ + int p_size; /* Window size at allocation */ + int p_len; /* Window size after fill */ + /* p_size and p_len could be + * consolodated by using a local + * variable in map_ptr() */ + int status; /* first errno from read errors */ + OFF_T file_size; /* File size (from stat) */ + OFF_T p_offset; /* Window start */ + OFF_T p_fd_offset; /* offset of cursor in fd ala lseek */ }; +#define MATCHFLG_WILD (1<<0) /* pattern has '*', '[', and/or '?' */ +#define MATCHFLG_WILD2 (1<<1) /* pattern has '**' */ +#define MATCHFLG_WILD2_PREFIX (1<<2) /* pattern starts with '**' */ +#define MATCHFLG_ABS_PATH (1<<3) /* path-match on absolute path */ struct exclude_struct { char *pattern; - int regular_exp; - int fnmatch_flags; + int match_flags; int include; int directory; - int local; + int slash_cnt; }; struct stats { @@ -425,6 +477,7 @@ struct stats { int flist_size; int num_files; int num_transferred_files; + int current_file_index; }; @@ -439,6 +492,7 @@ static inline int flist_up(struct file_list *flist, int i) #include "byteorder.h" #include "lib/mdfour.h" +#include "lib/wildmatch.h" #include "lib/permstring.h" #include "lib/addrinfo.h" @@ -453,11 +507,13 @@ int asprintf(char **ptr, const char *format, ...); int vasprintf(char **ptr, const char *format, va_list ap); #endif -#if !defined(HAVE_VSNPRINTF) && !defined(HAVE_C99_VSNPRINTF) -int vsnprintf (char *str, size_t count, const char *fmt, va_list args); +#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF) +#define vsnprintf rsync_vsnprintf +int vsnprintf(char *str, size_t count, const char *fmt, va_list args); #endif -#if !defined(HAVE_SNPRINTF) && !defined(HAVE_C99_VSNPRINTF) +#if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF) +#define snprintf rsync_snprintf int snprintf(char *str,size_t count,const char *fmt,...); #endif @@ -597,6 +653,10 @@ extern int errno; #endif +/* Convenient wrappers for malloc and realloc. Use them. */ +#define new(type) ((type *)malloc(sizeof(type))) +#define new_array(type, num) ((type *)_new_array(sizeof(type), (num))) +#define realloc_array(ptr, type, num) ((type *)_realloc_array((ptr), sizeof(type), (num))) /* use magic gcc attributes to catch format errors */ void rprintf(enum logcode , const char *, ...) @@ -613,6 +673,10 @@ void rsyserr(enum logcode, int, const char *, ...) #define inet_ntoa rep_inet_ntoa #endif +/* Make sure that the O_BINARY flag is defined. */ +#ifndef O_BINARY +#define O_BINARY 0 +#endif #ifndef HAVE_STRLCPY size_t strlcpy(char *d, const char *s, size_t bufsize);