version 1.1, 2012/02/17 15:09:30
|
version 1.1.1.4, 2021/03/17 00:32:36
|
Line 2
|
Line 2
|
* Copyright (C) 1996, 2000 Andrew Tridgell |
* Copyright (C) 1996, 2000 Andrew Tridgell |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2003-2008 Wayne Davison | * Copyright (C) 2003-2020 Wayne Davison |
* |
* |
* This program is free software; you can redistribute it and/or modify |
* 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 |
* it under the terms of the GNU General Public License as published by |
Line 20
|
Line 20
|
|
|
#define False 0 |
#define False 0 |
#define True 1 |
#define True 1 |
|
#define Unset (-1) /* Our BOOL values are always an int. */ |
|
|
#define BLOCK_SIZE 700 |
#define BLOCK_SIZE 700 |
#define RSYNC_RSH_ENV "RSYNC_RSH" |
#define RSYNC_RSH_ENV "RSYNC_RSH" |
Line 52
|
Line 53
|
#define XMIT_SAME_NAME (1<<5) |
#define XMIT_SAME_NAME (1<<5) |
#define XMIT_LONG_NAME (1<<6) |
#define XMIT_LONG_NAME (1<<6) |
#define XMIT_SAME_TIME (1<<7) |
#define XMIT_SAME_TIME (1<<7) |
|
|
#define XMIT_SAME_RDEV_MAJOR (1<<8) /* protocols 28 - now (devices only) */ |
#define XMIT_SAME_RDEV_MAJOR (1<<8) /* protocols 28 - now (devices only) */ |
#define XMIT_NO_CONTENT_DIR (1<<8) /* protocols 30 - now (dirs only) */ |
#define XMIT_NO_CONTENT_DIR (1<<8) /* protocols 30 - now (dirs only) */ |
#define XMIT_HLINKED (1<<9) /* protocols 28 - now */ | #define XMIT_HLINKED (1<<9) /* protocols 28 - now (non-dirs) */ |
#define XMIT_SAME_DEV_pre30 (1<<10) /* protocols 28 - 29 */ |
#define XMIT_SAME_DEV_pre30 (1<<10) /* protocols 28 - 29 */ |
#define XMIT_USER_NAME_FOLLOWS (1<<10) /* protocols 30 - now */ |
#define XMIT_USER_NAME_FOLLOWS (1<<10) /* protocols 30 - now */ |
#define XMIT_RDEV_MINOR_8_pre30 (1<<11) /* protocols 28 - 29 */ | #define XMIT_RDEV_MINOR_8_pre30 (1<<11) /* protocols 28 - 29 */ |
#define XMIT_GROUP_NAME_FOLLOWS (1<<11) /* protocols 30 - now */ |
#define XMIT_GROUP_NAME_FOLLOWS (1<<11) /* protocols 30 - now */ |
#define XMIT_HLINK_FIRST (1<<12) /* protocols 30 - now (HLINKED files only) */ |
#define XMIT_HLINK_FIRST (1<<12) /* protocols 30 - now (HLINKED files only) */ |
#define XMIT_IO_ERROR_ENDLIST (1<<12) /* protocols 31*- now (w/XMIT_EXTENDED_FLAGS) (also protocol 30 w/'f' compat flag) */ |
#define XMIT_IO_ERROR_ENDLIST (1<<12) /* protocols 31*- now (w/XMIT_EXTENDED_FLAGS) (also protocol 30 w/'f' compat flag) */ |
|
#define XMIT_MOD_NSEC (1<<13) /* protocols 31 - now */ |
|
#define XMIT_SAME_ATIME (1<<14) /* any protocol - restricted by command-line option */ |
|
#define XMIT_UNUSED_15 (1<<15) /* unused flag bit */ |
|
|
|
/* The following XMIT flags require an rsync that uses a varint for the flag values */ |
|
|
|
#define XMIT_SAME_FLAGS (1<<16) /* any protocol - restricted by command-line option */ |
|
#define XMIT_CRTIME_EQ_MTIME (1<<17) /* any protocol - restricted by command-line option */ |
|
|
/* These flags are used in the live flist data. */ |
/* These flags are used in the live flist data. */ |
|
|
#define FLAG_TOP_DIR (1<<0) /* sender/receiver/generator */ |
#define FLAG_TOP_DIR (1<<0) /* sender/receiver/generator */ |
Line 81
|
Line 91
|
#define FLAG_LENGTH64 (1<<9) /* sender/receiver/generator */ |
#define FLAG_LENGTH64 (1<<9) /* sender/receiver/generator */ |
#define FLAG_SKIP_GROUP (1<<10) /* receiver/generator */ |
#define FLAG_SKIP_GROUP (1<<10) /* receiver/generator */ |
#define FLAG_TIME_FAILED (1<<11)/* generator */ |
#define FLAG_TIME_FAILED (1<<11)/* generator */ |
|
#define FLAG_MOD_NSEC (1<<12) /* sender/receiver/generator */ |
|
|
/* These flags are passed to functions but not stored. */ |
/* These flags are passed to functions but not stored. */ |
|
|
#define FLAG_DIVERT_DIRS (1<<16) /* sender, but must be unique */ |
#define FLAG_DIVERT_DIRS (1<<16) /* sender, but must be unique */ |
|
#define FLAG_PERHAPS_DIR (1<<17) /* generator */ |
|
|
/* These flags are for get_dirlist(). */ |
/* These flags are for get_dirlist(). */ |
#define GDL_IGNORE_FILTER_RULES (1<<0) |
#define GDL_IGNORE_FILTER_RULES (1<<0) |
|
#define GDL_PERHAPS_DIR (1<<1) |
|
|
/* Some helper macros for matching bits. */ |
/* Some helper macros for matching bits. */ |
#define BITS_SET(val,bits) (((val) & (bits)) == (bits)) |
#define BITS_SET(val,bits) (((val) & (bits)) == (bits)) |
Line 96
|
Line 109
|
== ((unsigned)(b2) & (unsigned)(mask))) |
== ((unsigned)(b2) & (unsigned)(mask))) |
|
|
/* update this if you make incompatible changes */ |
/* update this if you make incompatible changes */ |
#define PROTOCOL_VERSION 30 | #define PROTOCOL_VERSION 31 |
|
|
/* This is used when working on a new protocol version in CVS, and should |
/* This is used when working on a new protocol version in CVS, and should |
* be a new non-zero value for each CVS change that affects the protocol. |
* be a new non-zero value for each CVS change that affects the protocol. |
Line 124
|
Line 137
|
#define OLD_PROTOCOL_VERSION 25 |
#define OLD_PROTOCOL_VERSION 25 |
#define MAX_PROTOCOL_VERSION 40 |
#define MAX_PROTOCOL_VERSION 40 |
|
|
#define FILECNT_LOOKAHEAD 1000 | #define MIN_FILECNT_LOOKAHEAD 1000 |
| #define MAX_FILECNT_LOOKAHEAD 10000 |
|
|
#define RSYNC_PORT 873 |
#define RSYNC_PORT 873 |
|
|
Line 132
|
Line 146
|
#define WRITE_SIZE (32*1024) |
#define WRITE_SIZE (32*1024) |
#define CHUNK_SIZE (32*1024) |
#define CHUNK_SIZE (32*1024) |
#define MAX_MAP_SIZE (256*1024) |
#define MAX_MAP_SIZE (256*1024) |
#define IO_BUFFER_SIZE (4092) | #define IO_BUFFER_SIZE (32*1024) |
#define MAX_BLOCK_SIZE ((int32)1 << 17) |
#define MAX_BLOCK_SIZE ((int32)1 << 17) |
|
|
/* For compatibility with older rsyncs */ |
/* For compatibility with older rsyncs */ |
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29) |
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29) |
|
|
|
#define ROUND_UP_1024(siz) ((siz) & (1024-1) ? ((siz) | (1024-1)) + 1 : (siz)) |
|
|
#define IOERR_GENERAL (1<<0) /* For backward compatibility, this must == 1 */ |
#define IOERR_GENERAL (1<<0) /* For backward compatibility, this must == 1 */ |
#define IOERR_VANISHED (1<<1) |
#define IOERR_VANISHED (1<<1) |
#define IOERR_DEL_LIMIT (1<<2) |
#define IOERR_DEL_LIMIT (1<<2) |
|
|
#define MAX_ARGS 1000 |
#define MAX_ARGS 1000 |
|
#define MAX_FILTER_ARGS 100 |
#define MAX_BASIS_DIRS 20 |
#define MAX_BASIS_DIRS 20 |
#define MAX_SERVER_ARGS (MAX_BASIS_DIRS*2 + 100) |
#define MAX_SERVER_ARGS (MAX_BASIS_DIRS*2 + 100) |
|
|
|
#define COMPARE_DEST 1 |
|
#define COPY_DEST 2 |
|
#define LINK_DEST 3 |
|
#define CLONE_DEST 4 |
|
|
|
#if !defined FICLONE && defined __linux__ |
|
#define FICLONE _IOW(0x94, 9, int) |
|
#endif |
|
|
#define MPLEX_BASE 7 |
#define MPLEX_BASE 7 |
|
|
#define NO_FILTERS 0 |
#define NO_FILTERS 0 |
#define SERVER_FILTERS 1 |
#define SERVER_FILTERS 1 |
#define ALL_FILTERS 2 |
#define ALL_FILTERS 2 |
|
/* Don't let the file be excluded, but check for a filter that might affect |
|
* its attributes via FILTRULES_ATTRS. */ |
|
#define ALL_FILTERS_NO_EXCLUDE 3 |
|
|
#define XFLG_FATAL_ERRORS (1<<0) |
#define XFLG_FATAL_ERRORS (1<<0) |
#define XFLG_OLD_PREFIXES (1<<1) |
#define XFLG_OLD_PREFIXES (1<<1) |
Line 160
|
Line 189
|
|
|
#define ATTRS_REPORT (1<<0) |
#define ATTRS_REPORT (1<<0) |
#define ATTRS_SKIP_MTIME (1<<1) |
#define ATTRS_SKIP_MTIME (1<<1) |
|
#define ATTRS_ACCURATE_TIME (1<<2) |
|
#define ATTRS_SKIP_ATIME (1<<3) |
|
#define ATTRS_DELAY_IMMUTABLE (1<<4) |
|
#define ATTRS_SKIP_CRTIME (1<<5) |
|
|
|
#define MSG_FLUSH 2 |
#define FULL_FLUSH 1 |
#define FULL_FLUSH 1 |
#define NORMAL_FLUSH 0 |
#define NORMAL_FLUSH 0 |
|
|
Line 186
|
Line 220
|
#define ITEM_REPORT_GROUP (1<<6) |
#define ITEM_REPORT_GROUP (1<<6) |
#define ITEM_REPORT_ACL (1<<7) |
#define ITEM_REPORT_ACL (1<<7) |
#define ITEM_REPORT_XATTR (1<<8) |
#define ITEM_REPORT_XATTR (1<<8) |
|
#define ITEM_REPORT_FFLAGS (1<<9) |
|
#define ITEM_REPORT_CRTIME (1<<10) |
#define ITEM_BASIS_TYPE_FOLLOWS (1<<11) |
#define ITEM_BASIS_TYPE_FOLLOWS (1<<11) |
#define ITEM_XNAME_FOLLOWS (1<<12) |
#define ITEM_XNAME_FOLLOWS (1<<12) |
#define ITEM_IS_NEW (1<<13) |
#define ITEM_IS_NEW (1<<13) |
Line 199
|
Line 235
|
#define SIGNIFICANT_ITEM_FLAGS (~(\ |
#define SIGNIFICANT_ITEM_FLAGS (~(\ |
ITEM_BASIS_TYPE_FOLLOWS | ITEM_XNAME_FOLLOWS | ITEM_LOCAL_CHANGE)) |
ITEM_BASIS_TYPE_FOLLOWS | ITEM_XNAME_FOLLOWS | ITEM_LOCAL_CHANGE)) |
|
|
|
/* this is the minimum we'll use, irrespective of config setting */ |
|
/* definitely don't set to less than about 30 seconds */ |
|
#define SLP_MIN_TIMEOUT 120 |
|
|
#define CFN_KEEP_DOT_DIRS (1<<0) |
#define CFN_KEEP_DOT_DIRS (1<<0) |
#define CFN_KEEP_TRAILING_SLASH (1<<1) |
#define CFN_KEEP_TRAILING_SLASH (1<<1) |
#define CFN_DROP_TRAILING_DOT_DIR (1<<2) |
#define CFN_DROP_TRAILING_DOT_DIR (1<<2) |
#define CFN_COLLAPSE_DOT_DOT_DIRS (1<<3) |
#define CFN_COLLAPSE_DOT_DOT_DIRS (1<<3) |
|
#define CFN_REFUSE_DOT_DOT_DIRS (1<<4) |
|
|
#define SP_DEFAULT 0 |
#define SP_DEFAULT 0 |
#define SP_KEEP_DOT_DIRS (1<<0) |
#define SP_KEEP_DOT_DIRS (1<<0) |
Line 231 enum msgcode {
|
Line 272 enum msgcode {
|
MSG_ERROR_UTF8=FERROR_UTF8, /* sibling logging */ |
MSG_ERROR_UTF8=FERROR_UTF8, /* sibling logging */ |
MSG_LOG=FLOG, MSG_CLIENT=FCLIENT, /* sibling logging */ |
MSG_LOG=FLOG, MSG_CLIENT=FCLIENT, /* sibling logging */ |
MSG_REDO=9, /* reprocess indicated flist index */ |
MSG_REDO=9, /* reprocess indicated flist index */ |
MSG_FLIST=20, /* extra file list over sibling socket */ | MSG_STATS=10, /* message has stats data for generator */ |
MSG_FLIST_EOF=21,/* we've transmitted all the file lists */ | |
MSG_IO_ERROR=22,/* the sending side had an I/O error */ |
MSG_IO_ERROR=22,/* the sending side had an I/O error */ |
MSG_NOOP=42, /* a do-nothing message */ | MSG_IO_TIMEOUT=33,/* tell client about a daemon's timeout value */ |
| MSG_NOOP=42, /* a do-nothing message (legacy protocol-30 only) */ |
| MSG_CHECKSUM=55,/* sent via rcvr -> gen pipe and local-host-only gen -> sender */ |
| MSG_ERROR_EXIT=86, /* synchronize an error exit (siblings and protocol >= 31) */ |
MSG_SUCCESS=100,/* successfully updated indicated flist index */ |
MSG_SUCCESS=100,/* successfully updated indicated flist index */ |
MSG_DELETED=101,/* successfully deleted a file on receiving side */ |
MSG_DELETED=101,/* successfully deleted a file on receiving side */ |
MSG_NO_SEND=102,/* sender failed to open a file we wanted */ |
MSG_NO_SEND=102,/* sender failed to open a file we wanted */ |
MSG_DONE=86 /* current phase is done */ |
|
}; |
}; |
|
|
|
#define MSG_CHECKSUM_LONGS 5 |
|
#define MSG_CHECKSUM_LEN (MSG_CHECKSUM_LONGS*8 + 4 + MAX_DIGEST_LEN) |
|
|
#define NDX_DONE -1 |
#define NDX_DONE -1 |
#define NDX_FLIST_EOF -2 |
#define NDX_FLIST_EOF -2 |
|
#define NDX_DEL_STATS -3 |
#define NDX_FLIST_OFFSET -101 |
#define NDX_FLIST_OFFSET -101 |
|
|
|
/* For calling delete_item(), delete_dir_contents(), and delete_in_dir(). */ |
|
#define DEL_NO_UID_WRITE (1<<0) /* file/dir has our uid w/o write perm */ |
|
#define DEL_RECURSE (1<<1) /* if dir, delete all contents */ |
|
#define DEL_DIR_IS_EMPTY (1<<2) /* internal delete_FUNCTIONS use only */ |
|
#define DEL_FOR_FILE (1<<3) /* making room for a replacement file */ |
|
#define DEL_FOR_DIR (1<<4) /* making room for a replacement dir */ |
|
#define DEL_FOR_SYMLINK (1<<5) /* making room for a replacement symlink */ |
|
#define DEL_FOR_DEVICE (1<<6) /* making room for a replacement device */ |
|
#define DEL_FOR_SPECIAL (1<<7) /* making room for a replacement special */ |
|
#define DEL_FOR_BACKUP (1<<8) /* the delete is for a backup operation */ |
|
#define DEL_NO_DELETIONS (1<<9) /* just check for renames w/o deleting */ |
|
|
|
#define DEL_MAKE_ROOM (DEL_FOR_FILE|DEL_FOR_DIR|DEL_FOR_SYMLINK|DEL_FOR_DEVICE|DEL_FOR_SPECIAL) |
|
|
|
enum delret { |
|
DR_SUCCESS = 0, DR_FAILURE, DR_AT_LIMIT, DR_NOT_EMPTY |
|
}; |
|
|
|
/* Defines for make_path() */ |
|
#define MKP_DROP_NAME (1<<0) /* drop trailing filename or trailing slash */ |
|
#define MKP_SKIP_SLASH (1<<1) /* skip one or more leading slashes */ |
|
|
|
/* Defines for maybe_send_keepalive() */ |
|
#define MSK_ALLOW_FLUSH (1<<0) |
|
#define MSK_ACTIVE_RECEIVER (1<<1) |
|
|
#include "errcode.h" |
#include "errcode.h" |
|
|
#include "config.h" |
#include "config.h" |
|
#include "version.h" |
|
|
/* The default RSYNC_RSH is always set in config.h. */ |
/* The default RSYNC_RSH is always set in config.h. */ |
|
|
Line 340 enum msgcode {
|
Line 413 enum msgcode {
|
#include <utime.h> |
#include <utime.h> |
#endif |
#endif |
|
|
#if defined HAVE_LUTIMES || defined HAVE_UTIMENSAT | #if defined HAVE_UTIMENSAT || defined HAVE_LUTIMES || defined HAVE_SETATTRLIST |
#define CAN_SET_SYMLINK_TIMES 1 |
#define CAN_SET_SYMLINK_TIMES 1 |
#endif |
#endif |
|
|
Line 352 enum msgcode {
|
Line 425 enum msgcode {
|
#define CAN_CHMOD_SYMLINK 1 |
#define CAN_CHMOD_SYMLINK 1 |
#endif |
#endif |
|
|
|
#if defined HAVE_UTIMENSAT || defined HAVE_SETATTRLIST |
|
#define CAN_SET_NSEC 1 |
|
#endif |
|
|
|
#ifdef CAN_SET_NSEC |
|
#ifdef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC |
|
#define ST_MTIME_NSEC st_mtim.tv_nsec |
|
#define ST_ATIME_NSEC st_atim.tv_nsec |
|
#elif defined(HAVE_STRUCT_STAT_ST_MTIMENSEC) |
|
#define ST_MTIME_NSEC st_mtimensec |
|
#define ST_ATIME_NSEC st_atimensec |
|
#elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) |
|
#define ST_MTIME_NSEC st_mtimespec.tv_nsec |
|
#define ST_ATIME_NSEC st_atimespec.tv_nsec |
|
#endif |
|
#endif |
|
|
#ifdef HAVE_SYS_SELECT_H |
#ifdef HAVE_SYS_SELECT_H |
#include <sys/select.h> |
#include <sys/select.h> |
#endif |
#endif |
Line 374 enum msgcode {
|
Line 464 enum msgcode {
|
#include <netdb.h> |
#include <netdb.h> |
#endif |
#endif |
#include <syslog.h> |
#include <syslog.h> |
|
#ifdef HAVE_SYS_FILE_H |
#include <sys/file.h> |
#include <sys/file.h> |
|
#endif |
|
|
#ifdef HAVE_DIRENT_H |
#ifdef HAVE_DIRENT_H |
# include <dirent.h> |
# include <dirent.h> |
Line 403 enum msgcode {
|
Line 495 enum msgcode {
|
#ifdef MAKEDEV_TAKES_3_ARGS |
#ifdef MAKEDEV_TAKES_3_ARGS |
#define MAKEDEV(devmajor,devminor) makedev(0,devmajor,devminor) |
#define MAKEDEV(devmajor,devminor) makedev(0,devmajor,devminor) |
#else |
#else |
|
#ifndef __TANDEM |
#define MAKEDEV(devmajor,devminor) makedev(devmajor,devminor) |
#define MAKEDEV(devmajor,devminor) makedev(devmajor,devminor) |
|
#else |
|
# include <sys/stat.h> |
|
# define major DEV_TO_MAJOR |
|
# define minor DEV_TO_MINOR |
|
# define MAKEDEV MAJORMINOR_TO_DEV |
#endif |
#endif |
|
#endif |
|
|
|
#ifdef __TANDEM |
|
# include <floss.h(floss_read,floss_write,floss_fork,floss_execvp)> |
|
# include <floss.h(floss_getpwuid,floss_select,floss_seteuid)> |
|
# define S_IEXEC S_IXUSR |
|
# define ROOT_UID 65535 |
|
#else |
|
# define ROOT_UID 0 |
|
#endif |
|
|
#ifdef HAVE_COMPAT_H |
#ifdef HAVE_COMPAT_H |
#include <compat.h> |
#include <compat.h> |
#endif |
#endif |
Line 432 enum msgcode {
|
Line 540 enum msgcode {
|
#define iconv_t int |
#define iconv_t int |
#endif |
#endif |
|
|
|
#ifdef GSSAPI_OPTION |
|
#ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H |
|
#include <gssapi/gssapi_generic.h> |
|
#endif |
|
#ifdef HAVE_GSSAPI_GSSAPI_H |
|
#include <gssapi/gssapi.h> |
|
#endif |
|
#endif |
|
|
#include <assert.h> |
#include <assert.h> |
|
|
#include "lib/pool_alloc.h" |
#include "lib/pool_alloc.h" |
Line 482 typedef unsigned int size_t;
|
Line 599 typedef unsigned int size_t;
|
#endif |
#endif |
#endif |
#endif |
|
|
|
#ifndef UF_COMPRESSED |
|
#define UF_COMPRESSED 0x00000020 |
|
#endif |
|
#ifndef VOL_CAP_FMT_DECMPFS_COMPRESSION |
|
#define VOL_CAP_FMT_DECMPFS_COMPRESSION 0x00010000 |
|
#endif |
|
|
|
#if defined SUPPORT_XATTRS && defined SUPPORT_FILEFLAGS |
|
#define SUPPORT_HFS_COMPRESSION 1 |
|
#endif |
|
|
|
#ifndef __APPLE__ /* Do we need a configure check for this? */ |
|
#define SUPPORT_ATIMES 1 |
|
#endif |
|
|
|
#ifdef HAVE_GETATTRLIST |
|
#define SUPPORT_CRTIMES 1 |
|
#endif |
|
|
|
#define NO_FFLAGS ((uint32)-1) |
|
|
|
#ifdef HAVE_CHFLAGS |
|
#define SUPPORT_FILEFLAGS 1 |
|
#define SUPPORT_FORCE_CHANGE 1 |
|
#endif |
|
|
|
#if defined SUPPORT_FILEFLAGS || defined SUPPORT_FORCE_CHANGE |
|
#ifndef UF_NOUNLINK |
|
#define UF_NOUNLINK 0 |
|
#endif |
|
#ifndef SF_NOUNLINK |
|
#define SF_NOUNLINK 0 |
|
#endif |
|
#define USR_IMMUTABLE (UF_IMMUTABLE|UF_NOUNLINK|UF_APPEND) |
|
#define SYS_IMMUTABLE (SF_IMMUTABLE|SF_NOUNLINK|SF_APPEND) |
|
#define ALL_IMMUTABLE (USR_IMMUTABLE|SYS_IMMUTABLE) |
|
#define ST_FLAGS(st) ((st).st_flags) |
|
#else |
|
#define USR_IMMUTABLE 0 |
|
#define SYS_IMMUTABLE 0 |
|
#define ALL_IMMUTABLE 0 |
|
#define ST_FLAGS(st) NO_FFLAGS |
|
#endif |
|
|
/* Find a variable that is either exactly 32-bits or longer. |
/* Find a variable that is either exactly 32-bits or longer. |
* If some code depends on 32-bit truncation, it will need to |
* If some code depends on 32-bit truncation, it will need to |
* take special action in a "#if SIZEOF_INT32 > 4" section. */ |
* take special action in a "#if SIZEOF_INT32 > 4" section. */ |
Line 569 typedef unsigned int size_t;
|
Line 730 typedef unsigned int size_t;
|
# define SIZEOF_INT64 SIZEOF_OFF_T |
# define SIZEOF_INT64 SIZEOF_OFF_T |
#endif |
#endif |
|
|
|
#define HT_KEY32 0 |
|
#define HT_KEY64 1 |
|
|
struct hashtable { |
struct hashtable { |
void *nodes; |
void *nodes; |
int32 size, entries; |
int32 size, entries; |
uint32 node_size; |
uint32 node_size; |
int key64; | short key64; |
}; |
}; |
|
|
struct ht_int32_node { |
struct ht_int32_node { |
Line 622 struct ht_int64_node {
|
Line 786 struct ht_int64_node {
|
#define NAME_MAX 255 |
#define NAME_MAX 255 |
#endif |
#endif |
|
|
|
#ifndef SIZE_MAX |
|
#define SIZE_MAX ((size_t)-1) |
|
#endif |
|
|
#ifndef INADDR_NONE |
#ifndef INADDR_NONE |
#define INADDR_NONE 0xffffffff |
#define INADDR_NONE 0xffffffff |
#endif |
#endif |
Line 634 struct ht_int64_node {
|
Line 802 struct ht_int64_node {
|
#define ACLS_NEED_MASK 1 |
#define ACLS_NEED_MASK 1 |
#endif |
#endif |
|
|
|
#if defined HAVE_FALLOCATE || HAVE_SYS_FALLOCATE |
|
#ifdef HAVE_LINUX_FALLOC_H |
|
#include <linux/falloc.h> |
|
#endif |
|
#ifdef FALLOC_FL_KEEP_SIZE |
|
#define SUPPORT_PREALLOCATION 1 |
|
#elif defined HAVE_FTRUNCATE |
|
#define SUPPORT_PREALLOCATION 1 |
|
#define PREALLOCATE_NEEDS_TRUNCATE 1 |
|
#endif |
|
#else /* !fallocate */ |
|
#if defined HAVE_EFFICIENT_POSIX_FALLOCATE && defined HAVE_FTRUNCATE |
|
#define SUPPORT_PREALLOCATION 1 |
|
#define PREALLOCATE_NEEDS_TRUNCATE 1 |
|
#endif |
|
#endif |
|
|
|
#if SIZEOF_CHARP == 4 |
|
# define PTRS_ARE_32 1 |
|
# define PTR_EXTRA_CNT 1 |
|
#elif SIZEOF_CHARP == 8 |
|
# define PTRS_ARE_64 1 |
|
# define PTR_EXTRA_CNT EXTRA64_CNT |
|
#else |
|
# error Character pointers are not 4 or 8 bytes. |
|
#endif |
|
|
|
#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L |
|
#define USE_FLEXIBLE_ARRAY 1 |
|
#endif |
|
|
union file_extras { |
union file_extras { |
int32 num; |
int32 num; |
uint32 unum; |
uint32 unum; |
|
#ifdef PTRS_ARE_32 |
|
const char* ptr; |
|
#endif |
}; |
}; |
|
|
|
union file_extras64 { |
|
int64 num; |
|
#ifdef PTRS_ARE_64 |
|
const char* ptr; |
|
#endif |
|
}; |
|
|
struct file_struct { |
struct file_struct { |
const char *dirname; /* The dir info inside the transfer */ |
const char *dirname; /* The dir info inside the transfer */ |
time_t modtime; /* When the item was last modified */ |
time_t modtime; /* When the item was last modified */ |
uint32 len32; /* Lowest 32 bits of the file's length */ |
uint32 len32; /* Lowest 32 bits of the file's length */ |
uint16 mode; /* The item's type and permissions */ |
uint16 mode; /* The item's type and permissions */ |
uint16 flags; /* The FLAG_* bits for this item */ |
uint16 flags; /* The FLAG_* bits for this item */ |
const char basename[1]; /* The basename (AKA filename) follows */ | #ifdef USE_FLEXIBLE_ARRAY |
| const char basename[]; /* The basename (AKA filename) follows */ |
| #else |
| const char basename[1]; /* A kluge that should work like a flexible array */ |
| #endif |
}; |
}; |
|
|
extern int file_extra_cnt; |
extern int file_extra_cnt; |
extern int inc_recurse; |
extern int inc_recurse; |
|
extern int atimes_ndx; |
|
extern int crtimes_ndx; |
|
extern int pathname_ndx; |
|
extern int depth_ndx; |
extern int uid_ndx; |
extern int uid_ndx; |
extern int gid_ndx; |
extern int gid_ndx; |
|
extern int fileflags_ndx; |
extern int acls_ndx; |
extern int acls_ndx; |
extern int xattrs_ndx; |
extern int xattrs_ndx; |
|
|
|
#ifdef USE_FLEXIBLE_ARRAY |
|
#define FILE_STRUCT_LEN (sizeof (struct file_struct)) |
|
#else |
#define FILE_STRUCT_LEN (offsetof(struct file_struct, basename)) |
#define FILE_STRUCT_LEN (offsetof(struct file_struct, basename)) |
|
#endif |
#define EXTRA_LEN (sizeof (union file_extras)) |
#define EXTRA_LEN (sizeof (union file_extras)) |
#define PTR_EXTRA_CNT ((sizeof (char *) + EXTRA_LEN - 1) / EXTRA_LEN) |
|
#define DEV_EXTRA_CNT 2 |
#define DEV_EXTRA_CNT 2 |
#define DIRNODE_EXTRA_CNT 3 |
#define DIRNODE_EXTRA_CNT 3 |
|
#define EXTRA64_CNT ((sizeof (union file_extras64) + EXTRA_LEN - 1) / EXTRA_LEN) |
#define SUM_EXTRA_CNT ((MAX_DIGEST_LEN + EXTRA_LEN - 1) / EXTRA_LEN) |
#define SUM_EXTRA_CNT ((MAX_DIGEST_LEN + EXTRA_LEN - 1) / EXTRA_LEN) |
|
|
#define REQ_EXTRA(f,ndx) ((union file_extras*)(f) - (ndx)) |
#define REQ_EXTRA(f,ndx) ((union file_extras*)(f) - (ndx)) |
#define OPT_EXTRA(f,bump) ((union file_extras*)(f) - file_extra_cnt - 1 - (bump)) |
#define OPT_EXTRA(f,bump) ((union file_extras*)(f) - file_extra_cnt - 1 - (bump)) |
|
|
|
/* These are guaranteed to be allocated first in the array so that they |
|
* are aligned for direct int64-pointer access. */ |
|
#define REQ_EXTRA64(f,ndx) ((union file_extras64*)REQ_EXTRA(f,ndx)) |
|
|
|
#define NSEC_BUMP(f) ((f)->flags & FLAG_MOD_NSEC ? 1 : 0) |
#define LEN64_BUMP(f) ((f)->flags & FLAG_LENGTH64 ? 1 : 0) |
#define LEN64_BUMP(f) ((f)->flags & FLAG_LENGTH64 ? 1 : 0) |
|
#define START_BUMP(f) (NSEC_BUMP(f) + LEN64_BUMP(f)) |
#define HLINK_BUMP(f) ((f)->flags & (FLAG_HLINKED|FLAG_HLINK_DONE) ? inc_recurse+1 : 0) |
#define HLINK_BUMP(f) ((f)->flags & (FLAG_HLINKED|FLAG_HLINK_DONE) ? inc_recurse+1 : 0) |
#define ACL_BUMP(f) (acls_ndx ? 1 : 0) |
#define ACL_BUMP(f) (acls_ndx ? 1 : 0) |
|
|
Line 673 extern int xattrs_ndx;
|
Line 901 extern int xattrs_ndx;
|
#if SIZEOF_INT64 < 8 |
#if SIZEOF_INT64 < 8 |
#define F_LENGTH(f) ((int64)(f)->len32) |
#define F_LENGTH(f) ((int64)(f)->len32) |
#else |
#else |
#define F_LENGTH(f) ((int64)(f)->len32 + ((f)->flags & FLAG_LENGTH64 \ | #define F_HIGH_LEN(f) (OPT_EXTRA(f, NSEC_BUMP(f))->unum) |
? (int64)OPT_EXTRA(f, 0)->unum << 32 : 0)) | #define F_LENGTH(f) ((int64)(f)->len32 + ((f)->flags & FLAG_LENGTH64 ? (int64)F_HIGH_LEN(f) << 32 : 0)) |
#endif |
#endif |
|
|
|
#define F_MOD_NSEC(f) OPT_EXTRA(f, 0)->unum |
|
#define F_MOD_NSEC_or_0(f) ((f)->flags & FLAG_MOD_NSEC ? F_MOD_NSEC(f) : 0) |
|
|
/* If there is a symlink string, it is always right after the basename */ |
/* If there is a symlink string, it is always right after the basename */ |
#define F_SYMLINK(f) ((f)->basename + strlen((f)->basename) + 1) |
#define F_SYMLINK(f) ((f)->basename + strlen((f)->basename) + 1) |
|
|
/* The sending side always has this available: */ |
/* The sending side always has this available: */ |
#define F_PATHNAME(f) (*(const char**)REQ_EXTRA(f, PTR_EXTRA_CNT)) | #ifdef PTRS_ARE_32 |
| #define F_PATHNAME(f) REQ_EXTRA(f, pathname_ndx)->ptr |
| #else |
| #define F_PATHNAME(f) REQ_EXTRA64(f, pathname_ndx)->ptr |
| #endif |
|
|
/* The receiving side always has this available: */ |
/* The receiving side always has this available: */ |
#define F_DEPTH(f) REQ_EXTRA(f, 1)->num | #define F_DEPTH(f) REQ_EXTRA(f, depth_ndx)->num |
|
|
/* When the associated option is on, all entries will have these present: */ |
/* When the associated option is on, all entries will have these present: */ |
#define F_OWNER(f) REQ_EXTRA(f, uid_ndx)->unum |
#define F_OWNER(f) REQ_EXTRA(f, uid_ndx)->unum |
#define F_GROUP(f) REQ_EXTRA(f, gid_ndx)->unum |
#define F_GROUP(f) REQ_EXTRA(f, gid_ndx)->unum |
|
#if defined SUPPORT_FILEFLAGS || defined SUPPORT_FORCE_CHANGE |
|
#define F_FFLAGS(f) REQ_EXTRA(f, fileflags_ndx)->unum |
|
#else |
|
#define F_FFLAGS(f) NO_FFLAGS |
|
#endif |
#define F_ACL(f) REQ_EXTRA(f, acls_ndx)->num |
#define F_ACL(f) REQ_EXTRA(f, acls_ndx)->num |
#define F_XATTR(f) REQ_EXTRA(f, xattrs_ndx)->num |
#define F_XATTR(f) REQ_EXTRA(f, xattrs_ndx)->num |
#define F_NDX(f) REQ_EXTRA(f, unsort_ndx)->num |
#define F_NDX(f) REQ_EXTRA(f, unsort_ndx)->num |
|
#define F_ATIME(f) REQ_EXTRA64(f, atimes_ndx)->num |
|
#define F_CRTIME(f) REQ_EXTRA64(f, crtimes_ndx)->num |
|
|
/* These items are per-entry optional: */ |
/* These items are per-entry optional: */ |
#define F_HL_GNUM(f) OPT_EXTRA(f, LEN64_BUMP(f))->num /* non-dirs */ | #define F_HL_GNUM(f) OPT_EXTRA(f, START_BUMP(f))->num /* non-dirs */ |
#define F_HL_PREV(f) OPT_EXTRA(f, LEN64_BUMP(f)+inc_recurse)->num /* non-dirs */ | #define F_HL_PREV(f) OPT_EXTRA(f, START_BUMP(f)+inc_recurse)->num /* non-dirs */ |
#define F_DIR_NODE_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) \ | #define F_DIR_NODE_P(f) (&OPT_EXTRA(f, START_BUMP(f) \ |
+ DIRNODE_EXTRA_CNT - 1)->num) /* sender dirs */ |
+ DIRNODE_EXTRA_CNT - 1)->num) /* sender dirs */ |
#define F_DIR_RELNAMES_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + DIRNODE_EXTRA_CNT \ | #define F_DIR_RELNAMES_P(f) (&OPT_EXTRA(f, START_BUMP(f) + DIRNODE_EXTRA_CNT \ |
+ PTR_EXTRA_CNT - 1)->num) /* sender dirs */ |
+ PTR_EXTRA_CNT - 1)->num) /* sender dirs */ |
#define F_DIR_DEFACL(f) OPT_EXTRA(f, LEN64_BUMP(f))->unum /* receiver dirs */ | #define F_DIR_DEFACL(f) OPT_EXTRA(f, START_BUMP(f))->unum /* receiver dirs */ |
#define F_DIR_DEV_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + ACL_BUMP(f) \ | #define F_DIR_DEV_P(f) (&OPT_EXTRA(f, START_BUMP(f) + ACL_BUMP(f) \ |
+ DEV_EXTRA_CNT - 1)->unum) /* receiver dirs */ |
+ DEV_EXTRA_CNT - 1)->unum) /* receiver dirs */ |
|
|
/* This optional item might follow an F_HL_*() item. | /* This optional item might follow an F_HL_*() item. */ |
* (Note: a device doesn't need to check LEN64_BUMP(f).) */ | #define F_RDEV_P(f) (&OPT_EXTRA(f, START_BUMP(f) + HLINK_BUMP(f) + DEV_EXTRA_CNT - 1)->unum) |
#define F_RDEV_P(f) (&OPT_EXTRA(f, HLINK_BUMP(f) + DEV_EXTRA_CNT - 1)->unum) | |
|
|
/* The sum is only present on regular files. */ |
/* The sum is only present on regular files. */ |
#define F_SUM(f) ((char*)OPT_EXTRA(f, LEN64_BUMP(f) + HLINK_BUMP(f) \ | #define F_SUM(f) ((char*)OPT_EXTRA(f, START_BUMP(f) + HLINK_BUMP(f) \ |
+ SUM_EXTRA_CNT - 1)) |
+ SUM_EXTRA_CNT - 1)) |
|
|
|
/* These are only valid on an entry derived from a checksum file. */ |
|
#define F_CTIME(f) OPT_EXTRA(f, LEN64_BUMP(f) + SUM_EXTRA_CNT)->unum |
|
#define F_INODE(f) OPT_EXTRA(f, LEN64_BUMP(f) + SUM_EXTRA_CNT + 1)->unum |
|
|
/* Some utility defines: */ |
/* Some utility defines: */ |
#define F_IS_ACTIVE(f) (f)->basename[0] |
#define F_IS_ACTIVE(f) (f)->basename[0] |
#define F_IS_HLINKED(f) ((f)->flags & FLAG_HLINKED) |
#define F_IS_HLINKED(f) ((f)->flags & FLAG_HLINKED) |
Line 728 extern int xattrs_ndx;
|
Line 973 extern int xattrs_ndx;
|
#define DIR_FIRST_CHILD(a) (a)[1] |
#define DIR_FIRST_CHILD(a) (a)[1] |
#define DIR_NEXT_SIBLING(a) (a)[2] |
#define DIR_NEXT_SIBLING(a) (a)[2] |
|
|
|
#define IS_MISSING_FILE(statbuf) ((statbuf).st_mode == 0) |
|
|
/* |
/* |
* Start the flist array at FLIST_START entries and grow it |
* Start the flist array at FLIST_START entries and grow it |
* by doubling until FLIST_LINEAR then grow by FLIST_LINEAR |
* by doubling until FLIST_LINEAR then grow by FLIST_LINEAR |
Line 794 struct map_struct {
|
Line 1041 struct map_struct {
|
int status; /* first errno from read errors */ |
int status; /* first errno from read errors */ |
}; |
}; |
|
|
#define MATCHFLG_WILD (1<<0) /* pattern has '*', '[', and/or '?' */ | struct chmod_mode_struct; |
#define MATCHFLG_WILD2 (1<<1) /* pattern has '**' */ | |
#define MATCHFLG_WILD2_PREFIX (1<<2) /* pattern starts with "**" */ | |
#define MATCHFLG_WILD3_SUFFIX (1<<3) /* pattern ends with "***" */ | |
#define MATCHFLG_ABS_PATH (1<<4) /* path-match on absolute path */ | |
#define MATCHFLG_INCLUDE (1<<5) /* this is an include, not an exclude */ | |
#define MATCHFLG_DIRECTORY (1<<6) /* this matches only directories */ | |
#define MATCHFLG_WORD_SPLIT (1<<7) /* split rules on whitespace */ | |
#define MATCHFLG_NO_INHERIT (1<<8) /* don't inherit these rules */ | |
#define MATCHFLG_NO_PREFIXES (1<<9) /* parse no prefixes from patterns */ | |
#define MATCHFLG_MERGE_FILE (1<<10)/* specifies a file to merge */ | |
#define MATCHFLG_PERDIR_MERGE (1<<11)/* merge-file is searched per-dir */ | |
#define MATCHFLG_EXCLUDE_SELF (1<<12)/* merge-file name should be excluded */ | |
#define MATCHFLG_FINISH_SETUP (1<<13)/* per-dir merge file needs setup */ | |
#define MATCHFLG_NEGATE (1<<14)/* rule matches when pattern does not */ | |
#define MATCHFLG_CVS_IGNORE (1<<15)/* rule was -C or :C */ | |
#define MATCHFLG_SENDER_SIDE (1<<16)/* rule applies to the sending side */ | |
#define MATCHFLG_RECEIVER_SIDE (1<<17)/* rule applies to the receiving side */ | |
#define MATCHFLG_CLEAR_LIST (1<<18)/* this item is the "!" token */ | |
#define MATCHFLG_PERISHABLE (1<<19)/* perishable if parent dir goes away */ | |
|
|
#define MATCHFLGS_FROM_CONTAINER (MATCHFLG_ABS_PATH | MATCHFLG_INCLUDE \ | #define NAME_IS_FILE (0) /* filter name as a file */ |
| MATCHFLG_DIRECTORY | MATCHFLG_SENDER_SIDE \ | #define NAME_IS_DIR (1<<0) /* filter name as a dir */ |
| MATCHFLG_NEGATE | MATCHFLG_RECEIVER_SIDE \ | #define NAME_IS_XATTR (1<<2) /* filter name as an xattr */ |
| MATCHFLG_PERISHABLE) | |
|
|
struct filter_struct { | #define FILTRULE_WILD (1<<0) /* pattern has '*', '[', and/or '?' */ |
| #define FILTRULE_WILD2 (1<<1) /* pattern has '**' */ |
| #define FILTRULE_WILD2_PREFIX (1<<2) /* pattern starts with "**" */ |
| #define FILTRULE_WILD3_SUFFIX (1<<3) /* pattern ends with "***" */ |
| #define FILTRULE_ABS_PATH (1<<4) /* path-match on absolute path */ |
| #define FILTRULE_INCLUDE (1<<5) /* this is an include, not an exclude */ |
| #define FILTRULE_DIRECTORY (1<<6) /* this matches only directories */ |
| #define FILTRULE_WORD_SPLIT (1<<7) /* split rules on whitespace */ |
| #define FILTRULE_NO_INHERIT (1<<8) /* don't inherit these rules */ |
| #define FILTRULE_NO_PREFIXES (1<<9) /* parse no prefixes from patterns */ |
| #define FILTRULE_MERGE_FILE (1<<10)/* specifies a file to merge */ |
| #define FILTRULE_PERDIR_MERGE (1<<11)/* merge-file is searched per-dir */ |
| #define FILTRULE_EXCLUDE_SELF (1<<12)/* merge-file name should be excluded */ |
| #define FILTRULE_FINISH_SETUP (1<<13)/* per-dir merge file needs setup */ |
| #define FILTRULE_NEGATE (1<<14)/* rule matches when pattern does not */ |
| #define FILTRULE_CVS_IGNORE (1<<15)/* rule was -C or :C */ |
| #define FILTRULE_SENDER_SIDE (1<<16)/* rule applies to the sending side */ |
| #define FILTRULE_RECEIVER_SIDE (1<<17)/* rule applies to the receiving side */ |
| #define FILTRULE_CLEAR_LIST (1<<18)/* this item is the "!" token */ |
| #define FILTRULE_PERISHABLE (1<<19)/* perishable if parent dir goes away */ |
| #define FILTRULE_XATTR (1<<20)/* rule only applies to xattr names */ |
| #define FILTRULE_CHMOD (1<<21)/* chmod-tweak matching files */ |
| #define FILTRULE_FORCE_OWNER (1<<22)/* force owner of matching files */ |
| #define FILTRULE_FORCE_GROUP (1<<23)/* force group of matching files */ |
| |
| #define FILTRULES_SIDES (FILTRULE_SENDER_SIDE | FILTRULE_RECEIVER_SIDE) |
| #define FILTRULES_ATTRS (FILTRULE_CHMOD | FILTRULE_FORCE_OWNER | FILTRULE_FORCE_GROUP) |
| |
| struct filter_chmod_struct { |
| unsigned int ref_cnt; |
| char *modestr; |
| struct chmod_mode_struct *modes; |
| }; |
| |
| typedef struct filter_struct { |
struct filter_struct *next; |
struct filter_struct *next; |
char *pattern; |
char *pattern; |
uint32 match_flags; | uint32 rflags; |
union { |
union { |
int slash_cnt; |
int slash_cnt; |
struct filter_list_struct *mergelist; |
struct filter_list_struct *mergelist; |
} u; |
} u; |
}; | /* TODO: Use an "extras" mechanism to avoid |
| * allocating this memory when we don't need it. */ |
| struct filter_chmod_struct *chmod; |
| uid_t force_uid; |
| gid_t force_gid; |
| } filter_rule; |
|
|
struct filter_list_struct { | typedef struct filter_list_struct { |
struct filter_struct *head; | filter_rule *head; |
struct filter_struct *tail; | filter_rule *tail; |
char *debug_type; |
char *debug_type; |
}; | } filter_rule_list; |
|
|
struct stats { |
struct stats { |
int64 total_size; |
int64 total_size; |
Line 846 struct stats {
|
Line 1112 struct stats {
|
int64 flist_buildtime; |
int64 flist_buildtime; |
int64 flist_xfertime; |
int64 flist_xfertime; |
int64 flist_size; |
int64 flist_size; |
int num_files; | int num_files, num_dirs, num_symlinks, num_devices, num_specials; |
int num_transferred_files; | int created_files, created_dirs, created_symlinks, created_devices, created_specials; |
| int deleted_files, deleted_dirs, deleted_symlinks, deleted_devices, deleted_specials; |
| int xferred_files; |
}; |
}; |
|
|
struct chmod_mode_struct; |
struct chmod_mode_struct; |
Line 882 typedef struct {
|
Line 1150 typedef struct {
|
} xbuf; |
} xbuf; |
|
|
#define INIT_XBUF(xb, str, ln, sz) (xb).buf = (str), (xb).len = (ln), (xb).size = (sz), (xb).pos = 0 |
#define INIT_XBUF(xb, str, ln, sz) (xb).buf = (str), (xb).len = (ln), (xb).size = (sz), (xb).pos = 0 |
#define INIT_XBUF_STRLEN(xb, str) (xb).buf = (str), (xb).len = strlen((xb).buf), (xb).size = (-1), (xb).pos = 0 | #define INIT_XBUF_STRLEN(xb, str) (xb).buf = (str), (xb).len = strlen((xb).buf), (xb).size = (size_t)-1, (xb).pos = 0 |
/* This one is used to make an output xbuf based on a char[] buffer: */ |
/* This one is used to make an output xbuf based on a char[] buffer: */ |
#define INIT_CONST_XBUF(xb, bf) (xb).buf = (bf), (xb).size = sizeof (bf), (xb).len = (xb).pos = 0 |
#define INIT_CONST_XBUF(xb, bf) (xb).buf = (bf), (xb).size = sizeof (bf), (xb).len = (xb).pos = 0 |
|
|
#define ICB_EXPAND_OUT (1<<0) |
#define ICB_EXPAND_OUT (1<<0) |
#define ICB_INCLUDE_BAD (1<<1) |
#define ICB_INCLUDE_BAD (1<<1) |
#define ICB_INCLUDE_INCOMPLETE (1<<2) |
#define ICB_INCLUDE_INCOMPLETE (1<<2) |
|
#define ICB_CIRCULAR_OUT (1<<3) |
|
#define ICB_INIT (1<<4) |
|
|
|
#define IOBUF_KEEP_BUFS 0 |
|
#define IOBUF_FREE_BUFS 1 |
|
|
|
#define MPLX_SWITCHING IOBUF_KEEP_BUFS |
|
#define MPLX_ALL_DONE IOBUF_FREE_BUFS |
|
#define MPLX_TO_BUFFERED 2 |
|
|
#define RL_EOL_NULLS (1<<0) |
#define RL_EOL_NULLS (1<<0) |
#define RL_DUMP_COMMENTS (1<<1) |
#define RL_DUMP_COMMENTS (1<<1) |
#define RL_CONVERT (1<<2) |
#define RL_CONVERT (1<<2) |
|
|
typedef struct { |
typedef struct { |
char name_type; |
char name_type; |
char fname[1]; /* has variable size */ | #ifdef USE_FLEXIBLE_ARRAY |
| char fname[]; /* has variable size */ |
| #else |
| char fname[1]; /* A kluge that should work like a flexible array */ |
| #endif |
} relnamecache; |
} relnamecache; |
|
|
|
#ifdef USE_FLEXIBLE_ARRAY |
|
#define RELNAMECACHE_LEN (sizeof (relnamecache)) |
|
#else |
|
#define RELNAMECACHE_LEN (offsetof(relnamecache, fname)) |
|
#endif |
|
|
|
#define CSF_ENABLE (1<<1) |
|
#define CSF_LAX (1<<2) |
|
#define CSF_UPDATE (1<<3) |
|
#define CSF_AFFECT_DRYRUN (1<<4) |
|
|
|
#define CSF_IGNORE_FILES 0 |
|
#define CSF_LAX_MODE (CSF_ENABLE|CSF_LAX) |
|
#define CSF_STRICT_MODE (CSF_ENABLE) |
|
|
#include "byteorder.h" |
#include "byteorder.h" |
#include "lib/mdigest.h" |
#include "lib/mdigest.h" |
#include "lib/wildmatch.h" |
#include "lib/wildmatch.h" |
Line 920 typedef struct {
|
Line 1216 typedef struct {
|
|
|
typedef struct { |
typedef struct { |
STRUCT_STAT st; |
STRUCT_STAT st; |
|
time_t crtime; |
#ifdef SUPPORT_ACLS |
#ifdef SUPPORT_ACLS |
struct rsync_acl *acc_acl; /* access ACL */ |
struct rsync_acl *acc_acl; /* access ACL */ |
struct rsync_acl *def_acl; /* default ACL */ |
struct rsync_acl *def_acl; /* default ACL */ |
Line 932 typedef struct {
|
Line 1229 typedef struct {
|
#define ACL_READY(sx) ((sx).acc_acl != NULL) |
#define ACL_READY(sx) ((sx).acc_acl != NULL) |
#define XATTR_READY(sx) ((sx).xattr != NULL) |
#define XATTR_READY(sx) ((sx).xattr != NULL) |
|
|
|
#define CLVL_NOT_SPECIFIED INT_MIN |
|
|
|
#define CPRES_AUTO (-1) |
|
#define CPRES_NONE 0 |
|
#define CPRES_ZLIB 1 |
|
#define CPRES_ZLIBX 2 |
|
#define CPRES_LZ4 3 |
|
#define CPRES_ZSTD 4 |
|
|
|
#define NSTR_CHECKSUM 0 |
|
#define NSTR_COMPRESS 1 |
|
|
|
struct name_num_item { |
|
int num; |
|
const char *name, *main_name; |
|
}; |
|
|
|
struct name_num_obj { |
|
const char *type; |
|
const char *negotiated_name; |
|
uchar *saw; |
|
int saw_len; |
|
int negotiated_num; |
|
struct name_num_item list[8]; /* A big-enough len (we'll get a compile error if it is ever too small) */ |
|
}; |
|
|
|
#ifndef __cplusplus |
#include "proto.h" |
#include "proto.h" |
|
#endif |
|
|
#ifndef SUPPORT_XATTRS |
#ifndef SUPPORT_XATTRS |
#define x_stat(fn,fst,xst) do_stat(fn,fst) |
#define x_stat(fn,fst,xst) do_stat(fn,fst) |
Line 959 int vsnprintf(char *str, size_t count, const char *fmt
|
Line 1284 int vsnprintf(char *str, size_t count, const char *fmt
|
int snprintf(char *str, size_t count, const char *fmt,...); |
int snprintf(char *str, size_t count, const char *fmt,...); |
#endif |
#endif |
|
|
|
|
#ifndef HAVE_STRERROR |
#ifndef HAVE_STRERROR |
extern char *sys_errlist[]; |
extern char *sys_errlist[]; |
#define strerror(i) sys_errlist[i] |
#define strerror(i) sys_errlist[i] |
Line 976 extern int errno;
|
Line 1300 extern int errno;
|
|
|
#ifdef HAVE_READLINK |
#ifdef HAVE_READLINK |
#define SUPPORT_LINKS 1 |
#define SUPPORT_LINKS 1 |
|
#if !defined NO_SYMLINK_XATTRS && !defined NO_SYMLINK_USER_XATTRS |
|
#define do_readlink(path, buf, bufsiz) readlink(path, buf, bufsiz) |
#endif |
#endif |
|
#endif |
#ifdef HAVE_LINK |
#ifdef HAVE_LINK |
#define SUPPORT_HARD_LINKS 1 |
#define SUPPORT_HARD_LINKS 1 |
#endif |
#endif |
Line 1098 extern int errno;
|
Line 1425 extern int errno;
|
/* handler for null strings in printf format */ |
/* handler for null strings in printf format */ |
#define NS(s) ((s)?(s):"<NULL>") |
#define NS(s) ((s)?(s):"<NULL>") |
|
|
|
extern char *do_calloc; |
|
|
/* Convenient wrappers for malloc and realloc. Use them. */ |
/* Convenient wrappers for malloc and realloc. Use them. */ |
#define new(type) ((type*)malloc(sizeof (type))) | #define new(type) ((type*)my_alloc(NULL, sizeof (type), 1, __FILE__, __LINE__)) |
#define new0(type) ((type*)calloc(1, sizeof (type))) | #define new0(type) ((type*)my_alloc(do_calloc, sizeof (type), 1, __FILE__, __LINE__)) |
#define new_array(type, num) ((type*)_new_array((num), sizeof (type), 0)) | #define realloc_buf(ptr, num) my_alloc((ptr), (num), 1, __FILE__, __LINE__) |
#define new_array0(type, num) ((type*)_new_array((num), sizeof (type), 1)) | |
#define realloc_array(ptr, type, num) ((type*)_realloc_array((ptr), sizeof(type), (num))) | |
|
|
|
#define new_array(type, num) ((type*)my_alloc(NULL, (num), sizeof (type), __FILE__, __LINE__)) |
|
#define new_array0(type, num) ((type*)my_alloc(do_calloc, (num), sizeof (type), __FILE__, __LINE__)) |
|
#define realloc_array(ptr, type, num) ((type*)my_alloc((ptr), (num), sizeof (type), __FILE__, __LINE__)) |
|
|
|
#undef strdup |
|
#define strdup(s) my_strdup(s, __FILE__, __LINE__) |
|
|
|
#define out_of_memory(msg) _out_of_memory(msg, __FILE__, __LINE__) |
|
#define overflow_exit(msg) _overflow_exit(msg, __FILE__, __LINE__) |
|
|
/* use magic gcc attributes to catch format errors */ |
/* use magic gcc attributes to catch format errors */ |
void rprintf(enum logcode , const char *, ...) |
void rprintf(enum logcode , const char *, ...) |
__attribute__((format (printf, 2, 3))) |
__attribute__((format (printf, 2, 3))) |
Line 1155 size_t strlcat(char *d, const char *s, size_t bufsize)
|
Line 1492 size_t strlcat(char *d, const char *s, size_t bufsize)
|
#define FD_ZERO(fdsetp) memset(fdsetp, 0, sizeof (fd_set)) |
#define FD_ZERO(fdsetp) memset(fdsetp, 0, sizeof (fd_set)) |
#endif |
#endif |
|
|
extern int verbose; | extern short info_levels[], debug_levels[]; |
|
|
|
#define INFO_GTE(flag, lvl) (info_levels[INFO_##flag] >= (lvl)) |
|
#define INFO_EQ(flag, lvl) (info_levels[INFO_##flag] == (lvl)) |
|
#define DEBUG_GTE(flag, lvl) (debug_levels[DEBUG_##flag] >= (lvl)) |
|
#define DEBUG_EQ(flag, lvl) (debug_levels[DEBUG_##flag] == (lvl)) |
|
|
|
#define INFO_BACKUP 0 |
|
#define INFO_COPY (INFO_BACKUP+1) |
|
#define INFO_DEL (INFO_COPY+1) |
|
#define INFO_FLIST (INFO_DEL+1) |
|
#define INFO_MISC (INFO_FLIST+1) |
|
#define INFO_MOUNT (INFO_MISC+1) |
|
#define INFO_NAME (INFO_MOUNT+1) |
|
#define INFO_PROGRESS (INFO_NAME+1) |
|
#define INFO_REMOVE (INFO_PROGRESS+1) |
|
#define INFO_SKIP (INFO_REMOVE+1) |
|
#define INFO_STATS (INFO_SKIP+1) |
|
#define INFO_SYMSAFE (INFO_STATS+1) |
|
|
|
#define COUNT_INFO (INFO_SYMSAFE+1) |
|
|
|
#define DEBUG_ACL 0 |
|
#define DEBUG_BACKUP (DEBUG_ACL+1) |
|
#define DEBUG_BIND (DEBUG_BACKUP+1) |
|
#define DEBUG_CHDIR (DEBUG_BIND+1) |
|
#define DEBUG_CONNECT (DEBUG_CHDIR+1) |
|
#define DEBUG_CMD (DEBUG_CONNECT+1) |
|
#define DEBUG_DB (DEBUG_CMD+1) |
|
#define DEBUG_DEL (DEBUG_DB+1) |
|
#define DEBUG_DELTASUM (DEBUG_DEL+1) |
|
#define DEBUG_DUP (DEBUG_DELTASUM+1) |
|
#define DEBUG_EXIT (DEBUG_DUP+1) |
|
#define DEBUG_FILTER (DEBUG_EXIT+1) |
|
#define DEBUG_FLIST (DEBUG_FILTER+1) |
|
#define DEBUG_FUZZY (DEBUG_FLIST+1) |
|
#define DEBUG_GENR (DEBUG_FUZZY+1) |
|
#define DEBUG_HASH (DEBUG_GENR+1) |
|
#define DEBUG_HASHLINK (DEBUG_HASH+1) |
|
#define DEBUG_HLINK (DEBUG_HASHLINK+1) |
|
#define DEBUG_ICONV (DEBUG_HLINK+1) |
|
#define DEBUG_IO (DEBUG_ICONV+1) |
|
#define DEBUG_NSTR (DEBUG_IO+1) |
|
#define DEBUG_OWN (DEBUG_NSTR+1) |
|
#define DEBUG_PROTO (DEBUG_OWN+1) |
|
#define DEBUG_RECV (DEBUG_PROTO+1) |
|
#define DEBUG_SEND (DEBUG_RECV+1) |
|
#define DEBUG_TIME (DEBUG_SEND+1) |
|
|
|
#define COUNT_DEBUG (DEBUG_TIME+1) |
|
|
#ifndef HAVE_INET_NTOP |
#ifndef HAVE_INET_NTOP |
const char *inet_ntop(int af, const void *src, char *dst, size_t size); |
const char *inet_ntop(int af, const void *src, char *dst, size_t size); |
#endif |
#endif |
Line 1165 const char *inet_ntop(int af, const void *src, char *d
|
Line 1551 const char *inet_ntop(int af, const void *src, char *d
|
int inet_pton(int af, const char *src, void *dst); |
int inet_pton(int af, const char *src, void *dst); |
#endif |
#endif |
|
|
|
#ifndef HAVE_GETPASS |
|
char *getpass(const char *prompt); |
|
#endif |
|
|
#ifdef MAINTAINER_MODE |
#ifdef MAINTAINER_MODE |
const char *get_panic_action(void); |
const char *get_panic_action(void); |
#endif |
#endif |
|
|
|
#define NOISY_DEATH(msg) do { \ |
|
fprintf(stderr, "%s in %s at line %d\n", msg, __FILE__, __LINE__); \ |
|
exit_cleanup(RERR_UNSUPPORTED); \ |
|
} while (0) |