extern char curr_dir[MAXPATHLEN];
extern struct file_list *first_flist;
extern struct filter_list_struct server_filter_list;
+#ifdef ICONV_OPTION
+extern iconv_t ic_send;
+#endif
int local_server = 0;
int daemon_over_rsh = 0;
ret = local_child(argc, args, f_in_p, f_out_p, child_main);
} else {
if (protect_args) {
- char *save_opts1, *save_opts2;
- for (i = 0; strcmp(args[i], "--server") != 0; i++) {}
- save_opts1 = args[i+1];
- save_opts2 = args[i+2];
- args[i+1] = "-s";
- args[i+2] = NULL;
+ int fd;
+#ifdef ICONV_OPTION
+ int convert = ic_send != (iconv_t)-1;
+ xbuf outbuf, inbuf;
+
+ if (convert)
+ alloc_xbuf(&outbuf, 1024);
+#endif
+
ret = piped_child(args, f_in_p, f_out_p);
- args[i] = args[i-1]; /* move command name over --server */
- args[i+1] = save_opts1;
- args[i+2] = save_opts2;
- while (args[i]) {
- write_sbuf(*f_out_p, args[i++]);
- write_byte(*f_out_p, 0);
- }
- write_byte(*f_out_p, 0);
+
+ for (i = 0; args[i]; i++) {} /* find first NULL */
+ args[i] = "rsync"; /* set a new arg0 */
+ if (verbose > 1)
+ print_child_argv("protected args:", args + i + 1);
+ fd = *f_out_p;
+ do {
+#ifdef ICONV_OPTION
+ if (convert) {
+ INIT_XBUF_STRLEN(inbuf, args[i]);
+ iconvbufs(ic_send, &inbuf, &outbuf,
+ ICB_EXPAND_OUT | ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
+ outbuf.buf[outbuf.len] = '\0';
+ write_buf(fd, outbuf.buf, outbuf.len + 1);
+ outbuf.len = 0;
+ } else
+#endif
+ write_buf(fd, args[i], strlen(args[i]) + 1);
+ } while (args[++i]);
+ write_byte(fd, 0);
+#ifdef ICONV_OPTION
+ if (convert)
+ free(outbuf.buf);
+#endif
} else
ret = piped_child(args, f_in_p, f_out_p);
}
io_set_sock_fds(f_in, f_out);
setup_protocol(f_out, f_in);
-#ifdef ICONV_CONST
- setup_iconv();
-#endif
if (protocol_version >= 23)
io_start_multiplex_out();
io_set_sock_fds(f_in, f_out);
setup_protocol(f_out,f_in);
-#ifdef ICONV_CONST
- setup_iconv();
-#endif
/* We set our stderr file handle to blocking because ssh might have
* set it to non-blocking. This can be particularly troublesome if
if (am_server && protect_args) {
char buf[MAXPATHLEN];
- protect_args = 0;
+ protect_args = 2;
read_args(STDIN_FILENO, NULL, buf, sizeof buf, 1, &argv, &argc, NULL);
if (!parse_arguments(&argc, (const char ***) &argv, 1)) {
option_error();