To use this patch, run these commands for a successful build:
- patch -p1 <patches/remote-option.diff
patch -p1 <patches/db.diff
./configure (optional if already run)
make
+based-on: a01e3b490eb36ccf9e704840e1b6683dab867550
diff --git a/Makefile.in b/Makefile.in
--- a/Makefile.in
+++ b/Makefile.in
-@@ -35,7 +35,7 @@ ZLIBOBJ=zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o \
+@@ -36,7 +36,7 @@ ZLIBOBJ=zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o \
OBJS1=flist.o rsync.o generator.o receiver.o cleanup.o sender.o exclude.o \
- util.o main.o checksum.o match.o syscall.o log.o backup.o
+ util.o main.o checksum.o match.o syscall.o log.o backup.o delete.o
OBJS2=options.o io.o compat.o hlink.o token.o uidlist.o socket.o hashtable.o \
- fileio.o batch.o clientname.o chmod.o acls.o xattrs.o
+ fileio.o batch.o clientname.o chmod.o db.o acls.o xattrs.o
extern int protocol_version;
+extern int use_db;
- int csum_length = SHORT_SUM_LENGTH; /* initial value */
-
-@@ -100,10 +101,10 @@ void get_checksum2(char *buf, int32 len, char *sum)
+ /*
+ a simple 32 bit checksum that can be upadted from either end
+@@ -98,10 +99,10 @@ void get_checksum2(char *buf, int32 len, char *sum)
}
}
md_context m;
int32 remainder;
int fd;
-@@ -114,7 +115,7 @@ void file_checksum(char *fname, char *sum, OFF_T size)
+@@ -112,7 +113,7 @@ void file_checksum(char *fname, char *sum, OFF_T size)
if (fd == -1)
return;
if (protocol_version >= 30) {
md5_begin(&m);
-@@ -148,6 +149,9 @@ void file_checksum(char *fname, char *sum, OFF_T size)
+@@ -146,6 +147,9 @@ void file_checksum(char *fname, char *sum, OFF_T size)
mdfour_result(&m, (uchar *)sum);
}
diff --git a/cleanup.c b/cleanup.c
--- a/cleanup.c
+++ b/cleanup.c
-@@ -27,6 +27,7 @@ extern int am_daemon;
+@@ -26,6 +26,7 @@ extern int am_server;
+ extern int am_daemon;
+ extern int am_receiver;
extern int io_error;
++extern int use_db;
extern int keep_partial;
extern int got_xfer_error;
-+extern int use_db;
- extern char *partial_dir;
- extern char *logfile_name;
-
-@@ -124,6 +125,12 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
+ extern int protocol_version;
+@@ -140,6 +141,12 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
/* FALLTHROUGH */
#include "case_N.h"
extern mode_t orig_umask;
+extern char *db_config;
extern char *bind_address;
- extern char *sockopts;
extern char *config_file;
-@@ -552,6 +555,9 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
+ extern char *logfile_format;
+@@ -667,6 +670,9 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
log_init(1);
+
#ifdef HAVE_PUTENV
if (*lp_prexfer_exec(i) || *lp_postxfer_exec(i)) {
- char *modname, *modpath, *hostaddr, *hostname, *username;
-@@ -768,6 +774,10 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
+ int status;
+@@ -862,6 +868,10 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
am_server = 1; /* Don't let someone try to be tricky. */
quiet = 0;
diff --git a/configure.in b/configure.in
--- a/configure.in
+++ b/configure.in
-@@ -314,7 +314,7 @@ AC_CHECK_HEADERS(sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h \
+@@ -337,7 +337,7 @@ AC_CHECK_HEADERS(sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h \
sys/un.h sys/attr.h mcheck.h arpa/inet.h arpa/nameser.h locale.h \
netdb.h malloc.h float.h limits.h iconv.h libcharset.h langinfo.h \
sys/acl.h acl/libacl.h attr/xattr.h sys/xattr.h sys/extattr.h \
AC_HEADER_MAJOR
AC_CACHE_CHECK([if makedev takes 3 args],rsync_cv_MAKEDEV_TAKES_3_ARGS,[
-@@ -969,6 +969,29 @@ if test x"$enable_acl_support" = x"no" -o x"$enable_xattr_support" = x"no" -o x"
+@@ -1019,6 +1019,29 @@ if test x"$enable_acl_support" = x"no" -o x"$enable_xattr_support" = x"no" -o x"
fi
fi
new file mode 100644
--- /dev/null
+++ b/db.c
-@@ -0,0 +1,566 @@
+@@ -0,0 +1,567 @@
+/*
+ * Routines to access extended file info via DB.
+ *
+
+#include "rsync.h"
+#include "ifuncs.h"
++#include "itypes.h"
+
+#if defined HAVE_MYSQL_MYSQL_H && defined HAVE_LIBMYSQLCLIENT
+#define USE_MYSQL
diff --git a/flist.c b/flist.c
--- a/flist.c
+++ b/flist.c
-@@ -54,6 +54,7 @@ extern int preserve_devices;
- extern int preserve_specials;
+@@ -54,6 +54,7 @@ extern int delete_during;
+ extern int missing_args;
extern int uid_ndx;
extern int gid_ndx;
+extern int use_db;
extern int eol_nulls;
extern int relative_paths;
extern int implied_dirs;
-@@ -1250,14 +1251,16 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
- memcpy(bp + basename_len, linkname, linkname_len);
+@@ -1309,11 +1310,8 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+ extra_len += EXTRA_LEN;
#endif
-- if (always_checksum && am_sender && S_ISREG(st.st_mode))
+- if (always_checksum && am_sender && S_ISREG(st.st_mode)) {
- file_checksum(thisname, tmp_sum, st.st_size);
--
- if (am_sender)
- F_PATHNAME(file) = pathname;
- else if (!pool)
- F_DEPTH(file) = extra_len / EXTRA_LEN;
+- if (sender_keeps_checksum)
+- extra_len += SUM_EXTRA_CNT * EXTRA_LEN;
+- }
++ if (sender_keeps_checksum && S_ISREG(st.st_mode))
++ extra_len += SUM_EXTRA_CNT * EXTRA_LEN;
+ #if EXTRA_ROUNDING > 0
+ if (extra_len & (EXTRA_ROUNDING * EXTRA_LEN))
+@@ -1396,8 +1394,12 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
+ return NULL;
+ }
+
+- if (sender_keeps_checksum && S_ISREG(st.st_mode))
+- memcpy(F_SUM(file), tmp_sum, checksum_len);
+ if (always_checksum && am_sender && S_ISREG(st.st_mode)) {
+ if (!use_db || !db_get_checksum(thisname, &st, tmp_sum))
+ file_checksum(thisname, &st, tmp_sum);
++ if (sender_keeps_checksum)
++ memcpy(F_SUM(file), tmp_sum, checksum_len);
+ }
-+
- /* This code is only used by the receiver when it is building
- * a list of files for a delete pass. */
- if (keep_dirlinks && linkname_len && flist) {
-@@ -1877,6 +1880,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
+
+ if (unsort_ndx)
+ F_NDX(file) = stats.num_dirs;
+@@ -2075,6 +2077,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
| (eol_nulls || reading_remotely ? RL_EOL_NULLS : 0);
int implied_dot_dir = 0;
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
-@@ -58,6 +58,7 @@ extern int update_only;
+@@ -60,6 +60,7 @@ extern int human_readable;
extern int ignore_existing;
extern int ignore_non_existing;
extern int inplace;
extern int append_mode;
extern int make_backups;
extern int csum_length;
-@@ -721,7 +722,8 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
+@@ -530,7 +531,8 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
of the file time to determine whether to sync */
if (always_checksum > 0 && S_ISREG(st->st_mode)) {
char sum[MAX_DIGEST_LEN];
return memcmp(sum, F_SUM(file), checksum_len) == 0;
}
-@@ -2197,6 +2199,9 @@ void generate_files(int f_out, const char *local_name)
+@@ -2075,6 +2077,9 @@ void generate_files(int f_out, const char *local_name)
: "enabled");
}
+ if (use_db && always_checksum)
+ db_connect();
+
- /* Since we often fill up the outgoing socket and then just sit around
- * waiting for the other 2 processes to do their thing, we don't want
- * to exit on a timeout. If the data stops flowing, the receiver will
+ dflt_perms = (ACCESSPERMS & ~orig_umask);
+
+ do {
diff --git a/loadparm.c b/loadparm.c
--- a/loadparm.c
+++ b/loadparm.c
-@@ -126,6 +126,7 @@ typedef struct
+@@ -108,6 +108,7 @@ typedef struct {
char *auth_users;
char *charset;
char *comment;
char *dont_compress;
char *exclude;
char *exclude_from;
-@@ -177,6 +178,7 @@ static service sDefault =
+@@ -182,6 +183,7 @@ static const all_vars Defaults = {
/* auth_users; */ NULL,
/* charset; */ NULL,
/* comment; */ NULL,
/* dont_compress; */ DEFAULT_DONT_COMPRESS,
/* exclude; */ NULL,
/* exclude_from; */ NULL,
-@@ -307,6 +309,7 @@ static struct parm_struct parm_table[] =
- {"auth users", P_STRING, P_LOCAL, &sDefault.auth_users, NULL,0},
- {"charset", P_STRING, P_LOCAL, &sDefault.charset, NULL,0},
- {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL,0},
-+ {"db config", P_STRING, P_LOCAL, &sDefault.db_config, NULL,0},
- {"dont compress", P_STRING, P_LOCAL, &sDefault.dont_compress, NULL,0},
- {"exclude from", P_STRING, P_LOCAL, &sDefault.exclude_from, NULL,0},
- {"exclude", P_STRING, P_LOCAL, &sDefault.exclude, NULL,0},
-@@ -400,6 +403,7 @@ FN_GLOBAL_INTEGER(lp_rsync_port, &Globals.rsync_port)
+@@ -317,6 +319,7 @@ static struct parm_struct parm_table[] =
+ {"auth users", P_STRING, P_LOCAL, &Vars.l.auth_users, NULL,0},
+ {"charset", P_STRING, P_LOCAL, &Vars.l.charset, NULL,0},
+ {"comment", P_STRING, P_LOCAL, &Vars.l.comment, NULL,0},
++ {"db config", P_STRING, P_LOCAL, &Vars.l.db_config, NULL,0},
+ {"dont compress", P_STRING, P_LOCAL, &Vars.l.dont_compress, NULL,0},
+ {"exclude from", P_STRING, P_LOCAL, &Vars.l.exclude_from, NULL,0},
+ {"exclude", P_STRING, P_LOCAL, &Vars.l.exclude, NULL,0},
+@@ -447,6 +450,7 @@ FN_GLOBAL_INTEGER(lp_rsync_port, &Vars.g.rsync_port)
FN_LOCAL_STRING(lp_auth_users, auth_users)
FN_LOCAL_STRING(lp_charset, charset)
FN_LOCAL_STRING(lp_comment, comment)
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -49,6 +49,7 @@ extern int copy_unsafe_links;
+@@ -51,6 +51,7 @@ extern int copy_unsafe_links;
extern int keep_dirlinks;
extern int preserve_hard_links;
extern int protocol_version;
extern int file_total;
extern int recurse;
extern int xfer_dirs;
-@@ -73,6 +74,7 @@ extern char *partial_dir;
+@@ -83,6 +84,7 @@ extern char *filesfrom_host;
+ extern char *partial_dir;
extern char *dest_option;
- extern char *basis_dir[];
extern char *rsync_path;
+extern char *db_config;
extern char *shell_cmd;
extern char *batch_name;
extern char *password_file;
-@@ -1491,6 +1493,9 @@ int main(int argc,char *argv[])
+@@ -1609,6 +1611,9 @@ int main(int argc,char *argv[])
exit_cleanup(RERR_SYNTAX);
}
char *filesfrom_host = NULL;
+char *db_config = NULL;
int eol_nulls = 0;
- int protect_args = 0;
- int human_readable = 0;
-@@ -229,6 +230,7 @@ static void print_rsync_version(enum logcode f)
+ int protect_args = -1;
+ int human_readable = 1;
+@@ -567,6 +568,7 @@ static void print_rsync_version(enum logcode f)
char const *links = "no ";
char const *iconv = "no ";
char const *ipv6 = "no ";
STRUCT_STAT *dumstat;
#if SUBPROTOCOL_VERSION != 0
-@@ -261,6 +263,11 @@ static void print_rsync_version(enum logcode f)
- #if defined HAVE_LUTIMES && defined HAVE_UTIMES
+@@ -600,6 +602,11 @@ static void print_rsync_version(enum logcode f)
+ #ifdef CAN_SET_SYMLINK_TIMES
symtimes = "";
#endif
+#if defined HAVE_MYSQL_MYSQL_H && defined HAVE_LIBMYSQLCLIENT
rprintf(f, "%s version %s protocol version %d%s\n",
RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol);
-@@ -274,8 +281,8 @@ static void print_rsync_version(enum logcode f)
+@@ -613,8 +620,8 @@ static void print_rsync_version(enum logcode f)
(int)(sizeof (int64) * 8));
rprintf(f, " %ssocketpairs, %shardlinks, %ssymlinks, %sIPv6, batchfiles, %sinplace,\n",
got_socketpair, hardlinks, links, ipv6, have_inplace);
#ifdef MAINTAINER_MODE
rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
-@@ -321,6 +328,7 @@ void usage(enum logcode F)
+@@ -662,6 +669,7 @@ void usage(enum logcode F)
rprintf(F," -q, --quiet suppress non-error messages\n");
rprintf(F," --no-motd suppress daemon-mode MOTD (see manpage caveat)\n");
rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
rprintf(F," -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)\n");
rprintf(F," --no-OPTION turn off an implied OPTION (e.g. --no-D)\n");
rprintf(F," -r, --recursive recurse into directories\n");
-@@ -579,6 +587,7 @@ static struct poptOption long_options[] = {
+@@ -934,6 +942,7 @@ static struct poptOption long_options[] = {
{"checksum", 'c', POPT_ARG_VAL, &always_checksum, 1, 0, 0 },
{"no-checksum", 0, POPT_ARG_VAL, &always_checksum, 0, 0, 0 },
{"no-c", 0, POPT_ARG_VAL, &always_checksum, 0, 0, 0 },
diff --git a/pipe.c b/pipe.c
--- a/pipe.c
+++ b/pipe.c
-@@ -26,6 +26,9 @@ extern int am_sender;
- extern int am_server;
+@@ -27,6 +27,9 @@ extern int am_server;
extern int blocking_io;
extern int filesfrom_fd;
+ extern int munge_symlinks;
+extern int always_checksum;
+extern int use_db;
+extern char *db_config;
extern mode_t orig_umask;
extern char *logfile_name;
extern int remote_option_cnt;
-@@ -141,6 +144,9 @@ pid_t local_child(int argc, char **argv, int *f_in, int *f_out,
+@@ -143,6 +146,9 @@ pid_t local_child(int argc, char **argv, int *f_in, int *f_out,
logfile_close();
}
if (remote_option_cnt) {
int rc = remote_option_cnt + 1;
const char **rv = remote_options;
-@@ -148,6 +154,8 @@ pid_t local_child(int argc, char **argv, int *f_in, int *f_out,
+@@ -150,6 +156,8 @@ pid_t local_child(int argc, char **argv, int *f_in, int *f_out,
option_error();
exit_cleanup(RERR_SYNTAX);
}
diff --git a/rsync.yo b/rsync.yo
--- a/rsync.yo
+++ b/rsync.yo
-@@ -317,6 +317,7 @@ to the detailed description below for a complete description. verb(
+@@ -323,6 +323,7 @@ to the detailed description below for a complete description. verb(
-q, --quiet suppress non-error messages
--no-motd suppress daemon-mode MOTD (see caveat)
-c, --checksum skip based on checksum, not mod-time & size
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
-r, --recursive recurse into directories
-@@ -533,6 +534,47 @@ checksum that is generated as the file is transferred, but that
- automatic after-the-transfer verification has nothing to do with this
- option's before-the-transfer "Does this file need to be updated?" check.
+@@ -587,6 +588,47 @@ option's before-the-transfer "Does this file need to be updated?" check.
+ For protocol 30 and beyond (first supported in 3.0.0), the checksum used is
+ MD5. For older protocols, the checksum used is MD4.
+dit(bf(--db=CONFIG_FILE)) This option specifies a CONFIG_FILE to read
+that holds connection details for a database of checksum information.
diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo
--- a/rsyncd.conf.yo
+++ b/rsyncd.conf.yo
-@@ -270,6 +270,18 @@ is daemon. This setting has no effect if the "log file" setting is a
+@@ -301,6 +301,18 @@ is daemon. This setting has no effect if the "log file" setting is a
non-empty string (either set in the per-modules settings, or inherited
from the global settings).