1 --- io.c 16 Jan 2004 16:31:47 -0000 1.119
2 +++ io.c 23 Feb 2004 18:16:25 -0000
3 @@ -222,6 +222,14 @@ static void read_msg_fd(void)
5 redo_list_add(IVAL(buf,0));
9 + rprintf(FERROR, "invalid message %d:%d\n", tag, len);
10 + exit_cleanup(RERR_STREAMIO);
12 + read_loop(fd, buf, len);
13 + io_multiplex_write(MSG_SUCCESS, buf, len);
18 @@ -637,6 +645,16 @@ static int read_unbuffered(int fd, char
20 read_loop(fd, buffer, remaining);
24 + if (remaining != 4) {
25 + rprintf(FERROR, "invalid multi-message %d:%ld\n",
26 + tag, (long)remaining);
27 + exit_cleanup(RERR_STREAMIO);
29 + read_loop(fd, line, remaining);
30 + successful_send(IVAL(line, 0));
35 --- main.c 10 Feb 2004 03:54:47 -0000 1.192
36 +++ main.c 23 Feb 2004 18:16:25 -0000
37 @@ -42,6 +42,7 @@ extern int list_only;
38 extern int local_server;
39 extern int log_got_error;
41 +extern int need_messages_from_generator;
42 extern int orig_umask;
43 extern int preserve_hard_links;
44 extern int protocol_version;
45 @@ -567,6 +568,8 @@ void start_server(int f_in, int f_out, i
46 io_start_multiplex_out(f_out);
49 + if (need_messages_from_generator)
50 + io_start_multiplex_in(f_in);
52 recv_exclude_list(f_in);
54 @@ -632,6 +635,9 @@ int client_run(int f_in, int f_out, pid_
59 + if (need_messages_from_generator)
60 + io_start_multiplex_out(f_out);
64 --- options.c 22 Feb 2004 08:56:43 -0000 1.139
65 +++ options.c 23 Feb 2004 18:16:25 -0000
66 @@ -82,6 +82,7 @@ int copy_unsafe_links = 0;
70 +int delete_sent_files = 0;
71 int only_existing = 0;
72 int opt_ignore_existing = 0;
74 @@ -89,6 +90,7 @@ int ignore_errors = 0;
75 int modify_window = 0;
77 int checksum_seed = 0;
78 +int need_messages_from_generator = 0;
79 unsigned int block_size = 0;
82 @@ -252,6 +254,7 @@ void usage(enum logcode F)
83 rprintf(F," --delete delete files that don't exist on the sending side\n");
84 rprintf(F," --delete-excluded also delete excluded files on the receiving side\n");
85 rprintf(F," --delete-after receiver deletes after transferring, not before\n");
86 + rprintf(F," --delete-sent-files updated/sent files are removed from sending side\n");
87 rprintf(F," --ignore-errors delete even if there are I/O errors\n");
88 rprintf(F," --max-delete=NUM don't delete more than NUM files\n");
89 rprintf(F," --partial keep partially transferred files\n");
90 @@ -301,8 +304,8 @@ void usage(enum logcode F)
93 enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
94 - OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_LINK_DEST,
95 - OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
96 + OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_DELETE_SENT_FILES,
97 + OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_LINK_DEST, OPT_MODIFY_WINDOW,
98 OPT_READ_BATCH, OPT_WRITE_BATCH,
99 OPT_REFUSED_BASE = 9000};
101 @@ -321,6 +324,7 @@ static struct poptOption long_options[]
102 {"ignore-existing", 0, POPT_ARG_NONE, &opt_ignore_existing, 0, 0, 0 },
103 {"delete-after", 0, POPT_ARG_NONE, 0, OPT_DELETE_AFTER, 0, 0 },
104 {"delete-excluded", 0, POPT_ARG_NONE, 0, OPT_DELETE_EXCLUDED, 0, 0 },
105 + {"delete-sent-files",0, POPT_ARG_NONE, 0, OPT_DELETE_SENT_FILES, 0, 0 },
106 {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
107 {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 },
108 {"exclude", 0, POPT_ARG_STRING, 0, OPT_EXCLUDE, 0, 0 },
109 @@ -506,6 +510,11 @@ int parse_arguments(int *argc, const cha
113 + case OPT_DELETE_SENT_FILES:
114 + delete_sent_files = 1;
115 + need_messages_from_generator = 1;
119 add_exclude(&exclude_list, poptGetOptArg(pc),
121 @@ -945,6 +954,9 @@ void server_options(char **args,int *arg
122 args[ac++] = "--from0";
126 + if (delete_sent_files)
127 + args[ac++] = "--delete-sent-files";
131 --- proto.h 17 Feb 2004 23:13:06 -0000 1.184
132 +++ proto.h 23 Feb 2004 18:16:25 -0000
133 @@ -199,6 +199,7 @@ void sig_int(void);
134 void finish_transfer(char *fname, char *fnametmp, struct file_struct *file);
135 const char *who_am_i(void);
136 void read_sum_head(int f, struct sum_struct *sum);
137 +void successful_send(int i);
138 void send_files(struct file_list *flist, int f_out, int f_in);
139 int try_bind_local(int s, int ai_family, int ai_socktype,
140 const char *bind_address);
141 --- receiver.c 10 Feb 2004 17:28:59 -0000 1.72
142 +++ receiver.c 23 Feb 2004 18:16:26 -0000
143 @@ -39,6 +39,7 @@ extern char *backup_dir;
144 extern char *backup_suffix;
145 extern int backup_suffix_len;
146 extern int cleanup_got_literal;
147 +extern int delete_sent_files;
149 static void delete_one(char *fn, int is_dir)
151 @@ -288,7 +289,7 @@ int recv_files(int f_in,struct file_list
152 char *fname, fbuf[MAXPATHLEN];
153 char template[MAXPATHLEN];
154 char fnametmp[MAXPATHLEN];
156 + char *fnamecmp, numbuf[4];
157 char fnamecmpbuf[MAXPATHLEN];
158 struct map_struct *mapbuf;
160 @@ -467,16 +468,20 @@ int recv_files(int f_in,struct file_list
166 + if (delete_sent_files) {
167 + SIVAL(numbuf, 0, i);
168 + send_msg(MSG_SUCCESS, numbuf, 4);
171 if (csum_length == SUM_LENGTH) {
172 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
177 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
179 - send_msg(MSG_REDO, buf, 4);
180 + SIVAL(numbuf, 0, i);
181 + send_msg(MSG_REDO, numbuf, 4);
185 --- rsync.1 2 Feb 2004 18:23:09 -0000 1.163
186 +++ rsync.1 23 Feb 2004 18:16:26 -0000
187 @@ -349,6 +349,7 @@ to the detailed description below for a
188 --delete delete files that don\&'t exist on sender
189 --delete-excluded also delete excluded files on receiver
190 --delete-after receiver deletes after transfer, not before
191 + --delete-sent-files updated/sent files are removed from sender
192 --ignore-errors delete even if there are I/O errors
193 --max-delete=NUM don\&'t delete more than NUM files
194 --partial keep partially transferred files
195 @@ -673,6 +674,12 @@ By default rsync does file deletions on
196 receiving side before transferring files to try to ensure that there is
197 sufficient space on the receiving filesystem\&. If you want to delete
198 after transferring, use the --delete-after switch\&. Implies --delete\&.
200 +.IP "\fB--delete-sent-files\fP"
201 +This tells rsync to remove the source files
202 +on the sending side that are successfully transferred to the receiving
203 +side\&. Directories are not removed, nor are files that are identical on
206 .IP "\fB--ignore-errors\fP"
207 Tells --delete to go ahead and delete files
208 --- rsync.h 11 Feb 2004 08:01:21 -0000 1.186
209 +++ rsync.h 23 Feb 2004 18:16:26 -0000
211 #define FLAG_TOP_DIR (1<<0)
212 #define FLAG_HLINK_EOL (1<<1) /* generator only */
213 #define FLAG_MOUNT_POINT (1<<2) /* sender only */
214 +#define FLAG_SENT (1<<7) /* sender only */
216 /* update this if you make incompatible changes */
217 #define PROTOCOL_VERSION 28
218 @@ -124,6 +125,7 @@ enum msgcode {
219 MSG_ERROR=FERROR, MSG_INFO=FINFO, MSG_LOG=FLOG, /* remote logging */
220 MSG_REDO=4, /* reprocess indicated flist index */
221 MSG_DONE=5, /* current phase is done */
222 + MSG_SUCCESS=6, /* successfully updated indicated flist index */
226 --- rsync.yo 2 Feb 2004 18:23:09 -0000 1.147
227 +++ rsync.yo 23 Feb 2004 18:16:27 -0000
228 @@ -312,6 +312,7 @@ verb(
229 --delete delete files that don't exist on sender
230 --delete-excluded also delete excluded files on receiver
231 --delete-after receiver deletes after transfer, not before
232 + --delete-sent-files updated/sent files are removed from sender
233 --ignore-errors delete even if there are I/O errors
234 --max-delete=NUM don't delete more than NUM files
235 --partial keep partially transferred files
236 @@ -585,6 +586,11 @@ dit(bf(--delete-after)) By default rsync
237 receiving side before transferring files to try to ensure that there is
238 sufficient space on the receiving filesystem. If you want to delete
239 after transferring, use the --delete-after switch. Implies --delete.
241 +dit(bf(--delete-sent-files)) This tells rsync to remove the source files
242 +on the sending side that are successfully transferred to the receiving
243 +side. Directories are not removed, nor are files that are identical on
246 dit(bf(--ignore-errors)) Tells --delete to go ahead and delete files
247 even when there are I/O errors.
248 --- sender.c 17 Feb 2004 21:57:44 -0000 1.38
249 +++ sender.c 23 Feb 2004 18:16:27 -0000
250 @@ -27,6 +27,7 @@ extern int dry_run;
251 extern int am_server;
252 extern int am_daemon;
253 extern int protocol_version;
254 +extern int delete_sent_files;
258 @@ -104,7 +105,29 @@ static struct sum_struct *receive_sums(i
262 +static struct file_list *the_flist;
264 +void successful_send(int i)
266 + char fname[MAXPATHLEN];
267 + struct file_struct *file;
268 + unsigned int offset;
273 + file = the_flist->files[i];
274 + if (!(file->flags & FLAG_SENT))
275 + return; /* We didn't send it -- impossible! */
276 + if (file->basedir) {
277 + offset = stringjoin(fname, sizeof fname,
278 + file->basedir, "/", NULL);
281 + f_name_to(file, fname + offset);
282 + if (delete_sent_files && do_unlink(fname) == 0 && verbose > 0)
283 + rprintf(FINFO, "sender removed %s\n", fname + offset);
286 void send_files(struct file_list *flist, int f_out, int f_in)
288 @@ -129,6 +152,8 @@ void send_files(struct file_list *flist,
290 rprintf(FINFO, "send_files starting\n");
297 @@ -302,6 +327,9 @@ void send_files(struct file_list *flist,
300 rprintf(FINFO, "sender finished %s\n", fname);
302 + /* Flag that we actually sent this entry. */
303 + file->flags |= FLAG_SENT;