version 1.1.1.3, 2016/11/01 09:54:32
|
version 1.1.1.4, 2021/03/17 00:32:36
|
Line 4
|
Line 4
|
* Copyright (C) 1996-2000 Andrew Tridgell |
* Copyright (C) 1996-2000 Andrew Tridgell |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2004-2015 Wayne Davison | * Copyright (C) 2004-2020 Wayne Davison |
* |
* |
* This program is free software; you can redistribute it and/or modify |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
Line 27 extern int am_server;
|
Line 27 extern int am_server;
|
extern int blocking_io; |
extern int blocking_io; |
extern int filesfrom_fd; |
extern int filesfrom_fd; |
extern int munge_symlinks; |
extern int munge_symlinks; |
|
extern int always_checksum; |
|
extern int use_db; |
|
extern char *db_config; |
extern char *logfile_name; |
extern char *logfile_name; |
extern int remote_option_cnt; |
extern int remote_option_cnt; |
extern const char **remote_options; |
extern const char **remote_options; |
extern struct chmod_mode_struct *chmod_modes; |
extern struct chmod_mode_struct *chmod_modes; |
|
|
|
int same_db = 0; |
|
|
/** |
/** |
* Create a child connected to us via its stdin/stdout. |
* Create a child connected to us via its stdin/stdout. |
* |
* |
Line 66 pid_t piped_child(char **command, int *f_in, int *f_ou
|
Line 71 pid_t piped_child(char **command, int *f_in, int *f_ou
|
} |
} |
|
|
if (pid == 0) { |
if (pid == 0) { |
if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || | if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 |
close(to_child_pipe[1]) < 0 || | || close(to_child_pipe[1]) < 0 |
close(from_child_pipe[0]) < 0 || | || close(from_child_pipe[0]) < 0 |
dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { | || dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { |
rsyserr(FERROR, errno, "Failed to dup/close"); |
rsyserr(FERROR, errno, "Failed to dup/close"); |
exit_cleanup(RERR_IPC); |
exit_cleanup(RERR_IPC); |
} |
} |
Line 116 pid_t local_child(int argc, char **argv, int *f_in, in
|
Line 121 pid_t local_child(int argc, char **argv, int *f_in, in
|
/* The parent process is always the sender for a local rsync. */ |
/* The parent process is always the sender for a local rsync. */ |
assert(am_sender); |
assert(am_sender); |
|
|
if (fd_pair(to_child_pipe) < 0 || | if (fd_pair(to_child_pipe) < 0 || fd_pair(from_child_pipe) < 0) { |
fd_pair(from_child_pipe) < 0) { | |
rsyserr(FERROR, errno, "pipe"); |
rsyserr(FERROR, errno, "pipe"); |
exit_cleanup(RERR_IPC); |
exit_cleanup(RERR_IPC); |
} |
} |
Line 142 pid_t local_child(int argc, char **argv, int *f_in, in
|
Line 146 pid_t local_child(int argc, char **argv, int *f_in, in
|
} |
} |
|
|
if (remote_option_cnt) { |
if (remote_option_cnt) { |
|
const char *db_config_save = db_config; |
int rc = remote_option_cnt + 1; |
int rc = remote_option_cnt + 1; |
const char **rv = remote_options; |
const char **rv = remote_options; |
if (!parse_arguments(&rc, &rv)) { |
if (!parse_arguments(&rc, &rv)) { |
option_error(); |
option_error(); |
exit_cleanup(RERR_SYNTAX); |
exit_cleanup(RERR_SYNTAX); |
} |
} |
} | if (db_config == db_config_save) |
| same_db = db_config != NULL; |
| else if (!db_config || !db_config_save || strcmp(db_config, db_config_save) != 0) { |
| use_db = 0; |
| if (db_config) |
| db_read_config(FERROR, db_config); |
| } |
| } else if (use_db) |
| same_db = 1; |
|
|
if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || | if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 |
close(to_child_pipe[1]) < 0 || | || close(to_child_pipe[1]) < 0 |
close(from_child_pipe[0]) < 0 || | || close(from_child_pipe[0]) < 0 |
dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { | || dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { |
rsyserr(FERROR, errno, "Failed to dup/close"); |
rsyserr(FERROR, errno, "Failed to dup/close"); |
exit_cleanup(RERR_IPC); |
exit_cleanup(RERR_IPC); |
} |
} |
Line 167 pid_t local_child(int argc, char **argv, int *f_in, in
|
Line 180 pid_t local_child(int argc, char **argv, int *f_in, in
|
child_main(argc, argv); |
child_main(argc, argv); |
} |
} |
|
|
if (close(from_child_pipe[1]) < 0 || | if (close(from_child_pipe[1]) < 0 || close(to_child_pipe[0]) < 0) { |
close(to_child_pipe[0]) < 0) { | |
rsyserr(FERROR, errno, "Failed to close"); |
rsyserr(FERROR, errno, "Failed to close"); |
exit_cleanup(RERR_IPC); |
exit_cleanup(RERR_IPC); |
} |
} |
|
|
*f_in = from_child_pipe[0]; |
*f_in = from_child_pipe[0]; |
*f_out = to_child_pipe[1]; |
*f_out = to_child_pipe[1]; |
|
|
|
return pid; |
|
} |
|
|
|
pid_t run_filter(char *command[], int out, int *pipe_to_filter) |
|
{ |
|
pid_t pid; |
|
int pipefds[2]; |
|
|
|
if (DEBUG_GTE(CMD, 1)) |
|
print_child_argv("opening connection using:", command); |
|
|
|
if (pipe(pipefds) < 0) { |
|
rsyserr(FERROR, errno, "pipe"); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
|
|
pid = do_fork(); |
|
if (pid == -1) { |
|
rsyserr(FERROR, errno, "fork"); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
|
|
if (pid == 0) { |
|
if (dup2(pipefds[0], STDIN_FILENO) < 0 |
|
|| close(pipefds[1]) < 0 |
|
|| dup2(out, STDOUT_FILENO) < 0) { |
|
rsyserr(FERROR, errno, "Failed dup/close"); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
umask(orig_umask); |
|
set_blocking(STDIN_FILENO); |
|
if (blocking_io) |
|
set_blocking(STDOUT_FILENO); |
|
execvp(command[0], command); |
|
rsyserr(FERROR, errno, "Failed to exec %s", command[0]); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
|
|
if (close(pipefds[0]) < 0) { |
|
rsyserr(FERROR, errno, "Failed to close"); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
|
|
*pipe_to_filter = pipefds[1]; |
|
|
|
return pid; |
|
} |
|
|
|
pid_t run_filter_on_file(char *command[], int out, int in) |
|
{ |
|
pid_t pid; |
|
|
|
if (DEBUG_GTE(CMD, 1)) |
|
print_child_argv("opening connection using:", command); |
|
|
|
pid = do_fork(); |
|
if (pid == -1) { |
|
rsyserr(FERROR, errno, "fork"); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
|
|
if (pid == 0) { |
|
if (dup2(in, STDIN_FILENO) < 0 |
|
|| dup2(out, STDOUT_FILENO) < 0) { |
|
rsyserr(FERROR, errno, "Failed to dup2"); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
if (blocking_io) |
|
set_blocking(STDOUT_FILENO); |
|
execvp(command[0], command); |
|
rsyserr(FERROR, errno, "Failed to exec %s", command[0]); |
|
exit_cleanup(RERR_IPC); |
|
} |
|
|
return pid; |
return pid; |
} |
} |