-/*
- Copyright (C) Andrew Tridgell 1996
+/* -*- c-file-style: "linux" -*-
+
+ Copyright (C) 1996-2001 by Andrew Tridgell <tridge@samba.org>
Copyright (C) Paul Mackerras 1996
This program is free software; you can redistribute it and/or modify
msleep(20);
io_flush();
}
+
+ /* TODO: If the child exited on a signal, then log an
+ * appropriate error message. Perhaps we should also accept a
+ * message describing the purpose of the child. Also indicate
+ * this to the caller so that thhey know something went
+ * wrong. */
*status = WEXITSTATUS(*status);
}
}
+/* Start the remote shell. cmd may be NULL to use the default. */
+/* TODO: When the shell exits, look at its return value, as this may
+ * well tell us if something went wrong in trying to connect to the
+ * remote machine. Although it doesn't seem to be specified anywhere,
+ * ssh and the shell seem to return these values:
+ *
+ * 124 if the command exited with status 255
+ * 125 if the command is killed by a signal
+ * 126 if the command cannot be run
+ * 127 if the command is not found
+ *
+ * and we could use this to give a better explanation if the remote
+ * command is not found.
+ */
static int do_cmd(char *cmd,char *machine,char *user,char *path,int *f_in,int *f_out)
{
char *args[100];
exit_cleanup(0);
}
+
+/*
+ * This is called once the connection has been negotiated. It is used
+ * for rsyncd, remote-shell, and local connections.
+ */
int client_run(int f_in, int f_out, int pid, int argc, char *argv[])
{
struct file_list *flist;
return p;
}
+
+/*
+ * Start a client for either type of remote connection. Work out
+ * whether the arguments request a remote shell or rsyncd connection,
+ * and call the appropriate connection function, then run_client.
+ */
static int start_client(int argc, char *argv[])
{
char *p;
am_sender = 0;
*p = 0;
- shell_machine = argv[0];
+ shell_machine = argv0;
shell_path = p+1;
argc--;
argv++;
carried across */
orig_umask = (int)umask(0);
- if (!parse_arguments(argc, argv, 1)) {
+ if (!parse_arguments(&argc, (const char ***) &argv, 1)) {
+ /* FIXME: We ought to call the same error-handling
+ * code here, rather than relying on getopt. */
+ option_error();
exit_cleanup(RERR_SYNTAX);
}
- argc -= optind;
- argv += optind;
- optind = 0;
-
signal(SIGCHLD,SIG_IGN);
signal(SIGINT,SIGNAL_CAST sig_int);
signal(SIGPIPE,SIGNAL_CAST sig_int);