X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/76f79ba748adeacdb966d01fa09d75f0dfb69f3b..0cd2f40764dd156de309f7536f3867968b6c0fdd:/util.c diff --git a/util.c b/util.c index 5554d00f..f3c126bc 100644 --- a/util.c +++ b/util.c @@ -84,6 +84,26 @@ int fd_pair(int fd[2]) } +void print_child_argv(char **cmd) +{ + rprintf(FINFO, RSYNC_NAME ": open connection using "); + for (; *cmd; cmd++) { + /* Look for characters that ought to be quoted. This + * is not a great quoting algorithm, but it's + * sufficient for a log message. */ + if (strspn(*cmd, "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + ",.-_=+@/") != strlen(*cmd)) { + rprintf(FINFO, "\"%s\" ", *cmd); + } else { + rprintf(FINFO, "%s ", *cmd); + } + } + rprintf(FINFO, "\n"); +} + + /* this is derived from CVS code note that in the child STDIN is set to blocking and STDOUT @@ -94,59 +114,63 @@ int fd_pair(int fd[2]) used to cope with badly broken rsh implementations like the one on solaris. */ -pid_t piped_child(char **command,int *f_in,int *f_out) +pid_t piped_child(char **command, int *f_in, int *f_out) { - pid_t pid; - int to_child_pipe[2]; - int from_child_pipe[2]; - extern int blocking_io; - - if (fd_pair(to_child_pipe) < 0 || - fd_pair(from_child_pipe) < 0) { - rprintf(FERROR,"pipe: %s\n",strerror(errno)); - exit_cleanup(RERR_IPC); - } - - - pid = do_fork(); - if (pid == -1) { - rprintf(FERROR,"fork: %s\n",strerror(errno)); - exit_cleanup(RERR_IPC); - } - - if (pid == 0) - { - extern int orig_umask; - if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || - close(to_child_pipe[1]) < 0 || - close(from_child_pipe[0]) < 0 || - dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { - rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno)); - exit_cleanup(RERR_IPC); - } - if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]); - if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]); - umask(orig_umask); - set_blocking(STDIN_FILENO); - if (blocking_io) { - set_blocking(STDOUT_FILENO); - } - execvp(command[0], command); - rprintf(FERROR,"Failed to exec %s : %s\n", - command[0],strerror(errno)); - exit_cleanup(RERR_IPC); - } + pid_t pid; + int to_child_pipe[2]; + int from_child_pipe[2]; + extern int blocking_io; + + if (verbose > 0) { + print_child_argv(command); + } + + if (fd_pair(to_child_pipe) < 0 || fd_pair(from_child_pipe) < 0) { + rprintf(FERROR, "pipe: %s\n", strerror(errno)); + exit_cleanup(RERR_IPC); + } + + + pid = do_fork(); + if (pid == -1) { + rprintf(FERROR, "fork: %s\n", strerror(errno)); + exit_cleanup(RERR_IPC); + } - if (close(from_child_pipe[1]) < 0 || - close(to_child_pipe[0]) < 0) { - rprintf(FERROR,"Failed to close : %s\n",strerror(errno)); - exit_cleanup(RERR_IPC); - } + if (pid == 0) { + extern int orig_umask; + if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || + close(to_child_pipe[1]) < 0 || + close(from_child_pipe[0]) < 0 || + dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { + rprintf(FERROR, "Failed to dup/close : %s\n", + strerror(errno)); + exit_cleanup(RERR_IPC); + } + if (to_child_pipe[0] != STDIN_FILENO) + close(to_child_pipe[0]); + if (from_child_pipe[1] != STDOUT_FILENO) + close(from_child_pipe[1]); + umask(orig_umask); + set_blocking(STDIN_FILENO); + if (blocking_io) { + set_blocking(STDOUT_FILENO); + } + execvp(command[0], command); + rprintf(FERROR, "Failed to exec %s : %s\n", + command[0], strerror(errno)); + exit_cleanup(RERR_IPC); + } - *f_in = from_child_pipe[0]; - *f_out = to_child_pipe[1]; + if (close(from_child_pipe[1]) < 0 || close(to_child_pipe[0]) < 0) { + rprintf(FERROR, "Failed to close : %s\n", strerror(errno)); + exit_cleanup(RERR_IPC); + } - return pid; + *f_in = from_child_pipe[0]; + *f_out = to_child_pipe[1]; + + return pid; } pid_t local_child(int argc, char **argv,int *f_in,int *f_out)