-extern char *batch_prefix;
-
-struct file_list *batch_flist;
-
-static char rsync_flist_file[] = ".rsync_flist";
-static char rsync_csums_file[] = ".rsync_csums";
-static char rsync_delta_file[] = ".rsync_delta";
-static char rsync_argvs_file[] = ".rsync_argvs";
-
-static int fdb;
-static int fdb_delta;
-static int fdb_open;
-static int fdb_close;
-
-void write_batch_flist_file(char *buff, int bytes_to_write)
-{
- char filename[MAXPATHLEN];
-
- if (fdb_open) {
- /* Set up file extension */
- strlcpy(filename, batch_prefix, sizeof(filename));
- strlcat(filename, rsync_flist_file, sizeof(filename));
-
- /*
- * Open batch flist file for writing;
- * create it if it doesn't exist
- */
- fdb = do_open(filename, O_WRONLY | O_CREAT | O_TRUNC,
- S_IREAD | S_IWRITE);
- if (fdb == -1) {
- rprintf(FERROR, "Batch file %s open error: %s\n",
- filename, strerror(errno));
- close(fdb);
- exit_cleanup(1);
- }
- fdb_open = 0;
- }
-
- /* Write buffer to batch flist file */
-
- if (write(fdb, buff, bytes_to_write) == -1) {
- rprintf(FERROR, "Batch file %s write error: %s\n",
- filename, strerror(errno));
- close(fdb);
- exit_cleanup(1);
- }
-
- if (fdb_close) {
- close(fdb);
- }
-}
-
-/* TODO: Someone please rewrite this! Why in the world don't we use
- * the send/receive code from flist.c for this? */
-void write_batch_flist_info(int flist_count, struct file_struct **fptr)
-{
- int i;
- int bytes_to_write;
-
- /* Write flist info to batch file */
-
- bytes_to_write =
- sizeof(time_t) +
- sizeof(OFF_T) +
- sizeof(mode_t) +
- sizeof(INO64_T) +
- sizeof(DEV64_T) +
- sizeof(DEV64_T) +
- sizeof(uid_t) +
- sizeof(gid_t);
-
- fdb_open = 1;
- fdb_close = 0;
-
- for (i = 0; i < flist_count; i++) {
- write_batch_flist_file((char*)&fptr[i]->flags, sizeof fptr[0]->flags);
- write_batch_flist_file((char*)fptr[i], bytes_to_write);
- write_char_bufs(fptr[i]->basename);
- write_char_bufs(fptr[i]->dirname);
- write_char_bufs(fptr[i]->basedir);
- write_char_bufs(fptr[i]->link);
- if (i == flist_count - 1) {
- fdb_close = 1;
- }
- write_char_bufs(fptr[i]->sum);
- }
-}
-
-void write_char_bufs(char *buf)
-{
- /* Write the size of the string which will follow */
-
- char b[4];
-
- SIVAL(b, 0, buf != NULL ? strlen(buf) : 0);
-
- write_batch_flist_file(b, sizeof(int));
-
- /* Write the string if there is one */
-
- if (buf != NULL) {
- write_batch_flist_file(buf, strlen(buf));
- }
-}
-
-void write_batch_argvs_file(int argc, char *argv[])
-{
- int fdb;
- int i;
- char buff[256]; /* XXX */
- char buff2[MAXPATHLEN + 6];
- char filename[MAXPATHLEN];
-
- /* Set up file extension */
- strlcpy(filename, batch_prefix, sizeof(filename));
- strlcat(filename, rsync_argvs_file, sizeof(filename));
-
- /*
- * Open batch argvs file for writing;
- * create it if it doesn't exist
- */
- fdb = do_open(filename, O_WRONLY | O_CREAT | O_TRUNC,
- S_IREAD | S_IWRITE | S_IEXEC);
- if (fdb == -1) {
- rprintf(FERROR, "Batch file %s open error: %s\n",
- filename, strerror(errno));
- close(fdb);
- exit_cleanup(1);
- }
- buff[0] = '\0';
-
- /* Write argvs info to batch file */
-
- for (i = 0; i < argc; ++i) {
- if (i == argc - 2) /* Skip source directory on cmdline */
- continue;
- /*
- * FIXME:
- * I think directly manipulating argv[] is probably bogus
- */
- if (!strncmp(argv[i], "--write-batch",
- strlen("--write-batch"))) {
- /* Safer to change it here than script */
- /*
- * Change to --read-batch=prefix
- * to get ready for remote
- */
- strlcat(buff, "--read-batch=", sizeof(buff));
- strlcat(buff, batch_prefix, sizeof(buff));
- } else
- if (i == argc - 1) {
- snprintf(buff2, sizeof(buff2), "${1:-%s}", argv[i]);
- strlcat(buff, buff2, sizeof(buff));
- }
- else {
- strlcat(buff, argv[i], sizeof(buff));
- }
-
- if (i < (argc - 1)) {
- strlcat(buff, " ", sizeof(buff));
+extern char *batch_name;
+extern int delete_mode;
+extern int delete_excluded;
+extern int eol_nulls;
+extern int recurse;
+extern int preserve_links;
+extern int preserve_hard_links;
+extern int preserve_devices;
+extern int preserve_uid;
+extern int preserve_gid;
+extern int always_checksum;
+
+extern struct exclude_list_struct exclude_list;
+
+static int *flag_ptr[] = {
+ &recurse,
+ &preserve_uid,
+ &preserve_gid,
+ &preserve_links,
+ &preserve_devices,
+ &preserve_hard_links,
+ &always_checksum,
+ NULL
+};
+
+static char *flag_name[] = {
+ "--recurse (-r)",
+ "--owner (-o)",
+ "--group (-g)",
+ "--links (-l)",
+ "--devices (-D)",
+ "--hard-links (-H)",
+ "--checksum (-c)",
+ NULL
+};
+
+void write_stream_flags(int fd)
+{
+ int i, flags;
+
+ /* Start the batch file with a bitmap of data-stream-affecting
+ * flags. */
+ for (i = 0, flags = 0; flag_ptr[i]; i++) {
+ if (*flag_ptr[i])
+ flags |= 1 << i;
+ }
+ write_int(fd, flags);
+}
+
+void read_stream_flags(int fd)
+{
+ int i, flags;
+
+ for (i = 0, flags = read_int(fd); flag_ptr[i]; i++) {
+ int set = flags & (1 << i) ? 1 : 0;
+ if (*flag_ptr[i] != set) {
+ if (verbose) {
+ rprintf(FINFO,
+ "%sing the %s option to match the batchfile.\n",
+ set ? "Sett" : "Clear", flag_name[i]);
+ }
+ *flag_ptr[i] = set;