extern int local_server;
extern char *rsync_path;
extern int blocking_io;
+ extern int daemon_over_rsh;
extern int read_batch;
if (!read_batch && !local_server) {
args[argc++] = ".";
- if (path && *path)
+ if (!daemon_over_rsh && path && *path)
args[argc++] = path;
args[argc] = NULL;
extern int am_sender;
extern char *shell_cmd;
extern int rsync_port;
+ extern int daemon_over_rsh;
extern int read_batch;
int rc;
/* Don't clobber argv[] so that ps(1) can still show the right
command line. */
- if ((rc = copy_argv (argv)))
+ if ((rc = copy_argv(argv)))
return rc;
+ /* rsync:// always uses rsync server over direct socket connection */
if (strncasecmp(URL_PREFIX, argv[0], strlen(URL_PREFIX)) == 0) {
char *host, *path;
if (p) {
if (p[1] == ':') { /* double colon */
*p = 0;
- return start_socket_client(argv[0], p+2, argc-1, argv+1);
+ if (!shell_cmd) {
+ return start_socket_client(argv[0], p+2,
+ argc-1, argv+1);
+ }
+ p++;
+ daemon_over_rsh = 1;
}
if (argc < 1) {
p = find_colon(argv[argc-1]);
if (!p) {
local_server = 1;
- } else if (p[1] == ':') {
+ } else if (p[1] == ':') { /* double colon */
*p = 0;
- return start_socket_client(argv[argc-1], p+2, argc-1, argv);
+ if (!shell_cmd) {
+ return start_socket_client(argv[argc-1], p+2,
+ argc-1, argv);
+ }
+ p++;
+ daemon_over_rsh = 1;
}
if (argc < 2) {
list_only = 1;
}
- pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,&f_in,&f_out);
-
+ pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,
+ &f_in,&f_out);
+
+ /* if we're running an rsync server on the remote host over a
+ remote shell command, we need to do the RSYNCD protocol first */
+ if (daemon_over_rsh) {
+ int tmpret;
+ tmpret = start_inband_exchange(shell_user, shell_path,
+ f_in, f_out, argc);
+ if (tmpret < 0)
+ return tmpret;
+ }
+
ret = client_run(f_in, f_out, pid, argc, argv);
fflush(stdout);
}
+/**
+ * Handle a fatal signal by launching a debugger, controlled by $RSYNC_PANIC_ACTION.
+ *
+ * This signal handler is only installed if we were configured with
+ * --enable-maintainer-mode. Perhaps it should always be on and we
+ * should just look at the environment variable, but I'm a bit leery
+ * of a signal sending us into a busy loop.
+ **/
static RETSIGTYPE rsync_panic_handler(int UNUSED(whatsig))
{
char cmd_buf[300];
write_batch_argvs_file(orig_argc, orig_argv);
}
- if (am_daemon) {
+ if (am_daemon && !am_server)
return daemon_main();
- }
if (argc < 1) {
usage(FERROR);
if (am_server) {
set_nonblocking(STDIN_FILENO);
set_nonblocking(STDOUT_FILENO);
+ if (am_daemon)
+ return start_daemon(STDIN_FILENO, STDOUT_FILENO);
start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
}