From 71605b0f4d554c06e0e4ee1f3180adbdb02d441d Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Tue, 18 Sep 2007 01:11:49 +0000 Subject: [PATCH] - Make use of new iconvbufs() function. - Convert protected args when -s and --iconv are active. - Simplified the splitting of args between normal and protected. - Relocated setup_iconv() call so that it takes effect earlier. --- main.c | 58 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/main.c b/main.c index 188a99e0..bf3166f4 100644 --- a/main.c +++ b/main.c @@ -73,6 +73,9 @@ extern char *password_file; 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; @@ -451,21 +454,40 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in 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); } @@ -933,9 +955,6 @@ void start_server(int f_in, int f_out, int argc, char *argv[]) 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(); @@ -970,9 +989,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) 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 @@ -1442,7 +1458,7 @@ int main(int argc,char *argv[]) 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(); -- 2.34.1