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
Got rid of the setting of io_write_phase.
[rsync/rsync.git]
/
clientserver.c
diff --git
a/clientserver.c
b/clientserver.c
index
27ace48
..
8a46f69
100644
(file)
--- a/
clientserver.c
+++ b/
clientserver.c
@@
-42,9
+42,9
@@
extern int filesfrom_fd;
extern int remote_protocol;
extern int protocol_version;
extern int io_timeout;
extern int remote_protocol;
extern int protocol_version;
extern int io_timeout;
-extern int orig_umask;
extern int no_detach;
extern int default_af_hint;
extern int no_detach;
extern int default_af_hint;
+extern mode_t orig_umask;
extern char *bind_address;
extern char *sockopts;
extern char *config_file;
extern char *bind_address;
extern char *sockopts;
extern char *config_file;
@@
-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);
}
@@
-722,15
+728,21
@@
static void send_listing(int fd)
int start_daemon(int f_in, int f_out)
{
char line[1024];
int start_daemon(int f_in, int f_out)
{
char line[1024];
- char *motd;
+ char *motd
, *addr, *host
;
int i;
io_set_sock_fds(f_in, f_out);
int i;
io_set_sock_fds(f_in, f_out);
+ /* We must load the config file before calling any function that
+ * might cause log-file output to occur. This ensures that the
+ * "log file" param gets honored for the 2 non-forked use-cases
+ * (when rsync is run by init and run by a remote shell). */
if (!lp_load(config_file, 0))
exit_cleanup(RERR_SYNTAX);
if (!lp_load(config_file, 0))
exit_cleanup(RERR_SYNTAX);
- log_init();
+ addr = client_addr(f_in);
+ host = client_name(f_in);
+ rprintf(FLOG, "connect from %s (%s)\n", host, addr);
if (!am_server) {
set_socket_options(f_in, "SO_KEEPALIVE");
if (!am_server) {
set_socket_options(f_in, "SO_KEEPALIVE");
@@
-773,8
+785,6
@@
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) {
- char *addr = client_addr(f_in);
- char *host = client_name(f_in);
rprintf(FLOG, "module-list request from %s (%s)\n",
host, addr);
send_listing(f_out);
rprintf(FLOG, "module-list request from %s (%s)\n",
host, addr);
send_listing(f_out);
@@
-788,15
+798,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)