Packets: Fix VariantParser invalid parser access bug
[senf.git] / Utils / Daemon / Daemon.hh
index 3fb0018..8747182 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer NETwork research (NET)
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 /** \file
     \brief Daemon public header */
 
-#ifndef HH_Daemon_
-#define HH_Daemon_ 1
+#ifndef HH_SENF_Utils_Daemon_Daemon_
+#define HH_SENF_Utils_Daemon_Daemon_ 1
 
 // Custom includes
 #include <boost/utility.hpp>
+#include "../Logger/SenfLog.hh"
 
 //#include "Daemon.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
 
 namespace senf {
 
-    /** \brief Daemon process
+    /** \brief %Daemon process
 
-        senf::Daemon provides simple management for daemon processes. Specifically, the Daemon class
+        %senf::Daemon provides simple management for daemon processes. Specifically, the %Daemon class
         implements
         \li <i>Safe startup.</i> If the startup fails, the foreground process which launches the
             daemon will terminate with an appropriate error exit code.
@@ -103,6 +104,8 @@ namespace senf {
     class Daemon : boost::noncopyable
     {
     public:
+        SENF_LOG_CLASS_AREA();
+
         ///////////////////////////////////////////////////////////////////////////
         // Types
         
@@ -154,16 +157,23 @@ namespace senf {
                                              successful startup. */
 
         int argc();                     ///< Access command line parameter count
-        char const ** argv();           ///< Access command line parameters
+        char ** argv();                 ///< Access command line parameters
+        void removeDaemonArgs();        ///< Remove the daemon arguments from argc()/argv()
+
+        static void exit(unsigned code=0); ///< Terminate daemon with failure
 
-        void exit(unsigned code=0);     ///< Terminate daemon with failure
+        void logReopen();               ///< Reopen the log files
+                                        /**< This is used when rotating the logs. By default,
+                                             SIGHUP calls logReopen. */
 
         ///\}
         
-        int start(int argc, char const ** argv); ///< Called from main() to launch daemon.
+        int start(int argc, char ** argv); ///< Called from main() to launch daemon.
                                         /**< Normally not called directly but from the
                                              \ref SENF_DAEMON_MAIN macro. */
 
+        static Daemon & instance();     ///< Return the Daemon instance
+
     protected:
         Daemon();
 
@@ -195,13 +205,13 @@ namespace senf {
                                              This member is only called, if the default main()
                                              implementation is not overridden. */
     private:
-
         void openLog();
         void fork();
         bool pidfileCreate();
+        void installSighandlers();
 
         int argc_;
-        char const ** argv_;
+        char ** argv_;
 
         bool daemonize_;
         std::string stdoutLog_;
@@ -209,8 +219,11 @@ namespace senf {
         int stdout_;
         int stderr_;
         std::string pidfile_;
+        bool pidfileCreated_;
 
         bool detached_;
+
+        static Daemon * instance_;
     };
 
     /** \brief Provide \c main() function
@@ -221,7 +234,7 @@ namespace senf {
         \ingroup process
      */
 #   define SENF_DAEMON_MAIN(klass)                                                                \
-        int main(int argc, char const ** argv)                                                    \
+        int main(int argc, char ** argv)                                                    \
         {                                                                                         \
             klass instance;                                                                       \
             return instance.start(argc, argv);                                                    \
@@ -230,7 +243,7 @@ namespace senf {
 }
 
 ///////////////////////////////hh.e////////////////////////////////////////
-//#include "Daemon.cci"
+#include "Daemon.cci"
 //#include "Daemon.ct"
 //#include "Daemon.cti"
 #endif