]> gitweb.michael.orlitzky.com - dead/htsn.git/blobdiff - src/Unix.hs
Retain umask after daemonizing.
[dead/htsn.git] / src / Unix.hs
index a4389bee0e844ea7cd7024d608e3e126033bc926..9b0ddaac9d3bbc10dc532b87c233378be2dd19cb 100644 (file)
@@ -19,6 +19,7 @@ import System.Posix (
   getUserEntryForName,
   installHandler,
   removeLink,
+  setFileCreationMask,
   setGroupID,
   setUserID,
   sigTERM )
@@ -62,14 +63,23 @@ graceful_shutdown cfg main_thread_id = do
 --   finally do the daemonization dance.
 --
 full_daemonize :: Configuration -> IO () -> IO ()
-full_daemonize cfg program =
+full_daemonize cfg program = do
+  -- The call to 'daemonize' will set the umask to zero, but we want
+  -- to retain it. So, we set the umask to zero before 'daemonize'
+  -- can, so that we can record the previous umask value (returned by
+  -- setFileCreationMask).
+  orig_umask <- setFileCreationMask 0
   -- This is the 'daemonize' from System.Posix.Daemonize.
-  daemonize program'
+  daemonize (program' orig_umask)
   where
     -- We need to do all this stuff *after* we daemonize.
-    program' = do
+    program' orig_umask = do
       -- First write the PID file which probably requires root.
       pid <- getProcessID
+
+      -- The PID file needs to be read-only for anyone but its
+      -- owner. Hopefully the umask accomplishes this!
+      _ <- setFileCreationMask orig_umask
       writeFile (pidfile cfg) (show pid)
 
       -- We need to pass the thread ID to the signal handler so it