/* -*- c-file-style: "linux"; -*-
Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
- Copyright (C) 2001 by Martin Pool <mbp@samba.org>
+ Copyright (C) 2001-2002 by Martin Pool <mbp@samba.org>
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
char *auth_user;
int sanitize_paths = 0;
-/*
+/**
* Run a client connected to an rsyncd. The alternative to this
- * function for remote-shell connections is do_cmd.
- */
+ * function for remote-shell connections is do_cmd().
+ *
+ * After initial server startup, hands over to client_run().
+ *
+ * @return -1 for error in startup, or the result of client_run().
+ **/
int start_socket_client(char *host, char *path, int argc, char *argv[])
{
int fd, i;
extern int remote_version;
extern int am_sender;
extern char *shell_cmd;
+ extern int list_only;
extern int kludge_around_eof;
extern char *bind_address;
extern int default_af_hint;
if (!user) user = getenv("LOGNAME");
if (verbose >= 2) {
+ /* FIXME: If we're going to use a socket program for
+ * testing, then this message is wrong. We need to
+ * say something like "(except really using %s)" */
+ rprintf(FINFO, "opening tcp connection to %s port %d\n",
+ host, rsync_port);
}
fd = open_socket_out_wrapped (host, rsync_port, bind_address,
default_af_hint);
io_printf(fd,"@RSYNCD: %d\n", PROTOCOL_VERSION);
if (!read_line(fd, line, sizeof(line)-1)) {
+ rprintf(FERROR, "rsync: did not see server greeting\n");
return -1;
}
if (sscanf(line,"@RSYNCD: %d", &remote_version) != 1) {
+ /* note that read_line strips of \n or \r */
+ rprintf(FERROR, "rsync: server sent \"%s\" rather than greeting\n",
+ line);
return -1;
}
/* Old servers may just drop the connection here,
rather than sending a proper EXIT command. Yuck. */
- kludge_around_eof = remote_version < 25;
+ kludge_around_eof = list_only && (remote_version < 25);
while (1) {
if (!read_line(fd, line, sizeof(line)-1)) {
+ rprintf(FERROR, "rsync: didn't get server startup line\n");
return -1;
}
if (strcmp(line,"@RSYNCD: EXIT") == 0) exit(0);
- rprintf(FINFO,"%s\n", line);
+ if (strncmp(line, "@ERROR", 6) == 0)
+ rprintf(FERROR,"%s\n", line);
+ else
+ rprintf(FINFO,"%s\n", line);
}
kludge_around_eof = False;
}
if (am_root) {
+#ifdef HAVE_SETGROUPS
+ /* Get rid of any supplementary groups this process
+ * might have inheristed. */
+ if (setgroups(0, NULL)) {
+ rsyserr(FERROR, errno, "setgroups failed");
+ io_printf(fd, "@ERROR: setgroups failed\n");
+ return -1;
+ }
+#endif
+
+ /* XXXX: You could argue that if the daemon is started
+ * by a non-root user and they explicitly specify a
+ * gid, then we should try to change to that gid --
+ * this could be possible if it's already in their
+ * supplementary groups. */
+
+ /* TODO: Perhaps we need to document that if rsyncd is
+ * started by somebody other than root it will inherit
+ * all their supplementary groups. */
+
if (setgid(gid)) {
rsyserr(FERROR, errno, "setgid %d failed", (int) gid);
io_printf(fd,"@ERROR: setgid failed\n");