summaryrefslogtreecommitdiff
path: root/cleanup.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-07-25 02:25:22 +0000
committerAndrew Tridgell <tridge@samba.org>1998-07-25 02:25:22 +0000
commit2f03f956f425f03335005ba743f19b6ed3454248 (patch)
tree4b449374fb14673ca11058436d5eeb66fe975331 /cleanup.c
parent0199b05f25ec271a4d306ec46218ba4fcb8ad85a (diff)
downloadrsync-2f03f956f425f03335005ba743f19b6ed3454248.tar.gz
rsync-2f03f956f425f03335005ba743f19b6ed3454248.tar.bz2
rsync-2f03f956f425f03335005ba743f19b6ed3454248.zip
rsync.c was getting a bit unwieldy so I split the code into 3 modules,
for the 3 logical stages of rsync; generator, sender and receiver.
Diffstat (limited to 'cleanup.c')
-rw-r--r--cleanup.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/cleanup.c b/cleanup.c
new file mode 100644
index 00000000..05f34527
--- /dev/null
+++ b/cleanup.c
@@ -0,0 +1,63 @@
+/*
+ Copyright (C) Andrew Tridgell 1996
+ Copyright (C) Paul Mackerras 1996
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "rsync.h"
+
+/* handling the cleanup when a transfer is interrupted is tricky when
+ --partial is selected. We need to ensure that the partial file is
+ kept if any real data has been transferred */
+int cleanup_got_literal=0;
+
+static char *cleanup_fname;
+static char *cleanup_new_fname;
+static struct file_struct *cleanup_file;
+
+void exit_cleanup(int code)
+{
+ extern int keep_partial;
+
+ signal(SIGUSR1, SIG_IGN);
+
+ if (cleanup_got_literal && cleanup_fname && keep_partial) {
+ char *fname = cleanup_fname;
+ cleanup_fname = NULL;
+ finish_transfer(cleanup_new_fname, fname, cleanup_file);
+ }
+ io_flush();
+ if (cleanup_fname)
+ do_unlink(cleanup_fname);
+ if (code) {
+ kill_all(SIGUSR1);
+ }
+ exit(code);
+}
+
+void cleanup_disable(void)
+{
+ cleanup_fname = NULL;
+ cleanup_got_literal = 0;
+}
+
+
+void cleanup_set(char *fnametmp, char *fname, struct file_struct *file)
+{
+ cleanup_fname = fnametmp;
+ cleanup_new_fname = fname;
+ cleanup_file = file;
+}