+
+/* 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 */
+static int cleanup_got_literal;
+static char *cleanup_fname;
+static char *cleanup_new_fname;
+static struct file_struct *cleanup_file;
+static void finish_transfer(char *fname, char *fnametmp, struct file_struct *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);
+}
+
+