Diff for /embedaddon/rsync/pipe.c between versions 1.1.1.3 and 1.1.1.4

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;
 }  }

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>