X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a1d2685b08312addc2c6bf772c6f4dd801629a4a..44a7ba4587a645c7f4a8f4ed4f7de9b83605a49e:/clientserver.c diff --git a/clientserver.c b/clientserver.c index 4c636664..20a164e6 100644 --- a/clientserver.c +++ b/clientserver.c @@ -215,9 +215,6 @@ int start_inband_exchange(int f_in, int f_out, const char *user, int argc, char if (exchange_protocols(f_in, f_out, line, sizeof line, 1) < 0) return -1; - if (list_only && protocol_version >= 29) - list_only |= 2; - /* set daemon_over_rsh to false since we need to build the * true set of args passed through the rsh/ssh connection; * this is a no-op for direct-socket-connection mode */ @@ -839,18 +836,20 @@ int start_daemon(int f_in, int f_out) return rsync_module(f_in, f_out, i, addr, host); } -static void create_pid_file(pid_t pid) +static void create_pid_file(void) { char *pid_file = lp_pid_file(); char pidbuf[16]; + pid_t pid = getpid(); int fd; if (!pid_file || !*pid_file) return; cleanup_set_pid(pid); - if ((fd = do_open(pid_file, O_WRONLY|O_CREAT|O_TRUNC, 0666 & ~orig_umask)) == -1) { + if ((fd = do_open(pid_file, O_WRONLY|O_CREAT|O_EXCL, 0666 & ~orig_umask)) == -1) { cleanup_set_pid(0); + fprintf(stderr, "failed to create pid file %s: %s\n", pid_file, strerror(errno)); rsyserr(FLOG, errno, "failed to create pid file %s", pid_file); exit_cleanup(RERR_FILEIO); } @@ -866,10 +865,15 @@ static void become_daemon(void) pid_t pid = fork(); if (pid) { - create_pid_file(pid); + if (pid < 0) { + fprintf(stderr, "failed to fork: %s\n", strerror(errno)); + exit_cleanup(RERR_FILEIO); + } _exit(0); } + create_pid_file(); + /* detach from the terminal */ #ifdef HAVE_SETSID setsid(); @@ -890,6 +894,13 @@ static void become_daemon(void) int daemon_main(void) { + if (!config_file) { + if (am_server && am_root <= 0) + config_file = RSYNCD_USERCONF; + else + config_file = RSYNCD_SYSCONF; + } + if (is_a_socket(STDIN_FILENO)) { int i; @@ -910,7 +921,7 @@ int daemon_main(void) } if (no_detach) - create_pid_file(getpid()); + create_pid_file(); else become_daemon();