+extern int recurse;
+extern int xfer_dirs;
+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 int do_compression;
+extern int def_compress_level;
+extern int protocol_version;
+extern char *batch_name;
+
+extern struct filter_list_struct filter_list;
+
+static int tweaked_compress_level;
+
+static int *flag_ptr[] = {
+ &recurse, /* 0 */
+ &preserve_uid, /* 1 */
+ &preserve_gid, /* 2 */
+ &preserve_links, /* 3 */
+ &preserve_devices, /* 4 */
+ &preserve_hard_links, /* 5 */
+ &always_checksum, /* 6 */
+ &xfer_dirs, /* 7 (protocol 29) */
+ &tweaked_compress_level,/* 8 (protocol 29) */
+ NULL
+};
+
+static char *flag_name[] = {
+ "--recurse (-r)",
+ "--owner (-o)",
+ "--group (-g)",
+ "--links (-l)",
+ "--devices (-D)",
+ "--hard-links (-H)",
+ "--checksum (-c)",
+ "--dirs (-d)",
+ "--compress (-z)",
+ NULL
+};
+
+void write_stream_flags(int fd)
+{
+ int i, flags;
+
+#if Z_DEFAULT_COMPRESSION == -1
+ tweaked_compress_level = do_compression ? def_compress_level + 2 : 0;
+#else
+#error internal logic error! Fix def_compress_level logic above and below too!
+#endif
+
+ /* Start the batch file with a bitmap of data-stream-affecting
+ * flags. */
+ if (protocol_version < 29)
+ flag_ptr[7] = NULL;
+ for (i = 0, flags = 0; flag_ptr[i]; i++) {
+ if (*flag_ptr[i])
+ flags |= 1 << i;
+ }
+ write_int(fd, flags);
+}