- Set config_file to a default filename if it is NULL.
authorWayne Davison <wayned@samba.org>
Mon, 1 Oct 2007 02:25:54 +0000 (02:25 +0000)
committerWayne Davison <wayned@samba.org>
Mon, 1 Oct 2007 02:25:54 +0000 (02:25 +0000)
- 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.

clientserver.c

index 4c6366641d548cedf05a54617101e3cfffe4d276..700a126db857553e6e5758ef83e130e5dfd7080c 100644 (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();