Hello community,
here is the log from the commit of package rsync
checked in at Wed Sep 24 17:27:45 CEST 2008.
--------
--- rsync/rsync.changes 2008-09-04 12:57:47.000000000 +0200
+++ /mounts/work_src_done/STABLE/rsync/rsync.changes 2008-09-22 14:32:15.000000000 +0200
@@ -1,0 +2,8 @@
+Mon Sep 22 13:24:57 CEST 2008 - puzel@suse.cz
+
+- update to 3.0.4
+ - update to stable release
+- removed rsync-3.0.4pre2-xattrs-test-fix.patch
+ - fixed in upstream
+
+-------------------------------------------------------------------
Old:
----
rsync-3.0.4pre2.tar.bz2
rsync-3.0.4pre2-xattrs-test-fix.patch
rsync-patches-3.0.4pre2.tar.bz2
New:
----
rsync-3.0.4.tar.bz2
rsync-patches-3.0.4.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rsync.spec ++++++
--- /var/tmp/diff_new_pack.L19826/_old 2008-09-24 17:27:19.000000000 +0200
+++ /var/tmp/diff_new_pack.L19826/_new 2008-09-24 17:27:19.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package rsync (Version 3.0.3.90)
+# spec file for package rsync (Version 3.0.4)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@@ -31,11 +31,11 @@
Group: Productivity/Networking/Other
PreReq: %fillup_prereq %insserv_prereq sed grep
AutoReqProv: on
-Version: 3.0.3.90
+Version: 3.0.4
Release: 1
Summary: Replacement for RCP/mirror that has Many More Features
-Source: rsync-3.0.4pre2.tar.bz2
-Source1: rsync-patches-3.0.4pre2.tar.bz2
+Source: %{name}-%{version}.tar.bz2
+Source1: %{name}-patches-%{version}.tar.bz2
Source2: logrotate.rsync
Source3: rsync.xinetd
Source4: rsyncd.rc
@@ -43,7 +43,6 @@
Source6: rsyncd.secrets
Source7: NEWS-rsync-3.0.3
Patch3: system-zlib.diff
-Patch5: rsync-3.0.4pre2-xattrs-test-fix.patch
Url: http://rsync.samba.org/
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%define with_system_zlib 0
@@ -67,7 +66,7 @@
Paul Mackerras
%prep
-%setup -n rsync-3.0.4pre2 -q -b 1
+%setup -q -b 1
%if %with_system_zlib
rm -f zlib/*.h
%patch3
@@ -76,7 +75,6 @@
patch -p1 < patches/xattrs.diff
patch -p1 < patches/slp.diff
cp %{SOURCE7} .
-%patch5
%build
autoheader
@@ -143,6 +141,11 @@
%doc COPYING NEWS NEWS-rsync-3.0.3 README tech_report.ps tech_report.tex
%changelog
+* Mon Sep 22 2008 puzel@suse.cz
+- update to 3.0.4
+ - update to stable release
+- removed rsync-3.0.4pre2-xattrs-test-fix.patch
+ - fixed in upstream
* Thu Sep 04 2008 puzel@suse.cz
- update to 3.0.4pre2
- Fixed the handling of a --partial-dir that cannot be created.
++++++ rsync-3.0.4pre2.tar.bz2 -> rsync-3.0.4.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/configure.in new/rsync-3.0.4/configure.in
--- old/rsync-3.0.4pre2/configure.in 2008-08-02 23:06:31.000000000 +0200
+++ new/rsync-3.0.4/configure.in 2008-09-06 18:32:26.000000000 +0200
@@ -5,7 +5,7 @@
AC_CONFIG_HEADER(config.h)
AC_PREREQ(2.59)
-RSYNC_VERSION=3.0.4pre2
+RSYNC_VERSION=3.0.4
AC_SUBST(RSYNC_VERSION)
AC_MSG_NOTICE([Configuring rsync $RSYNC_VERSION])
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/configure.sh new/rsync-3.0.4/configure.sh
--- old/rsync-3.0.4pre2/configure.sh 2008-08-02 23:13:27.000000000 +0200
+++ new/rsync-3.0.4/configure.sh 2008-09-06 18:33:01.000000000 +0200
@@ -1731,7 +1731,7 @@
-RSYNC_VERSION=3.0.4pre2
+RSYNC_VERSION=3.0.4
{ echo "$as_me:$LINENO: Configuring rsync $RSYNC_VERSION" >&5
echo "$as_me: Configuring rsync $RSYNC_VERSION" >&6;}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/flist.c new/rsync-3.0.4/flist.c
--- old/rsync-3.0.4pre2/flist.c 2008-08-02 22:45:15.000000000 +0200
+++ new/rsync-3.0.4/flist.c 2008-08-10 16:31:45.000000000 +0200
@@ -1126,7 +1126,7 @@
}
} else {
io_error |= IOERR_GENERAL;
- rsyserr(FERROR_XFER, save_errno, "readlink %s failed",
+ rsyserr(FERROR_XFER, save_errno, "readlink_stat(%s) failed",
full_fname(thisname));
}
return NULL;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/generator.c new/rsync-3.0.4/generator.c
--- old/rsync-3.0.4pre2/generator.c 2008-08-02 18:03:49.000000000 +0200
+++ new/rsync-3.0.4/generator.c 2008-08-31 18:51:29.000000000 +0200
@@ -89,7 +89,6 @@
extern int max_delete;
extern int force_delete;
extern int one_file_system;
-extern int check_for_io_err;
extern struct stats stats;
extern dev_t filesystem_dev;
extern mode_t orig_umask;
@@ -2079,8 +2078,7 @@
while (1) {
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && (ndx = get_hlink_num()) != -1) {
- flist = flist_for_ndx(ndx);
- assert(flist != NULL);
+ flist = flist_for_ndx(ndx, "check_for_finished_files.1");
file = flist->files[ndx - flist->ndx_start];
assert(file->flags & FLAG_HLINKED);
finish_hard_link(file, f_name(file, fbuf), ndx, NULL, itemizing, code, -1);
@@ -2103,7 +2101,7 @@
ignore_times++;
flist = cur_flist;
- cur_flist = flist_for_ndx(ndx);
+ cur_flist = flist_for_ndx(ndx, "check_for_finished_files.2");
file = cur_flist->files[ndx - cur_flist->ndx_start];
if (solo_file)
@@ -2238,10 +2236,6 @@
dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
} else
dirdev = MAKEDEV(0, 0);
- /* We must be sure we've had a chance to receive an I/O
- * error for this directory before we delete in it. */
- while (check_for_io_err && !cur_flist->next)
- wait_for_receiver();
delete_in_dir(fbuf, fp, &dirdev);
} else
change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(fp));
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/.gitignore new/rsync-3.0.4/.gitignore
--- old/rsync-3.0.4pre2/.gitignore 2008-07-24 08:28:57.000000000 +0200
+++ new/rsync-3.0.4/.gitignore 2008-08-17 18:28:06.000000000 +0200
@@ -35,6 +35,7 @@
/rounding.h
/doc/rsync.pdf
/doc/rsync.ps
+/support/savetransfer
/testsuite/chown-fake.test
/testsuite/devices-fake.test
/patches
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/hlink.c new/rsync-3.0.4/hlink.c
--- old/rsync-3.0.4pre2/hlink.c 2008-07-23 06:34:20.000000000 +0200
+++ new/rsync-3.0.4/hlink.c 2008-08-14 16:32:18.000000000 +0200
@@ -37,7 +37,7 @@
extern int maybe_ATTRS_REPORT;
extern int unsort_ndx;
extern char *basis_dir[];
-extern struct file_list *cur_flist, *first_flist;
+extern struct file_list *cur_flist;
#ifdef SUPPORT_HARD_LINKS
@@ -119,14 +119,15 @@
if (inc_recurse) {
node = hashtable_find(prior_hlinks, gnum, 1);
if (!node->data) {
- node->data = new_array0(char, 5);
+ if (!(node->data = new_array0(char, 5)))
+ out_of_memory("match_gnums");
assert(gnum >= hlink_flist->ndx_start);
file->flags |= FLAG_HLINK_FIRST;
prev = -1;
} else if (CVAL(node->data, 0) == 0) {
struct file_list *flist;
prev = IVAL(node->data, 1);
- flist = flist_for_ndx(prev);
+ flist = flist_for_ndx(prev, NULL);
if (flist)
flist->files[prev - flist->ndx_start]->flags &= ~FLAG_HLINK_LAST;
else {
@@ -255,7 +256,7 @@
while (1) {
struct file_list *flist;
if (prev_ndx < 0
- || (flist = flist_for_ndx(prev_ndx)) == NULL)
+ || (flist = flist_for_ndx(prev_ndx, NULL)) == NULL)
break;
fp = flist->files[prev_ndx - flist->ndx_start];
if (!(fp->flags & FLAG_SKIP_HLINK)) {
@@ -477,16 +478,7 @@
while ((ndx = prev_ndx) >= 0) {
int val;
- flist = flist_for_ndx(ndx);
- if (flist == NULL) {
- int start1 = first_flist ? first_flist->ndx_start : 0;
- int start2 = first_flist ? first_flist->prev->ndx_start : 0;
- int used = first_flist ? first_flist->prev->used : 0;
- rprintf(FERROR,
- "File index not found: %d (%d - %d)\n",
- ndx, start1 - 1, start2 + used - 1);
- exit_cleanup(RERR_PROTOCOL);
- }
+ flist = flist_for_ndx(ndx, "finish_hard_link");
file = flist->files[ndx - flist->ndx_start];
file->flags = (file->flags & ~FLAG_HLINK_FIRST) | FLAG_HLINK_DONE;
prev_ndx = F_HL_PREV(file);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/io.c new/rsync-3.0.4/io.c
--- old/rsync-3.0.4pre2/io.c 2008-08-02 19:25:17.000000000 +0200
+++ new/rsync-3.0.4/io.c 2008-08-31 18:51:29.000000000 +0200
@@ -64,7 +64,6 @@
int ignore_timeout = 0;
int batch_fd = -1;
int msgdone_cnt = 0;
-int check_for_io_err = 0;
/* Ignore an EOF error if non-zero. See whine_about_eof(). */
int kluge_around_eof = 0;
@@ -102,7 +101,7 @@
#ifdef ICONV_OPTION
static xbuf iconv_buf = EMPTY_XBUF;
#endif
-static int defer_forwarding_messages = 0, defer_forwarding_keep = 0;
+static int defer_forwarding_messages = 0, keep_defer_forwarding = 0;
static int select_timeout = SELECT_TIMEOUT;
static int active_filecnt = 0;
static OFF_T active_bytecnt = 0;
@@ -184,9 +183,7 @@
static void got_flist_entry_status(enum festatus status, const char *buf)
{
int ndx = IVAL(buf, 0);
- struct file_list *flist = flist_for_ndx(ndx);
-
- assert(flist != NULL);
+ struct file_list *flist = flist_for_ndx(ndx, "got_flist_entry_status");
if (remove_source_files) {
active_filecnt--;
@@ -297,33 +294,32 @@
lst->tail = m;
}
+static inline int flush_a_msg(int fd)
+{
+ struct msg_list_item *m = msg_queue.head;
+ int len = IVAL(m->buf, 0) & 0xFFFFFF;
+ int tag = *((uchar*)m->buf+3) - MPLEX_BASE;
+
+ if (!(msg_queue.head = m->next))
+ msg_queue.tail = NULL;
+
+ defer_forwarding_messages++;
+ mplex_write(fd, tag, m->buf + 4, len, m->convert);
+ defer_forwarding_messages--;
+
+ free(m);
+
+ return len;
+}
+
static void msg_flush(void)
{
if (am_generator) {
- while (msg_queue.head && io_multiplexing_out) {
- struct msg_list_item *m = msg_queue.head;
- int len = IVAL(m->buf, 0) & 0xFFFFFF;
- int tag = *((uchar*)m->buf+3) - MPLEX_BASE;
- if (!(msg_queue.head = m->next))
- msg_queue.tail = NULL;
- stats.total_written += len + 4;
- defer_forwarding_messages++;
- mplex_write(sock_f_out, tag, m->buf + 4, len, m->convert);
- defer_forwarding_messages--;
- free(m);
- }
+ while (msg_queue.head && io_multiplexing_out)
+ stats.total_written += flush_a_msg(sock_f_out) + 4;
} else {
- while (msg_queue.head) {
- struct msg_list_item *m = msg_queue.head;
- int len = IVAL(m->buf, 0) & 0xFFFFFF;
- int tag = *((uchar*)m->buf+3) - MPLEX_BASE;
- if (!(msg_queue.head = m->next))
- msg_queue.tail = NULL;
- defer_forwarding_messages++;
- mplex_write(msg_fd_out, tag, m->buf + 4, len, m->convert);
- defer_forwarding_messages--;
- free(m);
- }
+ while (msg_queue.head)
+ (void)flush_a_msg(msg_fd_out);
}
}
@@ -381,8 +377,6 @@
len = tag & 0xFFFFFF;
tag = (tag >> 24) - MPLEX_BASE;
- check_for_io_err = 0;
-
switch (tag) {
case MSG_DONE:
if (len < 0 || len > 1 || !am_generator) {
@@ -417,9 +411,6 @@
}
flist = recv_file_list(fd);
flist->parent_ndx = IVAL(buf,0);
- /* If the sender is going to send us an MSG_IO_ERROR value, it
- * will always be the very next message following MSG_FLIST. */
- check_for_io_err = 1;
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links)
match_hard_links(flist);
@@ -538,9 +529,9 @@
SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
- defer_forwarding_keep = 1; /* defer_forwarding_messages++ on return */
+ keep_defer_forwarding++; /* defer_forwarding_messages++ on return */
writefd_unbuffered(fd, buffer, n+4);
- defer_forwarding_keep = 0;
+ keep_defer_forwarding--;
if (len > n)
writefd_unbuffered(fd, buf+n, len-n);
@@ -575,10 +566,9 @@
void wait_for_receiver(void)
{
- if (iobuf_out_cnt)
- io_flush(NORMAL_FLUSH);
- else
- read_msg_fd();
+ if (io_flush(NORMAL_FLUSH))
+ return;
+ read_msg_fd();
}
int get_redo_num(void)
@@ -1068,8 +1058,6 @@
msg_bytes = tag & 0xFFFFFF;
tag = (tag >> 24) - MPLEX_BASE;
- check_for_io_err = 0;
-
switch (tag) {
case MSG_DATA:
if (msg_bytes > iobuf_in_siz) {
@@ -1564,24 +1552,34 @@
}
no_flush--;
- defer_inc -= defer_forwarding_keep;
+ if (keep_defer_forwarding)
+ defer_inc--;
if (!(defer_forwarding_messages -= defer_inc) && !no_flush)
msg_flush();
}
-void io_flush(int flush_it_all)
+int io_flush(int flush_it_all)
{
- if (!iobuf_out_cnt || no_flush)
- return;
+ int flushed_something = 0;
- if (io_multiplexing_out)
- mplex_write(sock_f_out, MSG_DATA, iobuf_out, iobuf_out_cnt, 0);
- else
- writefd_unbuffered(iobuf_f_out, iobuf_out, iobuf_out_cnt);
- iobuf_out_cnt = 0;
+ if (no_flush)
+ return 0;
+
+ if (iobuf_out_cnt) {
+ if (io_multiplexing_out)
+ mplex_write(sock_f_out, MSG_DATA, iobuf_out, iobuf_out_cnt, 0);
+ else
+ writefd_unbuffered(iobuf_f_out, iobuf_out, iobuf_out_cnt);
+ iobuf_out_cnt = 0;
+ flushed_something = 1;
+ }
- if (flush_it_all && !defer_forwarding_messages)
+ if (flush_it_all && !defer_forwarding_messages && msg_queue.head) {
msg_flush();
+ flushed_something = 1;
+ }
+
+ return flushed_something;
}
static void writefd(int fd, const char *buf, size_t len)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/log.c new/rsync-3.0.4/log.c
--- old/rsync-3.0.4pre2/log.c 2008-08-02 19:25:17.000000000 +0200
+++ new/rsync-3.0.4/log.c 2008-08-17 18:25:34.000000000 +0200
@@ -85,7 +85,7 @@
{ RERR_SIGNAL , "received SIGINT, SIGTERM, or SIGHUP" },
{ RERR_WAITCHILD , "waitpid() failed" },
{ RERR_MALLOC , "error allocating core memory buffers" },
- { RERR_PARTIAL , "some files could not be transferred" },
+ { RERR_PARTIAL , "some files/attrs were not transferred (see previous errors)" },
{ RERR_VANISHED , "some files vanished before they could be transferred" },
{ RERR_TIMEOUT , "timeout in data send/receive" },
{ RERR_CONTIMEOUT , "timeout waiting for daemon connection" },
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/main.c new/rsync-3.0.4/main.c
--- old/rsync-3.0.4pre2/main.c 2008-08-02 18:03:49.000000000 +0200
+++ new/rsync-3.0.4/main.c 2008-08-31 18:51:29.000000000 +0200
@@ -63,11 +63,8 @@
extern int read_batch;
extern int write_batch;
extern int batch_fd;
-extern int flist_eof;
extern int filesfrom_fd;
-extern int delete_during;
extern int connect_timeout;
-extern int check_for_io_err;
extern pid_t cleanup_child_pid;
extern unsigned int module_dirlen;
extern struct stats stats;
@@ -762,8 +759,6 @@
exit_cleanup(RERR_IPC);
}
- check_for_io_err = inc_recurse && delete_during && !flist_eof;
-
if (pid == 0) {
close(error_pipe[0]);
if (f_in != f_out)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/NEWS new/rsync-3.0.4/NEWS
--- old/rsync-3.0.4pre2/NEWS 2008-08-02 19:25:17.000000000 +0200
+++ new/rsync-3.0.4/NEWS 2008-09-06 18:32:26.000000000 +0200
@@ -1,4 +1,4 @@
-NEWS for rsync 3.0.4 (UNRELEASED)
+NEWS for rsync 3.0.4 (6 Sep 2008)
Protocol: 30 (unchanged)
Changes since 3.0.3:
@@ -23,22 +23,26 @@
incremental-recursion mode when --timeout is enabled.
- The --iconv option now converts the content of a symlink too, instead
- of leaving it in the wrong character-set.
+ of leaving it in the wrong character-set (requires 3.0.4 on both sides
+ of the transfer).
- When using --iconv, if a filename fails to convert on the receiving side,
- this no longer interferes with deletions in the root-dir of the transfer.
+ this no longer makes deletions in the root-dir of the transfer fail
+ silently (the user now gets a warning about deletions being disabled
+ due to IO error as long as --ignore-errors was not specified).
- When using --iconv, if a server-side receiver can't convert a filename,
- it now outputs the name back to the client without mangling the charset.
-
- - Fixed a bug where --delete-during could delete in a directory before it
- noticed that the sending side sent an I/O error for that directory.
+ the error message sent back to the client no longer mangles the name
+ with the wrong charset conversion.
- Fixed a potential alignment issue in the IRIX ACL code when allocating
the initial "struct acl" object. Also, cast mallocs to avoid warnings.
- Changed some errors that were going to stdout to go to stderr.
+ - Made human_num() and human_dnum() able to output a negative number
+ (rather than outputting a cryptic string of punctuation).
+
ENHANCEMENTS:
- Rsync will avoid sending an -e option to the server if an older protocol
@@ -46,9 +50,15 @@
user specify the --protocol=29 option to access an overly-restrictive
server that is rejecting the protocol-30 use of -e to the server.
+ - Improved the message output for an RERR_PARTIAL exit.
+
DEVELOPER RELATED:
- The Makefile will not halt for just a timestamp change on the Makefile
or the configure files, only for actual changes in content.
- - Enhanced the release scripts to be able to handle a branch release.
+ - Changed some commands in the testsuite's xattrs.test that called "rsync"
+ instead of "$RSYNC".
+
+ - Enhanced the release scripts to be able to handle a branch release and
+ to do even more consistency checks on the files.
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/OLDNEWS new/rsync-3.0.4/OLDNEWS
--- old/rsync-3.0.4pre2/OLDNEWS 2008-07-30 17:33:35.000000000 +0200
+++ new/rsync-3.0.4/OLDNEWS 2008-09-06 18:32:26.000000000 +0200
@@ -2841,7 +2841,7 @@
Partial Protocol History
RELEASE DATE VER. DATE OF COMMIT* PROTOCOL
- ?? Aug 2008 3.0.4 30
+ 06 Sep 2008 3.0.4 30
29 Jun 2008 3.0.3 30
08 Apr 2008 3.0.2 30
03 Apr 2008 3.0.1 30
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/packaging/lsb/rsync.spec new/rsync-3.0.4/packaging/lsb/rsync.spec
--- old/rsync-3.0.4pre2/packaging/lsb/rsync.spec 2008-08-02 23:06:31.000000000 +0200
+++ new/rsync-3.0.4/packaging/lsb/rsync.spec 2008-09-06 18:32:26.000000000 +0200
@@ -1,9 +1,9 @@
Summary: A fast, versatile, remote (and local) file-copying tool
Name: rsync
Version: 3.0.4
-%define fullversion %{version}pre2
-Release: 0.1.pre2
-%define srcdir src-previews
+%define fullversion %{version}
+Release: 1
+%define srcdir src
Group: Applications/Internet
Source0: http://rsync.samba.org/ftp/rsync/%{srcdir}/rsync-%{fullversion}.tar.gz
#Source1: http://rsync.samba.org/ftp/rsync/%{srcdir}/rsync-patches-%{fullversion}.tar.gz
@@ -66,8 +66,8 @@
%{_mandir}/man5/rsyncd.conf.5*
%changelog
-* Sat Aug 02 2008 Wayne Davison
-Released 3.0.4pre2.
+* Sat Sep 06 2008 Wayne Davison
+Released 3.0.4.
* Fri Mar 21 2008 Wayne Davison
Added installation of /etc/xinetd.d/rsync file and some commented-out
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/proto.h new/rsync-3.0.4/proto.h
--- old/rsync-3.0.4pre2/proto.h 2008-08-02 23:13:27.000000000 +0200
+++ new/rsync-3.0.4/proto.h 2008-09-06 18:33:01.000000000 +0200
@@ -155,7 +155,7 @@
int read_vstring(int f, char *buf, int bufsize);
void read_sum_head(int f, struct sum_struct *sum);
void write_sum_head(int f, struct sum_struct *sum);
-void io_flush(int flush_it_all);
+int io_flush(int flush_it_all);
void write_shortint(int f, unsigned short x);
void write_int(int f, int32 x);
void write_varint(int f, int32 x);
@@ -279,7 +279,7 @@
const char *fnamecmp, const char *partialptr,
struct file_struct *file, int ok_to_set_time,
int overwriting_basis);
-struct file_list *flist_for_ndx(int ndx);
+struct file_list *flist_for_ndx(int ndx, const char *fatal_error_loc);
const char *who_am_i(void);
void successful_send(int ndx);
void send_files(int f_in, int f_out);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/rsync.1 new/rsync-3.0.4/rsync.1
--- old/rsync-3.0.4pre2/rsync.1 2008-08-02 23:13:28.000000000 +0200
+++ new/rsync-3.0.4/rsync.1 2008-09-06 18:33:02.000000000 +0200
@@ -1,4 +1,4 @@
-.TH "rsync" "1" "2 Aug 2008" "" ""
+.TH "rsync" "1" "6 Sep 2008" "" ""
.SH "NAME"
rsync \(em a fast, versatile, remote (and local) file-copying tool
.SH "SYNOPSIS"
@@ -3390,7 +3390,7 @@
.SH "VERSION"
.PP
-This man page is current for version 3.0.4pre2 of rsync.
+This man page is current for version 3.0.4 of rsync.
.PP
.SH "INTERNAL OPTIONS"
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/rsync.c new/rsync-3.0.4/rsync.c
--- old/rsync-3.0.4pre2/rsync.c 2008-08-02 18:03:49.000000000 +0200
+++ new/rsync-3.0.4/rsync.c 2008-08-31 18:51:29.000000000 +0200
@@ -48,8 +48,6 @@
extern int flist_eof;
extern int keep_dirlinks;
extern int make_backups;
-extern int delete_during;
-extern int check_for_io_err;
extern struct file_list *cur_flist, *first_flist, *dir_flist;
extern struct chmod_mode_struct *daemon_chmod_modes;
#ifdef ICONV_OPTION
@@ -255,19 +253,21 @@
while (1) {
ndx = read_ndx(f_in);
- if (ndx >= 0) {
- if (check_for_io_err) {
- /* Let generator know there was no I/O error. */
- send_msg_int(MSG_IO_ERROR, 0);
- check_for_io_err = 0;
- }
+ if (ndx >= 0)
break;
- }
- check_for_io_err = 0;
if (ndx == NDX_DONE)
return ndx;
- if (!inc_recurse || am_sender)
- goto invalid_ndx;
+ if (!inc_recurse || am_sender) {
+ int last;
+ if (first_flist)
+ last = first_flist->prev->ndx_start + first_flist->prev->used - 1;
+ else
+ last = -1;
+ rprintf(FERROR,
+ "Invalid file index: %d (%d - %d) [%s]\n",
+ ndx, NDX_DONE, last, who_am_i());
+ exit_cleanup(RERR_PROTOCOL);
+ }
if (ndx == NDX_FLIST_EOF) {
flist_eof = 1;
send_msg(MSG_FLIST_EOF, "", 0, 0);
@@ -277,9 +277,10 @@
if (ndx < 0 || ndx >= dir_flist->used) {
ndx = NDX_FLIST_OFFSET - ndx;
rprintf(FERROR,
- "[%s] Invalid dir index: %d (%d - %d)\n",
- who_am_i(), ndx, NDX_FLIST_OFFSET,
- NDX_FLIST_OFFSET - dir_flist->used + 1);
+ "Invalid dir index: %d (%d - %d) [%s]\n",
+ ndx, NDX_FLIST_OFFSET,
+ NDX_FLIST_OFFSET - dir_flist->used + 1,
+ who_am_i());
exit_cleanup(RERR_PROTOCOL);
}
@@ -295,10 +296,6 @@
flist->parent_ndx = ndx;
stop_flist_forward();
verbose = save_verbose;
- /* If the sender is going to send us an MSG_IO_ERROR value, it
- * will always be the very next message following a file list. */
- if (delete_during)
- check_for_io_err = 1;
}
iflags = protocol_version >= 29 ? read_shortint(f_in)
@@ -312,17 +309,7 @@
goto read_loop;
}
- if (!(flist = flist_for_ndx(ndx))) {
- int start, used;
- invalid_ndx:
- start = first_flist ? first_flist->ndx_start : 0;
- used = first_flist ? first_flist->used : 0;
- rprintf(FERROR,
- "Invalid file index: %d (%d - %d) with iflags %x [%s]\n",
- ndx, start - 1, start + used -1, iflags, who_am_i());
- exit_cleanup(RERR_PROTOCOL);
- }
- cur_flist = flist;
+ cur_flist = flist_for_ndx(ndx, "read_ndx_and_attrs");
if (iflags & ITEM_BASIS_TYPE_FOLLOWS)
fnamecmp_type = read_byte(f_in);
@@ -623,23 +610,40 @@
return 1;
}
-struct file_list *flist_for_ndx(int ndx)
+struct file_list *flist_for_ndx(int ndx, const char *fatal_error_loc)
{
struct file_list *flist = cur_flist;
if (!flist && !(flist = first_flist))
- return NULL;
+ goto not_found;
while (ndx < flist->ndx_start-1) {
if (flist == first_flist)
- return NULL;
+ goto not_found;
flist = flist->prev;
}
while (ndx >= flist->ndx_start + flist->used) {
if (!(flist = flist->next))
- return NULL;
+ goto not_found;
}
return flist;
+
+ not_found:
+ if (fatal_error_loc) {
+ int first, last;
+ if (first_flist) {
+ first = first_flist->ndx_start - 1;
+ last = first_flist->prev->ndx_start + first_flist->prev->used - 1;
+ } else {
+ first = 0;
+ last = -1;
+ }
+ rprintf(FERROR,
+ "File-list index %d not in %d - %d (%s) [%s]\n",
+ ndx, first, last, fatal_error_loc, who_am_i());
+ exit_cleanup(RERR_PROTOCOL);
+ }
+ return NULL;
}
const char *who_am_i(void)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/rsyncd.conf.5 new/rsync-3.0.4/rsyncd.conf.5
--- old/rsync-3.0.4pre2/rsyncd.conf.5 2008-08-02 23:13:28.000000000 +0200
+++ new/rsync-3.0.4/rsyncd.conf.5 2008-09-06 18:33:03.000000000 +0200
@@ -1,4 +1,4 @@
-.TH "rsyncd.conf" "5" "2 Aug 2008" "" ""
+.TH "rsyncd.conf" "5" "6 Sep 2008" "" ""
.SH "NAME"
rsyncd.conf \(em configuration file for rsync in daemon mode
.SH "SYNOPSIS"
@@ -822,7 +822,7 @@
.SH "VERSION"
.PP
-This man page is current for version 3.0.4pre2 of rsync.
+This man page is current for version 3.0.4 of rsync.
.PP
.SH "CREDITS"
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/rsyncd.conf.yo new/rsync-3.0.4/rsyncd.conf.yo
--- old/rsync-3.0.4pre2/rsyncd.conf.yo 2008-08-02 23:06:31.000000000 +0200
+++ new/rsync-3.0.4/rsyncd.conf.yo 2008-09-06 18:32:26.000000000 +0200
@@ -1,5 +1,5 @@
mailto(rsync-bugs@samba.org)
-manpage(rsyncd.conf)(5)(2 Aug 2008)()()
+manpage(rsyncd.conf)(5)(6 Sep 2008)()()
manpagename(rsyncd.conf)(configuration file for rsync in daemon mode)
manpagesynopsis()
@@ -700,7 +700,7 @@
manpagesection(VERSION)
-This man page is current for version 3.0.4pre2 of rsync.
+This man page is current for version 3.0.4 of rsync.
manpagesection(CREDITS)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/rsync.yo new/rsync-3.0.4/rsync.yo
--- old/rsync-3.0.4pre2/rsync.yo 2008-08-02 23:06:31.000000000 +0200
+++ new/rsync-3.0.4/rsync.yo 2008-09-06 18:32:26.000000000 +0200
@@ -1,5 +1,5 @@
mailto(rsync-bugs@samba.org)
-manpage(rsync)(1)(2 Aug 2008)()()
+manpage(rsync)(1)(6 Sep 2008)()()
manpagename(rsync)(a fast, versatile, remote (and local) file-copying tool)
manpagesynopsis()
@@ -2894,7 +2894,7 @@
manpagesection(VERSION)
-This man page is current for version 3.0.4pre2 of rsync.
+This man page is current for version 3.0.4 of rsync.
manpagesection(INTERNAL OPTIONS)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/sender.c new/rsync-3.0.4/sender.c
--- old/rsync-3.0.4pre2/sender.c 2008-07-31 16:57:55.000000000 +0200
+++ new/rsync-3.0.4/sender.c 2008-08-14 16:32:18.000000000 +0200
@@ -127,13 +127,7 @@
if (!remove_source_files)
return;
- if (!(flist = flist_for_ndx(ndx))) {
- rprintf(FERROR,
- "INTERNAL ERROR: unable to find flist for item %d\n",
- ndx);
- return;
- }
-
+ flist = flist_for_ndx(ndx, "successful_send");
file = flist->files[ndx - flist->ndx_start];
if (!change_pathname(file, NULL, 0))
return;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/testsuite/xattrs.test new/rsync-3.0.4/testsuite/xattrs.test
--- old/rsync-3.0.4pre2/testsuite/xattrs.test 2008-07-24 16:57:57.000000000 +0200
+++ new/rsync-3.0.4/testsuite/xattrs.test 2008-09-03 21:14:13.000000000 +0200
@@ -120,10 +120,10 @@
cd "$fromdir"
rm -rf "$todir" "$chkdir"
-rsync -aX file1 file2
-rsync -aX file1 file2 ../chk/
-rsync -aX --del ../chk/ .
-rsync -aX file1 ../lnk/
+$RSYNC -aX file1 file2
+$RSYNC -aX file1 file2 ../chk/
+$RSYNC -aX --del ../chk/ .
+$RSYNC -aX file1 ../lnk/
xls file1 file2 >"$scratchdir/xattrs.txt"
@@ -136,7 +136,7 @@
rm "$todir/file2"
echo extra >file1
-rsync -aX . ../chk/
+$RSYNC -aX . ../chk/
checkit "$RSYNC -aiiX . ../to" "$chkdir" "$todir"
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/util.c new/rsync-3.0.4/util.c
--- old/rsync-3.0.4pre2/util.c 2008-08-02 03:00:18.000000000 +0200
+++ new/rsync-3.0.4/util.c 2008-09-01 22:25:41.000000000 +0200
@@ -1193,6 +1193,28 @@
return (depth < 0);
}
+#define HUMANIFY(mult) \
+ do { \
+ if (num >= mult || num <= -mult) { \
+ double dnum = (double)num / mult; \
+ char units; \
+ if (num < 0) \
+ dnum = -dnum; \
+ if (dnum < mult) \
+ units = 'K'; \
+ else if ((dnum /= mult) < mult) \
+ units = 'M'; \
+ else { \
+ dnum /= mult; \
+ units = 'G'; \
+ } \
+ if (num < 0) \
+ dnum = -dnum; \
+ snprintf(bufs[n], sizeof bufs[0], "%.2f%c", dnum, units); \
+ return bufs[n]; \
+ } \
+ } while (0)
+
/* Return the int64 number as a string. If the --human-readable option was
* specified, we may output the number in K, M, or G units. We can return
* up to 4 buffers at a time. */
@@ -1201,27 +1223,15 @@
static char bufs[4][128]; /* more than enough room */
static unsigned int n;
char *s;
+ int negated;
n = (n + 1) % (sizeof bufs / sizeof bufs[0]);
if (human_readable) {
- char units = '\0';
- int mult = human_readable == 1 ? 1000 : 1024;
- double dnum = 0;
- if (num > mult*mult*mult) {
- dnum = (double)num / (mult*mult*mult);
- units = 'G';
- } else if (num > mult*mult) {
- dnum = (double)num / (mult*mult);
- units = 'M';
- } else if (num > mult) {
- dnum = (double)num / mult;
- units = 'K';
- }
- if (units) {
- snprintf(bufs[n], sizeof bufs[0], "%.2f%c", dnum, units);
- return bufs[n];
- }
+ if (human_readable == 1)
+ HUMANIFY(1000);
+ else
+ HUMANIFY(1024);
}
s = bufs[n] + sizeof bufs[0] - 1;
@@ -1229,10 +1239,23 @@
if (!num)
*--s = '0';
+ if (num < 0) {
+ /* A maximum-size negated number can't fit as a positive,
+ * so do one digit in negated form to start us off. */
+ *--s = (char)(-(num % 10)) + '0';
+ num = -(num / 10);
+ negated = 1;
+ } else
+ negated = 0;
+
while (num) {
*--s = (char)(num % 10) + '0';
num /= 10;
}
+
+ if (negated)
+ *--s = '-';
+
return s;
}
@@ -1245,8 +1268,8 @@
int len = strlen(buf);
if (isDigit(buf + len - 1)) {
/* There's extra room in buf prior to the start of the num. */
- buf -= decimal_digits + 1;
- snprintf(buf, len + decimal_digits + 2, "%.*f", decimal_digits, dnum);
+ buf -= decimal_digits + 2;
+ snprintf(buf, len + decimal_digits + 3, "%.*f", decimal_digits, dnum);
}
return buf;
}
++++++ rsync-patches-3.0.4pre2.tar.bz2 -> rsync-patches-3.0.4.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/atimes.diff new/rsync-3.0.4/patches/atimes.diff
--- old/rsync-3.0.4pre2/patches/atimes.diff 2008-08-02 23:13:34.000000000 +0200
+++ new/rsync-3.0.4/patches/atimes.diff 2008-09-06 18:33:10.000000000 +0200
@@ -131,7 +131,7 @@
extern int verbose;
extern int dry_run;
-@@ -646,6 +647,9 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -645,6 +646,9 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
: iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !(iflags & ITEM_MATCHED)
&& (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
iflags |= ITEM_REPORT_TIME;
@@ -141,7 +141,7 @@
#if !defined HAVE_LCHMOD && !defined HAVE_SETATTRLIST
if (S_ISLNK(file->mode)) {
;
-@@ -1016,6 +1020,8 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
+@@ -1015,6 +1019,8 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
if (link_dest) {
if (!hard_link_one(file, fname, cmpbuf, 1))
goto try_a_copy;
@@ -150,7 +150,7 @@
if (preserve_hard_links && F_IS_HLINKED(file))
finish_hard_link(file, fname, ndx, &sxp->st, itemizing, code, j);
if (!maybe_ATTRS_REPORT && (verbose > 1 || stdout_format_has_i > 1)) {
-@@ -1201,6 +1207,7 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx,
+@@ -1200,6 +1206,7 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx,
static void list_file_entry(struct file_struct *f)
{
char permbuf[PERMSTRING_SIZE];
@@ -158,7 +158,7 @@
double len;
if (!F_IS_ACTIVE(f)) {
-@@ -1215,14 +1222,16 @@ static void list_file_entry(struct file_struct *f)
+@@ -1214,14 +1221,16 @@ static void list_file_entry(struct file_struct *f)
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(f->mode)) {
@@ -177,7 +177,7 @@
f_name(f, NULL));
}
}
-@@ -2057,7 +2066,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
+@@ -2056,7 +2065,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
STRUCT_STAT st;
if (link_stat(fname, &st, 0) == 0
&& cmp_time(st.st_mtime, file->modtime) != 0)
@@ -272,7 +272,7 @@
diff --git a/rsync.c b/rsync.c
--- a/rsync.c
+++ b/rsync.c
-@@ -393,6 +393,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -380,6 +380,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
int updated = 0;
stat_x sx2;
int change_uid, change_gid;
@@ -280,7 +280,7 @@
mode_t new_mode = file->mode;
int inherit;
-@@ -436,20 +437,38 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -423,20 +424,38 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
set_xattr(fname, file, fnamecmp, sxp);
#endif
@@ -323,7 +323,7 @@
}
change_uid = am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file);
-@@ -583,7 +602,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -570,7 +589,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
/* Change permissions before putting the file into place. */
set_file_attrs(fnametmp, file, NULL, fnamecmp,
@@ -332,7 +332,7 @@
/* move tmp file over real file */
if (verbose > 2)
-@@ -610,7 +629,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -597,7 +616,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
do_set_file_attrs:
set_file_attrs(fnametmp, file, NULL, fnamecmp,
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/backup-dir-dels.diff new/rsync-3.0.4/patches/backup-dir-dels.diff
--- old/rsync-3.0.4pre2/patches/backup-dir-dels.diff 2008-08-02 23:13:36.000000000 +0200
+++ new/rsync-3.0.4/patches/backup-dir-dels.diff 2008-09-06 18:33:13.000000000 +0200
@@ -111,7 +111,7 @@
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
-@@ -97,6 +97,9 @@ extern uid_t our_uid;
+@@ -96,6 +96,9 @@ extern uid_t our_uid;
extern char *backup_dir;
extern char *backup_suffix;
extern int backup_suffix_len;
@@ -121,7 +121,7 @@
extern struct file_list *cur_flist, *first_flist, *dir_flist;
extern struct filter_list_struct daemon_filter_list;
-@@ -143,10 +146,15 @@ static void handle_skipped_hlink(struct file_struct *file, int itemizing,
+@@ -142,10 +145,15 @@ static void handle_skipped_hlink(struct file_struct *file, int itemizing,
enum logcode code, int f_out);
#endif
@@ -138,7 +138,7 @@
}
/* Delete a file or directory. If DEL_RECURSE is set in the flags, this will
-@@ -194,9 +202,9 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
+@@ -193,9 +201,9 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
if (S_ISDIR(mode)) {
what = "rmdir";
ok = do_rmdir(fbuf) == 0;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/catch_crash_signals.diff new/rsync-3.0.4/patches/catch_crash_signals.diff
--- old/rsync-3.0.4pre2/patches/catch_crash_signals.diff 2008-08-02 23:13:37.000000000 +0200
+++ new/rsync-3.0.4/patches/catch_crash_signals.diff 2008-09-06 18:33:14.000000000 +0200
@@ -47,11 +47,11 @@
+ { RERR_WECRASHED , "rsync caught a CRASH-causing signal" },
{ RERR_WAITCHILD , "waitpid() failed" },
{ RERR_MALLOC , "error allocating core memory buffers" },
- { RERR_PARTIAL , "some files could not be transferred" },
+ { RERR_PARTIAL , "some files/attrs were not transferred (see previous errors)" },
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -166,8 +166,11 @@ static void wait_process_with_flush(pid_t pid, int *exit_code_ptr)
+@@ -163,8 +163,11 @@ static void wait_process_with_flush(pid_t pid, int *exit_code_ptr)
*exit_code_ptr = RERR_TERMINATED;
else
*exit_code_ptr = RERR_WAITCHILD;
@@ -64,7 +64,7 @@
}
/* This function gets called from all 3 processes. We want the client side
-@@ -1320,6 +1323,14 @@ RETSIGTYPE remember_children(UNUSED(int val))
+@@ -1315,6 +1318,14 @@ RETSIGTYPE remember_children(UNUSED(int val))
break;
}
}
@@ -79,7 +79,7 @@
}
#endif
#ifndef HAVE_SIGACTION
-@@ -1378,6 +1389,12 @@ static RETSIGTYPE rsync_panic_handler(UNUSED(int whatsig))
+@@ -1373,6 +1384,12 @@ static RETSIGTYPE rsync_panic_handler(UNUSED(int whatsig))
}
#endif
@@ -92,7 +92,7 @@
int main(int argc,char *argv[])
{
-@@ -1400,6 +1417,11 @@ int main(int argc,char *argv[])
+@@ -1395,6 +1412,11 @@ int main(int argc,char *argv[])
SIGACTMASK(SIGFPE, rsync_panic_handler);
SIGACTMASK(SIGABRT, rsync_panic_handler);
SIGACTMASK(SIGBUS, rsync_panic_handler);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/checksum-reading.diff new/rsync-3.0.4/patches/checksum-reading.diff
--- old/rsync-3.0.4pre2/patches/checksum-reading.diff 2008-08-02 23:13:40.000000000 +0200
+++ new/rsync-3.0.4/patches/checksum-reading.diff 2008-09-06 18:33:18.000000000 +0200
@@ -459,7 +459,7 @@
extern int remove_source_files;
extern int delay_updates;
extern int update_only;
-@@ -713,7 +714,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -712,7 +713,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
/* Perform our quick-check heuristic for determining if a file is unchanged. */
@@ -468,7 +468,7 @@
{
if (st->st_size != F_LENGTH(file))
return 0;
-@@ -722,7 +723,10 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
+@@ -721,7 +722,10 @@ 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];
@@ -480,7 +480,7 @@
return memcmp(sum, F_SUM(file), checksum_len) == 0;
}
-@@ -986,7 +990,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
+@@ -985,7 +989,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
match_level = 1;
/* FALL THROUGH */
case 1:
@@ -489,7 +489,7 @@
continue;
best_match = j;
match_level = 2;
-@@ -1259,7 +1263,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1258,7 +1262,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
* --ignore-non-existing, daemon exclude, or mkdir failure. */
static struct file_struct *skip_dir = NULL;
static struct file_list *fuzzy_dirlist = NULL;
@@ -498,7 +498,7 @@
struct file_struct *fuzzy_file = NULL;
int fd = -1, f_copy = -1;
stat_x sx, real_sx;
-@@ -1348,8 +1352,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1347,8 +1351,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
flist_free(fuzzy_dirlist);
fuzzy_dirlist = NULL;
}
@@ -509,7 +509,7 @@
#ifdef SUPPORT_ACLS
if (!preserve_perms)
dflt_perms = default_perms_for_dir(dn);
-@@ -1357,10 +1361,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1356,10 +1360,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
}
parent_dirname = dn;
@@ -529,7 +529,7 @@
}
statret = link_stat(fname, &sx.st, keep_dirlinks && is_dir);
-@@ -1794,7 +1803,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1793,7 +1802,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
;
else if (fnamecmp_type == FNAMECMP_FUZZY)
;
@@ -541,7 +541,7 @@
diff --git a/hlink.c b/hlink.c
--- a/hlink.c
+++ b/hlink.c
-@@ -385,7 +385,7 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname,
+@@ -386,7 +386,7 @@ int hard_link_check(struct file_struct *file, int ndx, const char *fname,
}
break;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/checksum-updating.diff new/rsync-3.0.4/patches/checksum-updating.diff
--- old/rsync-3.0.4pre2/patches/checksum-updating.diff 2008-08-02 23:13:42.000000000 +0200
+++ new/rsync-3.0.4/patches/checksum-updating.diff 2008-09-06 18:33:19.000000000 +0200
@@ -446,7 +446,7 @@
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
-@@ -115,6 +115,7 @@ static int dir_tweaking;
+@@ -114,6 +114,7 @@ static int dir_tweaking;
static int symlink_timeset_failed_flags;
static int need_retouch_dir_times;
static int need_retouch_dir_perms;
@@ -454,7 +454,7 @@
static const char *solo_file = NULL;
/* For calling delete_item() and delete_dir_contents(). */
-@@ -724,7 +725,7 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st, int slot
+@@ -723,7 +724,7 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st, int slot
if (always_checksum > 0 && S_ISREG(st->st_mode)) {
char sum[MAX_DIGEST_LEN];
if (checksum_files && slot >= 0)
@@ -463,7 +463,7 @@
else
file_checksum(fn, st->st_size, sum);
return memcmp(sum, F_SUM(file), checksum_len) == 0;
-@@ -1367,7 +1368,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1366,7 +1367,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
fuzzy_dirlist = get_dirlist(fnamecmpbuf, -1, 1);
}
if (checksum_files) {
@@ -473,7 +473,7 @@
}
need_new_dirscan = 0;
}
-@@ -1517,6 +1519,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1516,6 +1518,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
else
change_local_filter_dir(fname, strlen(fname), F_DEPTH(file));
}
@@ -481,7 +481,7 @@
goto cleanup;
}
-@@ -1809,6 +1812,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1808,6 +1811,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
handle_partial_dir(partialptr, PDIR_DELETE);
}
set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT);
@@ -490,7 +490,7 @@
if (itemizing)
itemize(fnamecmp, file, ndx, statret, &sx, 0, 0, NULL);
#ifdef SUPPORT_HARD_LINKS
-@@ -2255,6 +2260,7 @@ void generate_files(int f_out, const char *local_name)
+@@ -2249,6 +2254,7 @@ void generate_files(int f_out, const char *local_name)
} else
change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(fp));
}
@@ -498,7 +498,7 @@
}
for (i = cur_flist->low; i <= cur_flist->high; i++) {
struct file_struct *file = cur_flist->sorted[i];
-@@ -2338,6 +2344,9 @@ void generate_files(int f_out, const char *local_name)
+@@ -2332,6 +2338,9 @@ void generate_files(int f_out, const char *local_name)
wait_for_receiver();
}
@@ -519,7 +519,7 @@
extern int protocol_version;
extern int remove_source_files;
extern int preserve_hard_links;
-@@ -206,6 +207,9 @@ static void got_flist_entry_status(enum festatus status, const char *buf)
+@@ -203,6 +204,9 @@ static void got_flist_entry_status(enum festatus status, const char *buf)
flist_ndx_push(&hlink_list, ndx);
flist->in_progress++;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/checksum-xattr.diff new/rsync-3.0.4/patches/checksum-xattr.diff
--- old/rsync-3.0.4pre2/patches/checksum-xattr.diff 2008-08-02 23:13:45.000000000 +0200
+++ new/rsync-3.0.4/patches/checksum-xattr.diff 2008-09-06 18:33:22.000000000 +0200
@@ -24,7 +24,7 @@
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
-@@ -722,7 +722,8 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
+@@ -721,7 +721,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];
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/copy-devices.diff new/rsync-3.0.4/patches/copy-devices.diff
--- old/rsync-3.0.4pre2/patches/copy-devices.diff 2008-08-02 23:13:46.000000000 +0200
+++ new/rsync-3.0.4/patches/copy-devices.diff 2008-09-06 18:33:24.000000000 +0200
@@ -19,7 +19,7 @@
extern int preserve_specials;
extern int preserve_hard_links;
extern int preserve_executability;
-@@ -1689,7 +1690,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1688,7 +1689,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
goto cleanup;
}
@@ -76,7 +76,7 @@
extern int am_root;
extern int am_server;
extern int am_sender;
-@@ -339,7 +340,8 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
+@@ -326,7 +327,8 @@ int read_ndx_and_attrs(int f_in, int *iflag_ptr, uchar *type_ptr,
if (iflags & ITEM_TRANSFER) {
int i = ndx - cur_flist->ndx_start;
@@ -89,7 +89,7 @@
diff --git a/sender.c b/sender.c
--- a/sender.c
+++ b/sender.c
-@@ -315,6 +315,20 @@ void send_files(int f_in, int f_out)
+@@ -309,6 +309,20 @@ void send_files(int f_in, int f_out)
exit_cleanup(RERR_PROTOCOL);
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/crtimes.diff new/rsync-3.0.4/patches/crtimes.diff
--- old/rsync-3.0.4pre2/patches/crtimes.diff 2008-08-02 23:13:54.000000000 +0200
+++ new/rsync-3.0.4/patches/crtimes.diff 2008-09-06 18:33:33.000000000 +0200
@@ -146,7 +146,7 @@
extern int preserve_hard_links;
extern int preserve_executability;
extern int preserve_fileflags;
-@@ -621,6 +623,13 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
+@@ -620,6 +622,13 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
if (gid_ndx && !(file->flags & FLAG_SKIP_GROUP) && sxp->st.st_gid != (gid_t)F_GROUP(file))
return 0;
@@ -160,7 +160,7 @@
#ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode)) {
if (!ACL_READY(*sxp))
-@@ -664,6 +673,12 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -663,6 +672,12 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
: iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !(iflags & ITEM_MATCHED)
&& (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
iflags |= ITEM_REPORT_TIME;
@@ -173,7 +173,7 @@
#if !defined HAVE_LCHMOD && !defined HAVE_SETATTRLIST
if (S_ISLNK(file->mode)) {
;
-@@ -1224,6 +1239,7 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx,
+@@ -1223,6 +1238,7 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx,
static void list_file_entry(struct file_struct *f)
{
char permbuf[PERMSTRING_SIZE];
@@ -181,7 +181,7 @@
double len;
if (!F_IS_ACTIVE(f)) {
-@@ -1238,14 +1254,16 @@ static void list_file_entry(struct file_struct *f)
+@@ -1237,14 +1253,16 @@ static void list_file_entry(struct file_struct *f)
#ifdef SUPPORT_LINKS
if (preserve_links && S_ISLNK(f->mode)) {
@@ -200,7 +200,7 @@
f_name(f, NULL));
}
}
-@@ -1337,6 +1355,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1336,6 +1354,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
return;
}
}
@@ -294,7 +294,7 @@
diff --git a/rsync.c b/rsync.c
--- a/rsync.c
+++ b/rsync.c
-@@ -485,6 +485,14 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -472,6 +472,14 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
else
file->flags |= FLAG_TIME_FAILED;
}
@@ -309,7 +309,7 @@
change_uid = am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file);
change_gid = gid_ndx && !(file->flags & FLAG_SKIP_GROUP)
-@@ -632,7 +640,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -619,7 +627,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
/* Change permissions before putting the file into place. */
set_file_attrs(fnametmp, file, NULL, fnamecmp,
ATTRS_DELAY_IMMUTABLE
@@ -318,7 +318,7 @@
/* move tmp file over real file */
if (verbose > 2)
-@@ -663,7 +671,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -650,7 +658,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
do_set_file_attrs:
set_file_attrs(fnametmp, file, NULL, fnamecmp,
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/date-only.diff new/rsync-3.0.4/patches/date-only.diff
--- old/rsync-3.0.4pre2/patches/date-only.diff 2008-08-02 23:14:03.000000000 +0200
+++ new/rsync-3.0.4/patches/date-only.diff 2008-09-06 18:33:42.000000000 +0200
@@ -25,7 +25,7 @@
extern int size_only;
extern OFF_T max_size;
extern OFF_T min_size;
-@@ -715,6 +716,9 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -714,6 +715,9 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
/* Perform our quick-check heuristic for determining if a file is unchanged. */
int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
{
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/db.diff new/rsync-3.0.4/patches/db.diff
--- old/rsync-3.0.4pre2/patches/db.diff 2008-08-02 23:14:11.000000000 +0200
+++ new/rsync-3.0.4/patches/db.diff 2008-09-06 18:33:50.000000000 +0200
@@ -809,7 +809,7 @@
extern int append_mode;
extern int make_backups;
extern int csum_length;
-@@ -722,7 +723,8 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
+@@ -721,7 +722,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 +819,7 @@
return memcmp(sum, F_SUM(file), checksum_len) == 0;
}
-@@ -2205,6 +2207,9 @@ void generate_files(int f_out, const char *local_name)
+@@ -2203,6 +2205,9 @@ void generate_files(int f_out, const char *local_name)
: "enabled");
}
@@ -875,7 +875,7 @@
extern int file_total;
extern int recurse;
extern int xfer_dirs;
-@@ -76,6 +77,7 @@ extern char *partial_dir;
+@@ -73,6 +74,7 @@ extern char *partial_dir;
extern char *dest_option;
extern char *basis_dir[];
extern char *rsync_path;
@@ -883,7 +883,7 @@
extern char *shell_cmd;
extern char *batch_name;
extern char *password_file;
-@@ -1496,6 +1498,9 @@ int main(int argc,char *argv[])
+@@ -1491,6 +1493,9 @@ int main(int argc,char *argv[])
exit_cleanup(RERR_SYNTAX);
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/detect-renamed.diff new/rsync-3.0.4/patches/detect-renamed.diff
--- old/rsync-3.0.4pre2/patches/detect-renamed.diff 2008-08-02 23:14:17.000000000 +0200
+++ new/rsync-3.0.4/patches/detect-renamed.diff 2008-09-06 18:33:56.000000000 +0200
@@ -154,7 +154,7 @@
extern int whole_file;
extern int list_only;
extern int read_batch;
-@@ -99,6 +100,7 @@ extern char *backup_suffix;
+@@ -98,6 +99,7 @@ extern char *backup_suffix;
extern int backup_suffix_len;
extern struct file_list *cur_flist, *first_flist, *dir_flist;
extern struct filter_list_struct daemon_filter_list;
@@ -162,7 +162,7 @@
int ignore_perishable = 0;
int non_perishable_cnt = 0;
-@@ -106,6 +108,7 @@ int maybe_ATTRS_REPORT = 0;
+@@ -105,6 +107,7 @@ int maybe_ATTRS_REPORT = 0;
static dev_t dev_zero;
static int deletion_count = 0; /* used to implement --max-delete */
@@ -170,7 +170,7 @@
static int deldelay_size = 0, deldelay_cnt = 0;
static char *deldelay_buf = NULL;
static int deldelay_fd = -1;
-@@ -116,7 +119,7 @@ static int need_retouch_dir_times;
+@@ -115,7 +118,7 @@ static int need_retouch_dir_times;
static int need_retouch_dir_perms;
static const char *solo_file = NULL;
@@ -179,7 +179,7 @@
#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 */
-@@ -125,6 +128,7 @@ static const char *solo_file = NULL;
+@@ -124,6 +127,7 @@ static const char *solo_file = NULL;
#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 */
@@ -187,7 +187,7 @@
#define DEL_MAKE_ROOM (DEL_FOR_FILE|DEL_FOR_DIR|DEL_FOR_SYMLINK|DEL_FOR_DEVICE|DEL_FOR_SPECIAL)
-@@ -149,11 +153,121 @@ static int is_backup_file(char *fn)
+@@ -148,11 +152,121 @@ static int is_backup_file(char *fn)
return k > 0 && strcmp(fn+k, backup_suffix) == 0;
}
@@ -309,7 +309,7 @@
*/
static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
{
-@@ -187,6 +301,8 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
+@@ -186,6 +300,8 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
goto check_ret;
/* OK: try to delete the directory. */
}
@@ -318,7 +318,7 @@
if (!(flags & DEL_MAKE_ROOM) && max_delete >= 0 && ++deletion_count > max_delete)
return DR_AT_LIMIT;
-@@ -242,6 +358,8 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
+@@ -241,6 +357,8 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
* its contents, otherwise just checks for content. Returns DR_SUCCESS or
* DR_NOT_EMPTY. Note that fname must point to a MAXPATHLEN buffer! (The
* buffer is used for recursion, but returned unchanged.)
@@ -327,7 +327,7 @@
*/
static enum delret delete_dir_contents(char *fname, uint16 flags)
{
-@@ -261,7 +379,9 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
+@@ -260,7 +378,9 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
save_filters = push_local_filters(fname, dlen);
non_perishable_cnt = 0;
@@ -337,7 +337,7 @@
ret = non_perishable_cnt ? DR_NOT_EMPTY : DR_SUCCESS;
if (!dirlist->used)
-@@ -301,7 +421,8 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
+@@ -300,7 +420,8 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
if (S_ISDIR(fp->mode)) {
if (delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS)
ret = DR_NOT_EMPTY;
@@ -347,7 +347,7 @@
if (delete_item(fname, fp->mode, flags) != DR_SUCCESS)
ret = DR_NOT_EMPTY;
}
-@@ -466,13 +587,18 @@ static void do_delayed_deletions(char *delbuf)
+@@ -465,13 +586,18 @@ static void do_delayed_deletions(char *delbuf)
* all the --delete-WHEN options. Note that the fbuf pointer must point to a
* MAXPATHLEN buffer with the name of the directory in it (the functions we
* call will append names onto the end, but the old dir value will be restored
@@ -370,7 +370,7 @@
int save_uid_ndx = uid_ndx;
if (!fbuf) {
-@@ -487,17 +613,22 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
+@@ -486,17 +612,22 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
maybe_send_keepalive();
if (io_error && !ignore_errors) {
@@ -398,7 +398,7 @@
if (one_file_system) {
if (file->flags & FLAG_TOP_DIR)
filesystem_dev = *fs_dev;
-@@ -510,6 +641,14 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
+@@ -509,6 +640,14 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
dirlist = get_dirlist(fbuf, dlen, 0);
@@ -413,7 +413,7 @@
/* If an item in dirlist is not found in flist, delete it
* from the filesystem. */
for (i = dirlist->used; i--; ) {
-@@ -522,19 +661,28 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
+@@ -521,19 +660,28 @@ static void delete_in_dir(char *fbuf, struct file_struct *file, dev_t *fs_dev)
f_name(fp, NULL));
continue;
}
@@ -446,7 +446,7 @@
flist_free(dirlist);
if (!save_uid_ndx) {
-@@ -572,9 +720,9 @@ static void do_delete_pass(void)
+@@ -571,9 +719,9 @@ static void do_delete_pass(void)
|| !S_ISDIR(st.st_mode))
continue;
@@ -458,7 +458,7 @@
if (do_progress && !am_server)
rprintf(FINFO, " \r");
-@@ -1227,6 +1375,7 @@ static void list_file_entry(struct file_struct *f)
+@@ -1226,6 +1374,7 @@ static void list_file_entry(struct file_struct *f)
}
}
@@ -466,7 +466,7 @@
static int phase = 0;
static int dflt_perms;
-@@ -1503,9 +1652,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1502,9 +1651,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
}
else if (delete_during && f_out != -1 && !phase
&& !(file->flags & FLAG_MISSING_DIR)) {
@@ -482,7 +482,7 @@
change_local_filter_dir(fname, strlen(fname), F_DEPTH(file));
}
goto cleanup;
-@@ -1783,8 +1935,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1782,8 +1934,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
goto cleanup;
}
#endif
@@ -498,7 +498,7 @@
rsyserr(FERROR_XFER, stat_errno, "recv_generator: failed to stat %s",
full_fname(fname));
goto cleanup;
-@@ -2186,6 +2344,12 @@ void generate_files(int f_out, const char *local_name)
+@@ -2184,6 +2342,12 @@ void generate_files(int f_out, const char *local_name)
if (verbose > 2)
rprintf(FINFO, "generator starting pid=%ld\n", (long)getpid());
@@ -511,7 +511,7 @@
if (delete_before && !solo_file && cur_flist->used > 0)
do_delete_pass();
if (delete_during == 2) {
-@@ -2196,7 +2360,7 @@ void generate_files(int f_out, const char *local_name)
+@@ -2194,7 +2358,7 @@ void generate_files(int f_out, const char *local_name)
}
do_progress = 0;
@@ -520,16 +520,16 @@
whole_file = 0;
if (verbose >= 2) {
rprintf(FINFO, "delta-transmission %s\n",
-@@ -2242,7 +2406,7 @@ void generate_files(int f_out, const char *local_name)
- * error for this directory before we delete in it. */
- while (check_for_io_err && !cur_flist->next)
- wait_for_receiver();
+@@ -2236,7 +2400,7 @@ void generate_files(int f_out, const char *local_name)
+ dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
+ } else
+ dirdev = MAKEDEV(0, 0);
- delete_in_dir(fbuf, fp, &dirdev);
+ delete_in_dir(fbuf, fp, &dirdev, 0);
} else
change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(fp));
}
-@@ -2289,7 +2453,21 @@ void generate_files(int f_out, const char *local_name)
+@@ -2283,7 +2447,21 @@ void generate_files(int f_out, const char *local_name)
} while ((cur_flist = cur_flist->next) != NULL);
if (delete_during)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/detect-renamed-lax.diff new/rsync-3.0.4/patches/detect-renamed-lax.diff
--- old/rsync-3.0.4pre2/patches/detect-renamed-lax.diff 2008-08-02 23:14:19.000000000 +0200
+++ new/rsync-3.0.4/patches/detect-renamed-lax.diff 2008-09-06 18:33:59.000000000 +0200
@@ -23,7 +23,7 @@
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
-@@ -201,7 +201,9 @@ static int fattr_find(struct file_struct *f, char *fname)
+@@ -200,7 +200,9 @@ static int fattr_find(struct file_struct *f, char *fname)
continue;
}
}
@@ -34,7 +34,7 @@
diff = u_strcmp(fmid->basename, f->basename);
if (diff == 0) {
good_match = mid;
-@@ -1986,6 +1988,21 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1985,6 +1987,21 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
fnamecmp = partialptr;
fnamecmp_type = FNAMECMP_PARTIAL_DIR;
statret = 0;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/downdate.diff new/rsync-3.0.4/patches/downdate.diff
--- old/rsync-3.0.4pre2/patches/downdate.diff 2008-08-02 23:14:21.000000000 +0200
+++ new/rsync-3.0.4/patches/downdate.diff 2008-09-06 18:34:01.000000000 +0200
@@ -18,7 +18,7 @@
extern int ignore_existing;
extern int ignore_non_existing;
extern int inplace;
-@@ -1724,6 +1725,13 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1723,6 +1724,13 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
goto cleanup;
}
@@ -32,7 +32,7 @@
fnamecmp = fname;
fnamecmp_type = FNAMECMP_FNAME;
-@@ -2096,6 +2104,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
+@@ -2094,6 +2102,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
ignore_existing = -ignore_existing;
ignore_non_existing = -ignore_non_existing;
update_only = -update_only;
@@ -40,7 +40,7 @@
always_checksum = -always_checksum;
size_only = -size_only;
append_mode = -append_mode;
-@@ -2121,6 +2130,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
+@@ -2119,6 +2128,7 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
ignore_existing = -ignore_existing;
ignore_non_existing = -ignore_non_existing;
update_only = -update_only;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/drop-cache.diff new/rsync-3.0.4/patches/drop-cache.diff
--- old/rsync-3.0.4pre2/patches/drop-cache.diff 2008-08-02 23:14:30.000000000 +0200
+++ new/rsync-3.0.4/patches/drop-cache.diff 2008-09-06 18:34:10.000000000 +0200
@@ -125,7 +125,7 @@
diff --git a/generator.c b/generator.c
--- a/generator.c
+++ b/generator.c
-@@ -116,6 +116,10 @@ static int need_retouch_dir_times;
+@@ -115,6 +115,10 @@ static int need_retouch_dir_times;
static int need_retouch_dir_perms;
static const char *solo_file = NULL;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/fileflags.diff new/rsync-3.0.4/patches/fileflags.diff
--- old/rsync-3.0.4pre2/patches/fileflags.diff 2008-08-02 23:13:52.000000000 +0200
+++ new/rsync-3.0.4/patches/fileflags.diff 2008-09-06 18:33:30.000000000 +0200
@@ -186,7 +186,7 @@
extern int uid_ndx;
extern int gid_ndx;
extern int delete_mode;
-@@ -167,7 +169,7 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
+@@ -166,7 +168,7 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
}
if (flags & DEL_NO_UID_WRITE)
@@ -195,7 +195,7 @@
if (S_ISDIR(mode) && !(flags & DEL_DIR_IS_EMPTY)) {
int save_uid_ndx = uid_ndx;
-@@ -175,6 +177,13 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
+@@ -174,6 +176,13 @@ static enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
* delete_dir_contents() always calls us w/DEL_DIR_IS_EMPTY. */
if (!uid_ndx)
uid_ndx = ++file_extra_cnt;
@@ -209,7 +209,7 @@
ignore_perishable = 1;
/* If DEL_RECURSE is not set, this just reports emptiness. */
ret = delete_dir_contents(fbuf, flags);
-@@ -295,8 +304,12 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
+@@ -294,8 +303,12 @@ static enum delret delete_dir_contents(char *fname, uint16 flags)
}
strlcpy(p, fp->basename, remainder);
@@ -223,7 +223,7 @@
/* Save stack by recursing to ourself directly. */
if (S_ISDIR(fp->mode)) {
if (delete_dir_contents(fname, flags | DEL_RECURSE) != DR_SUCCESS)
-@@ -597,6 +610,11 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
+@@ -596,6 +609,11 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
&& ((sxp->st.st_mode & 0111 ? 1 : 0) ^ (file->mode & 0111 ? 1 : 0)))
return 0;
@@ -235,7 +235,7 @@
if (am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file))
return 0;
-@@ -662,6 +680,11 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -661,6 +679,11 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
if (gid_ndx && !(file->flags & FLAG_SKIP_GROUP)
&& sxp->st.st_gid != (gid_t)F_GROUP(file))
iflags |= ITEM_REPORT_GROUP;
@@ -247,7 +247,7 @@
#ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode)) {
if (!ACL_READY(*sxp))
-@@ -1440,6 +1463,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1439,6 +1462,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
file->mode = dest_mode(file->mode, sx.st.st_mode,
dflt_perms, statret == 0);
}
@@ -258,7 +258,7 @@
if (statret != 0 && basis_dir[0] != NULL) {
int j = try_dests_non(file, fname, ndx, fnamecmpbuf, &sx,
itemizing, code);
-@@ -1480,10 +1507,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1479,10 +1506,15 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
/* We need to ensure that the dirs in the transfer have writable
* permissions during the time we are putting files within them.
* This is then fixed after the transfer is done. */
@@ -275,7 +275,7 @@
rsyserr(FERROR_XFER, errno,
"failed to modify permissions on %s",
full_fname(fname));
-@@ -1518,6 +1550,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1517,6 +1549,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
file->mode = dest_mode(file->mode, sx.st.st_mode, dflt_perms,
exists);
}
@@ -286,7 +286,7 @@
#ifdef SUPPORT_HARD_LINKS
if (preserve_hard_links && F_HLINK_NOT_FIRST(file)
-@@ -2052,13 +2088,17 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
+@@ -2051,13 +2087,17 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
continue;
fname = f_name(file, NULL);
if (!(file->mode & S_IWUSR))
@@ -454,7 +454,7 @@
extern int preserve_executability;
extern int preserve_times;
extern int am_root;
-@@ -387,6 +388,39 @@ mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms,
+@@ -374,6 +375,39 @@ mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms,
return new_mode;
}
@@ -494,7 +494,7 @@
int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
const char *fnamecmp, int flags)
{
-@@ -440,7 +474,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -427,7 +461,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
flags |= ATTRS_SKIP_MTIME;
if (!(flags & ATTRS_SKIP_MTIME)
&& cmp_time(sxp->st.st_mtime, file->modtime) != 0) {
@@ -503,7 +503,7 @@
if (ret < 0) {
rsyserr(FERROR_XFER, errno, "failed to set times on %s",
full_fname(fname));
-@@ -476,7 +510,8 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -463,7 +497,8 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
if (am_root >= 0) {
if (do_lchown(fname,
change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid,
@@ -513,7 +513,7 @@
/* We shouldn't have attempted to change uid
* or gid unless have the privilege. */
rsyserr(FERROR_XFER, errno, "%s %s failed",
-@@ -508,7 +543,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -495,7 +530,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
#ifdef HAVE_CHMOD
if (!BITS_EQUAL(sxp->st.st_mode, new_mode, CHMOD_BITS)) {
@@ -522,7 +522,7 @@
if (ret < 0) {
rsyserr(FERROR_XFER, errno,
"failed to set permissions on %s",
-@@ -520,6 +555,19 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -507,6 +542,19 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
}
#endif
@@ -542,7 +542,7 @@
if (verbose > 1 && flags & ATTRS_REPORT) {
if (updated)
rprintf(FCLIENT, "%s\n", fname);
-@@ -583,7 +631,8 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -570,7 +618,8 @@ int finish_transfer(const char *fname, const char *fnametmp,
/* Change permissions before putting the file into place. */
set_file_attrs(fnametmp, file, NULL, fnamecmp,
@@ -552,7 +552,7 @@
/* move tmp file over real file */
if (verbose > 2)
-@@ -602,6 +651,10 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -589,6 +638,10 @@ int finish_transfer(const char *fname, const char *fnametmp,
}
if (ret == 0) {
/* The file was moved into place (not copied), so it's done. */
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/link-by-hash.diff new/rsync-3.0.4/patches/link-by-hash.diff
--- old/rsync-3.0.4pre2/patches/link-by-hash.diff 2008-08-02 23:14:40.000000000 +0200
+++ new/rsync-3.0.4/patches/link-by-hash.diff 2008-09-06 18:34:21.000000000 +0200
@@ -532,15 +532,15 @@
diff --git a/rsync.c b/rsync.c
--- a/rsync.c
+++ b/rsync.c
-@@ -50,6 +50,7 @@ extern int keep_dirlinks;
+@@ -48,6 +48,7 @@ extern int inplace;
+ extern int flist_eof;
+ extern int keep_dirlinks;
extern int make_backups;
- extern int delete_during;
- extern int check_for_io_err;
+extern char *link_by_hash_dir;
extern struct file_list *cur_flist, *first_flist, *dir_flist;
extern struct chmod_mode_struct *daemon_chmod_modes;
#ifdef ICONV_OPTION
-@@ -588,8 +589,15 @@ int finish_transfer(const char *fname, const char *fnametmp,
+@@ -575,8 +576,15 @@ int finish_transfer(const char *fname, const char *fnametmp,
/* move tmp file over real file */
if (verbose > 2)
rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/log-checksum.diff new/rsync-3.0.4/patches/log-checksum.diff
--- old/rsync-3.0.4pre2/patches/log-checksum.diff 2008-08-02 23:14:41.000000000 +0200
+++ new/rsync-3.0.4/patches/log-checksum.diff 2008-09-06 18:34:23.000000000 +0200
@@ -118,7 +118,7 @@
extern int remove_source_files;
extern int need_messages_from_generator;
extern int kluge_around_eof;
-@@ -71,6 +72,8 @@ extern int check_for_io_err;
+@@ -68,6 +69,8 @@ extern int connect_timeout;
extern pid_t cleanup_child_pid;
extern unsigned int module_dirlen;
extern struct stats stats;
@@ -127,7 +127,7 @@
extern char *filesfrom_host;
extern char *partial_dir;
extern char *dest_option;
-@@ -88,6 +91,7 @@ int local_server = 0;
+@@ -85,6 +88,7 @@ int local_server = 0;
int daemon_over_rsh = 0;
mode_t orig_umask = 0;
int batch_gen_fd = -1;
@@ -135,7 +135,7 @@
/* There's probably never more than at most 2 outstanding child processes,
* but set it higher, just in case. */
-@@ -1008,6 +1012,12 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
+@@ -1003,6 +1007,12 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
if (am_sender) {
keep_dirlinks = 0; /* Must be disabled on the sender. */
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/omit-dir-changes.diff new/rsync-3.0.4/patches/omit-dir-changes.diff
--- old/rsync-3.0.4pre2/patches/omit-dir-changes.diff 2008-08-02 23:14:50.000000000 +0200
+++ new/rsync-3.0.4/patches/omit-dir-changes.diff 2008-09-06 18:34:33.000000000 +0200
@@ -18,7 +18,7 @@
extern int uid_ndx;
extern int gid_ndx;
extern int delete_mode;
-@@ -628,6 +629,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -627,6 +628,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
const char *xname)
{
if (statret >= 0) { /* A from-dest-dir statret can == 1! */
@@ -26,7 +26,7 @@
int keep_time = !preserve_times ? 0
: S_ISDIR(file->mode) ? preserve_times > 1 :
#if defined HAVE_LUTIMES && defined HAVE_UTIMES
-@@ -657,10 +659,11 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -656,10 +658,11 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
} else if (preserve_executability
&& ((sxp->st.st_mode & 0111 ? 1 : 0) ^ (file->mode & 0111 ? 1 : 0)))
iflags |= ITEM_REPORT_PERMS;
@@ -41,7 +41,7 @@
iflags |= ITEM_REPORT_GROUP;
#ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode)) {
-@@ -1436,7 +1439,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
+@@ -1435,7 +1438,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
real_sx = sx;
if (file->flags & FLAG_DIR_CREATED)
statret = -1;
@@ -106,7 +106,7 @@
extern int am_root;
extern int am_server;
extern int am_sender;
-@@ -452,9 +453,11 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
+@@ -439,9 +440,11 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
file->flags |= FLAG_TIME_FAILED;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/slp.diff new/rsync-3.0.4/patches/slp.diff
--- old/rsync-3.0.4pre2/patches/slp.diff 2008-08-02 23:15:17.000000000 +0200
+++ new/rsync-3.0.4/patches/slp.diff 2008-09-06 18:35:02.000000000 +0200
@@ -126,7 +126,7 @@
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -1126,6 +1126,18 @@ static int start_client(int argc, char *argv[])
+@@ -1121,6 +1121,18 @@ static int start_client(int argc, char *argv[])
if (!read_batch) { /* for read_batch, NO source is specified */
char *path = check_for_hostspec(argv[0], &shell_machine, &rsync_port);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/source-backup.diff new/rsync-3.0.4/patches/source-backup.diff
--- old/rsync-3.0.4pre2/patches/source-backup.diff 2008-08-02 23:15:25.000000000 +0200
+++ new/rsync-3.0.4/patches/source-backup.diff 2008-09-06 18:35:10.000000000 +0200
@@ -90,7 +90,7 @@
if (!remove_source_files)
return;
-@@ -139,7 +141,11 @@ void successful_send(int ndx)
+@@ -133,7 +135,11 @@ void successful_send(int ndx)
return;
f_name(file, fname);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/source-filter_dest-filter.diff new/rsync-3.0.4/patches/source-filter_dest-filter.diff
--- old/rsync-3.0.4pre2/patches/source-filter_dest-filter.diff 2008-08-02 23:15:28.000000000 +0200
+++ new/rsync-3.0.4/patches/source-filter_dest-filter.diff 2008-09-06 18:35:13.000000000 +0200
@@ -41,7 +41,7 @@
extern int size_only;
extern OFF_T max_size;
extern OFF_T min_size;
-@@ -715,7 +716,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
+@@ -714,7 +715,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
/* Perform our quick-check heuristic for determining if a file is unchanged. */
int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
{
@@ -53,7 +53,7 @@
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
-@@ -139,7 +139,7 @@ pid_t wait_process(pid_t pid, int *status_ptr, int flags)
+@@ -136,7 +136,7 @@ pid_t wait_process(pid_t pid, int *status_ptr, int flags)
}
/* Wait for a process to exit, calling io_flush while waiting. */
@@ -387,7 +387,7 @@
extern struct stats stats;
extern struct file_list *cur_flist, *first_flist, *dir_flist;
-@@ -181,6 +182,26 @@ void send_files(int f_in, int f_out)
+@@ -175,6 +176,26 @@ void send_files(int f_in, int f_out)
enum logcode log_code = log_before_transfer ? FLOG : FINFO;
int f_xfer = write_batch < 0 ? batch_fd : f_out;
int ndx, j;
@@ -414,7 +414,7 @@
if (verbose > 2)
rprintf(FINFO, "send_files starting\n");
-@@ -285,6 +306,7 @@ void send_files(int f_in, int f_out)
+@@ -279,6 +300,7 @@ void send_files(int f_in, int f_out)
exit_cleanup(RERR_PROTOCOL);
}
@@ -422,7 +422,7 @@
fd = do_open(fname, O_RDONLY, 0);
if (fd == -1) {
if (errno == ENOENT) {
-@@ -306,6 +328,33 @@ void send_files(int f_in, int f_out)
+@@ -300,6 +322,33 @@ void send_files(int f_in, int f_out)
continue;
}
@@ -456,7 +456,7 @@
/* map the local file */
if (do_fstat(fd, &st) != 0) {
io_error |= IOERR_GENERAL;
-@@ -356,6 +405,8 @@ void send_files(int f_in, int f_out)
+@@ -350,6 +399,8 @@ void send_files(int f_in, int f_out)
}
}
close(fd);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/rsync-3.0.4pre2/patches/time-limit.diff new/rsync-3.0.4/patches/time-limit.diff
--- old/rsync-3.0.4pre2/patches/time-limit.diff 2008-08-02 23:15:33.000000000 +0200
+++ new/rsync-3.0.4/patches/time-limit.diff 2008-09-06 18:35:20.000000000 +0200
@@ -20,7 +20,7 @@
extern struct file_list *cur_flist;
#ifdef ICONV_OPTION
extern int filesfrom_convert;
-@@ -222,16 +223,24 @@ static void check_timeout(void)
+@@ -219,16 +220,24 @@ static void check_timeout(void)
{
time_t t;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org