|
version 1.1, 2012/02/17 15:09:30
|
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-2009 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 26 extern int am_sender;
|
Line 26 extern int am_sender;
|
| extern int am_server; |
extern int am_server; |
| extern int blocking_io; |
extern int blocking_io; |
| extern int filesfrom_fd; |
extern int filesfrom_fd; |
| extern mode_t orig_umask; | 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 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 49 pid_t piped_child(char **command, int *f_in, int *f_ou
|
Line 56 pid_t piped_child(char **command, int *f_in, int *f_ou
|
| int to_child_pipe[2]; |
int to_child_pipe[2]; |
| int from_child_pipe[2]; |
int from_child_pipe[2]; |
| |
|
| if (verbose >= 2) | if (DEBUG_GTE(CMD, 1)) |
| print_child_argv("opening connection using:", command); |
print_child_argv("opening connection using:", command); |
| |
|
| if (fd_pair(to_child_pipe) < 0 || fd_pair(from_child_pipe) < 0) { |
if (fd_pair(to_child_pipe) < 0 || fd_pair(from_child_pipe) < 0) { |
|
Line 64 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 75 pid_t piped_child(char **command, int *f_in, int *f_ou
|
Line 82 pid_t piped_child(char **command, int *f_in, int *f_ou
|
| close(to_child_pipe[0]); |
close(to_child_pipe[0]); |
| if (from_child_pipe[1] != STDOUT_FILENO) |
if (from_child_pipe[1] != STDOUT_FILENO) |
| close(from_child_pipe[1]); |
close(from_child_pipe[1]); |
| umask(orig_umask); |
|
| set_blocking(STDIN_FILENO); |
set_blocking(STDIN_FILENO); |
| if (blocking_io > 0) |
if (blocking_io > 0) |
| set_blocking(STDOUT_FILENO); |
set_blocking(STDOUT_FILENO); |
|
Line 115 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 131 pid_t local_child(int argc, char **argv, int *f_in, in
|
Line 136 pid_t local_child(int argc, char **argv, int *f_in, in
|
| am_sender = 0; |
am_sender = 0; |
| am_server = 1; |
am_server = 1; |
| filesfrom_fd = -1; |
filesfrom_fd = -1; |
| |
munge_symlinks = 0; /* Each side needs its own option. */ |
| chmod_modes = NULL; /* Let the sending side handle this. */ |
chmod_modes = NULL; /* Let the sending side handle this. */ |
| |
|
| /* Let the client side handle this. */ |
/* Let the client side handle this. */ |
|
Line 139 pid_t local_child(int argc, char **argv, int *f_in, in
|
Line 145 pid_t local_child(int argc, char **argv, int *f_in, in
|
| logfile_close(); |
logfile_close(); |
| } |
} |
| |
|
| if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 || | if (remote_option_cnt) { |
| close(to_child_pipe[1]) < 0 || | const char *db_config_save = db_config; |
| close(from_child_pipe[0]) < 0 || | int rc = remote_option_cnt + 1; |
| dup2(from_child_pipe[1], STDOUT_FILENO) < 0) { | const char **rv = remote_options; |
| | if (!parse_arguments(&rc, &rv)) { |
| | option_error(); |
| | 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 |
| | || close(to_child_pipe[1]) < 0 |
| | || close(from_child_pipe[0]) < 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 156 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; |
| } |
} |