- ret = local_child(argc, args, f_in, f_out, child_main);
- } else
- ret = piped_child(args,f_in,f_out);
+ ret = local_child(argc, args, f_in_p, f_out_p, child_main);
+ } else {
+ if (protect_args) {
+ 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);
+
+ 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);
+ }