X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/0ef5abcbbb95298fa9faf1d3eb275a9e76e1d951..7170ca8dba0a407cd0c91b41b48163c7b682abb1:/db.diff diff --git a/db.diff b/db.diff index 479fd6b..4cf967e 100644 --- a/db.diff +++ b/db.diff @@ -19,17 +19,17 @@ is used. Future improvements may include: To use this patch, run these commands for a successful build: - patch -p1 = 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); } @@ -82,15 +82,15 @@ diff --git a/checksum.c b/checksum.c diff --git a/cleanup.c b/cleanup.c --- a/cleanup.c +++ b/cleanup.c -@@ -27,6 +27,7 @@ extern int am_daemon; +@@ -25,6 +25,7 @@ + extern int am_server; + extern int am_daemon; 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 output_needs_newline; +@@ -130,6 +131,12 @@ NORETURN void _exit_cleanup(int code, const char *file, int line) /* FALLTHROUGH */ #include "case_N.h" @@ -121,9 +121,9 @@ diff --git a/clientserver.c b/clientserver.c extern mode_t orig_umask; +extern char *db_config; extern char *bind_address; - extern char *sockopts; extern char *config_file; -@@ -564,6 +567,9 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) + extern char *logfile_format; +@@ -642,6 +645,9 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char log_init(1); @@ -133,7 +133,7 @@ diff --git a/clientserver.c b/clientserver.c #ifdef HAVE_PUTENV if (*lp_prexfer_exec(i) || *lp_postxfer_exec(i)) { char *modname, *modpath, *hostaddr, *hostname, *username; -@@ -767,6 +773,10 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) +@@ -850,6 +856,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; @@ -147,7 +147,7 @@ diff --git a/clientserver.c b/clientserver.c 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 \ +@@ -312,7 +312,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 \ @@ -156,7 +156,7 @@ diff --git a/configure.in b/configure.in 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" +@@ -977,6 +977,29 @@ if test x"$enable_acl_support" = x"no" -o x"$enable_xattr_support" = x"no" -o x" fi fi @@ -760,35 +760,44 @@ new file mode 100644 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 preserve_specials; + 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; -@@ -1286,14 +1287,16 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, - memcpy(bp + basename_len, linkname, linkname_len); +@@ -1276,11 +1277,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)) +@@ -1357,8 +1355,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); + } -+ - if (basename_len == 0+1) { - if (!pool) - unmake_file(file); -@@ -1936,6 +1939,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) + + if (unsort_ndx) + F_NDX(file) = stats.num_dirs; +@@ -2020,6 +2022,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; @@ -801,7 +810,7 @@ diff --git a/flist.c b/flist.c 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; @@ -809,7 +818,7 @@ diff --git a/generator.c b/generator.c extern int append_mode; extern int make_backups; extern int csum_length; -@@ -724,7 +725,8 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st) +@@ -531,7 +532,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]; @@ -819,7 +828,7 @@ diff --git a/generator.c b/generator.c return memcmp(sum, F_SUM(file), checksum_len) == 0; } -@@ -2206,6 +2208,9 @@ void generate_files(int f_out, const char *local_name) +@@ -2017,6 +2019,9 @@ void generate_files(int f_out, const char *local_name) : "enabled"); } @@ -832,7 +841,7 @@ diff --git a/generator.c b/generator.c diff --git a/loadparm.c b/loadparm.c --- a/loadparm.c +++ b/loadparm.c -@@ -126,6 +126,7 @@ typedef struct +@@ -107,6 +107,7 @@ typedef struct { char *auth_users; char *charset; char *comment; @@ -840,7 +849,7 @@ diff --git a/loadparm.c b/loadparm.c char *dont_compress; char *exclude; char *exclude_from; -@@ -177,6 +178,7 @@ static service sDefault = +@@ -181,6 +182,7 @@ static const all_vars Defaults = { /* auth_users; */ NULL, /* charset; */ NULL, /* comment; */ NULL, @@ -848,15 +857,15 @@ diff --git a/loadparm.c b/loadparm.c /* 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) +@@ -316,6 +318,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}, +@@ -396,6 +399,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) @@ -875,15 +884,15 @@ diff --git a/main.c b/main.c extern int file_total; extern int recurse; extern int xfer_dirs; -@@ -73,6 +74,7 @@ extern char *partial_dir; +@@ -74,6 +75,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[]) +@@ -1577,6 +1579,9 @@ int main(int argc,char *argv[]) exit_cleanup(RERR_SYNTAX); } @@ -903,8 +912,8 @@ diff --git a/options.c b/options.c +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 human_readable = 1; +@@ -566,6 +567,7 @@ static void print_rsync_version(enum logcode f) char const *links = "no "; char const *iconv = "no "; char const *ipv6 = "no "; @@ -912,7 +921,7 @@ diff --git a/options.c b/options.c STRUCT_STAT *dumstat; #if SUBPROTOCOL_VERSION != 0 -@@ -262,6 +264,11 @@ static void print_rsync_version(enum logcode f) +@@ -599,6 +601,11 @@ static void print_rsync_version(enum logcode f) #if defined HAVE_LUTIMES && defined HAVE_UTIMES symtimes = ""; #endif @@ -924,7 +933,7 @@ diff --git a/options.c b/options.c rprintf(f, "%s version %s protocol version %d%s\n", RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol); -@@ -275,8 +282,8 @@ static void print_rsync_version(enum logcode f) +@@ -612,8 +619,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); @@ -935,7 +944,7 @@ diff --git a/options.c b/options.c #ifdef MAINTAINER_MODE rprintf(f, "Panic Action: \"%s\"\n", get_panic_action()); -@@ -322,6 +329,7 @@ void usage(enum logcode F) +@@ -661,6 +668,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"); @@ -943,7 +952,7 @@ diff --git a/options.c b/options.c 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"); -@@ -580,6 +588,7 @@ static struct poptOption long_options[] = { +@@ -933,6 +941,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 }, @@ -954,17 +963,17 @@ diff --git a/options.c b/options.c 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(); } @@ -974,7 +983,7 @@ diff --git a/pipe.c b/pipe.c 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); } @@ -986,7 +995,7 @@ diff --git a/pipe.c b/pipe.c diff --git a/rsync.yo b/rsync.yo --- a/rsync.yo +++ b/rsync.yo -@@ -321,6 +321,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 @@ -994,9 +1003,9 @@ diff --git a/rsync.yo b/rsync.yo -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 -@@ -537,6 +538,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. @@ -1045,7 +1054,7 @@ diff --git a/rsync.yo b/rsync.yo 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 +@@ -281,6 +281,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). @@ -1068,10 +1077,9 @@ diff --git a/support/rsyncdb b/support/rsyncdb new file mode 100755 --- /dev/null +++ b/support/rsyncdb -@@ -0,0 +1,332 @@ -+#!/usr/bin/perl +@@ -0,0 +1,331 @@ ++#!/usr/bin/perl -w +use strict; -+use warnings; + +use DBI; +use Getopt::Long;