]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/daemon.c
- Add Version, ConfigDir, and WorkingDir as Python attributes
[bacula/bacula] / bacula / src / lib / daemon.c
index 387a47b1424912ce07d4ede8f3dfcc4c57339ccb..cd0545a61cde4b323ec5d95df5b09654a8662659 100644 (file)
@@ -1,18 +1,20 @@
 /*
  *  daemon.c by Kern Sibbald
  *
+ *   Version $Id$
+ *
  *   this code is inspired by the Prentice Hall book
  *   "Unix Network Programming" by W. Richard Stevens
  *   and later updated from his book "Advanced Programming
  *   in the UNIX Environment"
  *
  * Initialize a daemon process completely detaching us from
- * any terminal processes. 
+ * any terminal processes.
  *
- */ 
+ */
 
 /*
-   Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
 
 
 #include "bacula.h"
+extern int debug_level;
 
-void 
+void
 daemon_start()
 {
-#ifndef HAVE_CYGWIN
+#if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32)
    int i;
-   int cpid;
+   pid_t cpid;
+   mode_t oldmask;
+#ifdef DEVELOPER
+   int low_fd = 2;
+#else
+   int low_fd = -1;
+#endif
    /*
     *  Become a daemon.
     */
 
-   Dmsg0(200, "Enter daemon_start\n");
+   Dmsg0(900, "Enter daemon_start\n");
    if ( (cpid = fork() ) < 0)
       Emsg1(M_ABORT, 0, "Cannot fork to become daemon: %s\n", strerror(errno));
    else if (cpid > 0)
       exit(0);             /* parent exits */
    /* Child continues */
-      
+
    setsid();
 
    /* In the PRODUCTION system, we close ALL
-    * file descriptors. It is useful
-    * for debugging to leave the standard ones open.
+    * file descriptors except stdin, stdout, and stderr.
     */
-   for (i=sysconf(_SC_OPEN_MAX)-1; i >=0; i--) {
-#ifdef DEBUG
-      if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO) {
-        close(i);
-      }
-#else 
+   if (debug_level > 0) {
+      low_fd = 2;                     /* don't close debug output */
+   }
+   for (i=sysconf(_SC_OPEN_MAX)-1; i > low_fd; i--) {
       close(i);
-#endif
    }
 
    /* Move to root directory. For debug we stay
@@ -74,9 +79,32 @@ daemon_start()
    chdir("/");
 #endif
 
-   /* clear any inherited umask */ 
-   umask(0);
+   /*
+    * Avoid creating files 666 but don't override any
+    * more restrictive mask set by the user.
+    */
+   oldmask = umask(026);
+   oldmask |= 026;
+   umask(oldmask);
+
+
+   /*
+    * Make sure we have fd's 0, 1, 2 open
+    *  If we don't do this one of our sockets may open
+    *  there and if we then use stdout, it could
+    *  send total garbage to our socket.
+    *
+    */
+   int fd;
+   fd = open("/dev/null", O_RDONLY, 0644);
+   if (fd > 2) {
+      close(fd);
+   } else {
+      for(i=1; fd + i <= 2; i++) {
+        dup2(fd, fd+i);
+      }
+   }
 
-   Dmsg0(200, "Exit daemon_start\n");
 #endif /* HAVE_CYGWIN */
+   Dmsg0(900, "Exit daemon_start\n");
 }