Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Moved an extern into its proper place.
[rsync/rsync.git]
/
clientserver.c
diff --git
a/clientserver.c
b/clientserver.c
index
b3d3ceb
..
b631ef2
100644
(file)
--- a/
clientserver.c
+++ b/
clientserver.c
@@
-58,10
+58,15
@@
int read_only = 0;
int daemon_log_format_has_i = 0;
int daemon_log_format_has_o_or_i = 0;
int module_id = -1;
int daemon_log_format_has_i = 0;
int daemon_log_format_has_o_or_i = 0;
int module_id = -1;
+struct chmod_mode_struct *daemon_chmod_modes;
/* Length of lp_path() string when in daemon mode & not chrooted, else 0. */
unsigned int module_dirlen = 0;
/* Length of lp_path() string when in daemon mode & not chrooted, else 0. */
unsigned int module_dirlen = 0;
+#ifdef HAVE_SIGACTION
+static struct sigaction sigact;
+#endif
+
/**
* Run a client connected to an rsyncd. The alternative to this
* function for remote-shell connections is do_cmd().
/**
* Run a client connected to an rsyncd. The alternative to this
* function for remote-shell connections is do_cmd().
@@
-263,7
+268,7
@@
static int read_arg_from_pipe(int fd, char *buf, int limit)
return bp - buf;
}
return bp - buf;
}
-static int rsync_module(int f_in, int f_out, int i)
+static int rsync_module(int f_in, int f_out, int i
, char *addr, char *host
)
{
int argc = 0;
int maxargs;
{
int argc = 0;
int maxargs;
@@
-272,8
+277,6
@@
static int rsync_module(int f_in, int f_out, int i)
uid_t uid = (uid_t)-2; /* canonically "nobody" */
gid_t gid = (gid_t)-2;
char *p, *err_msg = NULL;
uid_t uid = (uid_t)-2; /* canonically "nobody" */
gid_t gid = (gid_t)-2;
char *p, *err_msg = NULL;
- char *addr = client_addr(f_in);
- char *host = client_name(f_in);
char *name = lp_name(i);
int use_chroot = lp_use_chroot(i);
int start_glob = 0;
char *name = lp_name(i);
int use_chroot = lp_use_chroot(i);
int start_glob = 0;
@@
-685,12
+688,15
@@
static int rsync_module(int f_in, int f_out, int i)
if (lp_timeout(i) && lp_timeout(i) > io_timeout)
set_io_timeout(lp_timeout(i));
if (lp_timeout(i) && lp_timeout(i) > io_timeout)
set_io_timeout(lp_timeout(i));
-
+ /* If we have some incoming/outgoing chmod changes, append them to
+ * any user-specified changes (making our changes have priority).
+ * We also get a pointer to just our changes so that a receiver
+ * process can use them separately if --perms wasn't specified. */
if (am_sender)
p = lp_outgoing_chmod(i);
else
p = lp_incoming_chmod(i);
if (am_sender)
p = lp_outgoing_chmod(i);
else
p = lp_incoming_chmod(i);
- if (*p && !
parse_chmod(p, &chmod_modes
)) {
+ if (*p && !
(daemon_chmod_modes = parse_chmod(p, &chmod_modes)
)) {
rprintf(FLOG, "Invalid \"%sing chmod\" directive: %s\n",
am_sender ? "outgo" : "incom", p);
}
rprintf(FLOG, "Invalid \"%sing chmod\" directive: %s\n",
am_sender ? "outgo" : "incom", p);
}
@@
-723,8
+729,12
@@
int start_daemon(int f_in, int f_out)
{
char line[1024];
char *motd;
{
char line[1024];
char *motd;
+ char *addr = client_addr(f_in);
+ char *host = client_name(f_in);
int i;
int i;
+ rprintf(FLOG, "connect from %s (%s)\n", host, addr);
+
io_set_sock_fds(f_in, f_out);
if (!lp_load(config_file, 0))
io_set_sock_fds(f_in, f_out);
if (!lp_load(config_file, 0))
@@
-773,6
+783,8
@@
int start_daemon(int f_in, int f_out)
return -1;
if (!*line || strcmp(line, "#list") == 0) {
return -1;
if (!*line || strcmp(line, "#list") == 0) {
+ rprintf(FLOG, "module-list request from %s (%s)\n",
+ host, addr);
send_listing(f_out);
return -1;
}
send_listing(f_out);
return -1;
}
@@
-784,15
+796,18
@@
int start_daemon(int f_in, int f_out)
}
if ((i = lp_number(line)) < 0) {
}
if ((i = lp_number(line)) < 0) {
- char *addr = client_addr(f_in);
- char *host = client_name(f_in);
rprintf(FLOG, "unknown module '%s' tried from %s (%s)\n",
line, host, addr);
io_printf(f_out, "@ERROR: Unknown module '%s'\n", line);
return -1;
}
rprintf(FLOG, "unknown module '%s' tried from %s (%s)\n",
line, host, addr);
io_printf(f_out, "@ERROR: Unknown module '%s'\n", line);
return -1;
}
- return rsync_module(f_in, f_out, i);
+#ifdef HAVE_SIGACTION
+ sigact.sa_flags = SA_NOCLDSTOP;
+#endif
+ SIGACTION(SIGCHLD, remember_children);
+
+ return rsync_module(f_in, f_out, i, addr, host);
}
int daemon_main(void)
}
int daemon_main(void)