Support both RSYNC_SHELL & RSYNC_NO_XFER_EXEC environment variables.
ENHANCEMENTS:
- - ...
+ - Added support for RSYNC_SHELL & RSYNC_NO_XFER_EXEC environment variables
+ that affect the pre-xfer exec and post-xfer exec rsync daemon options.
log_init(1);
#ifdef HAVE_PUTENV
- if (*lp_prexfer_exec(i) || *lp_postxfer_exec(i)) {
+ if ((*lp_prexfer_exec(i) || *lp_postxfer_exec(i)) && !getenv("RSYNC_NO_XFER_EXEC")) {
int status;
/* For post-xfer exec, fork a new process to run the rsync
else
status = -1;
set_env_num("RSYNC_EXIT_STATUS", status);
- if (system(lp_postxfer_exec(i)) < 0)
+ if (shell_exec(lp_postxfer_exec(i)) < 0)
status = -1;
_exit(status);
}
close(STDIN_FILENO);
dup2(pre_exec_error_fd, STDOUT_FILENO);
close(pre_exec_error_fd);
- status = system(lp_prexfer_exec(i));
+ status = shell_exec(lp_prexfer_exec(i));
if (!WIFEXITED(status))
_exit(1);
_exit(WEXITSTATUS(status));
return waited_pid;
}
+int shell_exec(const char *cmd)
+{
+ char *shell = getenv("RSYNC_SHELL");
+ int status;
+ pid_t pid;
+
+ if (!shell)
+ return system(cmd);
+
+ if ((pid = fork()) < 0)
+ return -1;
+
+ if (pid == 0) {
+ execlp(shell, shell, "-c", cmd, NULL);
+ _exit(1);
+ }
+
+ int ret = wait_process(pid, &status, 0);
+ return ret < 0 ? -1 : status;
+}
+
/* Wait for a process to exit, calling io_flush while waiting. */
static void wait_process_with_flush(pid_t pid, int *exit_code_ptr)
{
if (cmd_fmt)
return cmd_fmt;
- else
- return "xterm -display :0 -T Panic -n Panic "
- "-e gdb /proc/%d/exe %d";
+ return "xterm -display :0 -T Panic -n Panic -e gdb /proc/%d/exe %d";
}
/* Unless we failed to execute gdb, we allow the process to
* continue. I'm not sure if that's right. */
- ret = system(cmd_buf);
+ ret = shell_exec(cmd_buf);
if (ret)
_exit(ret);
}
which forwards all data to port 873 (the rsync daemon) on the targethost
(%H).
+Note also that if the RSYNC_SHELL environment varibable is set, that
+program will be used to run the RSYNC_CONNECT_PROG command instead of
+using the default shell of the system() call.
+
manpagesection(USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION)
It is sometimes useful to use various features of an rsync daemon (such as
are run using the permissions of the user that started the daemon (not the
module's uid/gid setting) without any chroot restrictions.
+These settings honor 2 environment variables: use RSYNC_SHELL to set a shell to
+use when running the command (which otherwise uses your system() call's default
+shell), and use RSYNC_NO_XFER_EXEC to disable both options completely.
+
)
manpagesection(CONFIG DIRECTIVES)
fprintf(stderr, "Failed to run \"%s\"\n", prog);
exit(1);
}
- exit(system(prog));
+ exit(shell_exec(prog));
}
close(fd[1]);