- Set config_file to a default filename if it is NULL.

- Changed create_pid_file() to fail if the pidfile already exists,
  which makes the daemon exit with an error.
- Output errors about a failure to open the config file or the lock
  file to (a still open) stderr.
- We now notice (and complain) if fork() fails.
This commit is contained in:
Wayne Davison committed 2007-10-01 02:25:54 +00:00
1 parent f92e15efd5
commit dd589118d0
1 file changed
+18 -4
+18 -4
View File
@@ -839,18 +839,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 +868,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 +897,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 +924,7 @@ int daemon_main(void)
}
if (no_detach)
create_pid_file(getpid());
create_pid_file();
else
become_daemon();