Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Tools::Daemon Class Reference

#include <Daemon.h>

Inheritance diagram for Tools::Daemon:

Inheritance graph
[legend]
Collaboration diagram for Tools::Daemon:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 Daemon (void)
virtual Stringname (void) abstract
 Answer application name.
virtual StringprocessIdPath (void)
virtual void processIdPath (String *path)
virtual void redirectStreamsToNull (void)
virtual void changeRootDirectory (void)
virtual void runUnderUser (int id)
virtual void runUnderUserNamed (String *name)
virtual void hookupSignal (int signo)
virtual void hookupTerminateSignal (void)
virtual void hookupInterruptSignal (void)
virtual void signalHandler (int signo) abstract
 Here you can define how the signals should be handled.
virtual void run (void)

Protected Member Functions

virtual FilenameprocessIdFilename (void)
virtual int loadProcessId (void)
virtual void saveProcessId (void)

Protected Attributes

bool close_std_streams
bool change_current_directory
Stringpid_path

Static Private Member Functions

static void globalSignalHandler (int signo)

Constructor & Destructor Documentation

Daemon::Daemon void   ) 
 

Definition at line 41 of file Daemon.cc.

References change_current_directory, close_std_streams, and pid_path.

00042 {
00043     close_std_streams = false;
00044     change_current_directory = false;
00045     pid_path = new String("/var/run");
00046 }


Member Function Documentation

void Daemon::changeRootDirectory void   )  [virtual]
 

Definition at line 64 of file Daemon.cc.

References change_current_directory.

00065 {
00066     change_current_directory = true;
00067 }

void Daemon::globalSignalHandler int  signo  )  [static, private]
 

Definition at line 148 of file Daemon.cc.

References Tools::Application::current().

Referenced by hookupSignal().

00149 {
00150     dynamic_cast<Daemon *>(Application::current())->signalHandler(signo);
00151 }

void Daemon::hookupInterruptSignal void   )  [virtual]
 

Definition at line 87 of file Daemon.cc.

References hookupSignal().

00088 {
00089     hookupSignal(SIGINT);
00090 }

void Daemon::hookupSignal int  signo  )  [virtual]
 

Definition at line 82 of file Daemon.cc.

References globalSignalHandler().

Referenced by hookupInterruptSignal(), and hookupTerminateSignal().

00083 {
00084     signal(signo, globalSignalHandler);
00085 }

void Daemon::hookupTerminateSignal void   )  [virtual]
 

Definition at line 92 of file Daemon.cc.

References hookupSignal().

00093 {
00094     hookupSignal(SIGTERM);
00095 }

int Daemon::loadProcessId void   )  [protected, virtual]
 

Definition at line 122 of file Daemon.cc.

References Core::Stream::close(), Core::Stream::nextLine(), and processIdFilename().

Referenced by run().

00123 {
00124     Stream *pidfile;
00125     int pid;
00126 
00127     try {
00128         pidfile = processIdFilename()->withEncoding("default")->readStream();
00129         pid = dynamic_cast<String *>(pidfile->nextLine())->asNumber()->asLong();
00130         pidfile->close();
00131         return(pid);
00132     }
00133     catch (FileOpenFailed *ex) {
00134         return 0;
00135     }
00136 }

virtual String* Tools::Daemon::name void   )  [virtual]
 

Answer application name.

This is used as a part of pid file name.

Referenced by processIdFilename().

Filename * Daemon::processIdFilename void   )  [protected, virtual]
 

Definition at line 117 of file Daemon.cc.

References name(), and pid_path.

Referenced by loadProcessId(), run(), and saveProcessId().

00118 {
00119     return (new Filename(pid_path))->construct(name()->concatenateWith(".pid"));
00120 }

void Daemon::processIdPath String path  )  [virtual]
 

Definition at line 54 of file Daemon.cc.

References pid_path.

00055 {
00056     pid_path = path;
00057 }

String * Daemon::processIdPath void   )  [virtual]
 

Definition at line 49 of file Daemon.cc.

References pid_path.

00050 {
00051     return pid_path;
00052 }

void Daemon::redirectStreamsToNull void   )  [virtual]
 

Definition at line 59 of file Daemon.cc.

References close_std_streams.

00060 {
00061     close_std_streams = true;
00062 }

void Daemon::run void   )  [virtual]
 

Reimplemented from Tools::Application.

Definition at line 98 of file Daemon.cc.

References Tools::Application::cerr, change_current_directory, close_std_streams, loadProcessId(), Core::Stream::nextPutAll(), processIdFilename(), Tools::Application::run(), and saveProcessId().

00099 {
00100     /* Is server already running */
00101     if (loadProcessId()) {
00102         cerr->nextPutAll("One server is already running.\n");
00103         return;
00104     }
00105     if (daemon(change_current_directory ? 0 : 1,
00106                close_std_streams ? 0 : 1) < 0) {
00107         cerr->nextPutAll("Cannot start daemon process.\n");
00108         return;
00109     }
00110     saveProcessId();
00111     Application::run();
00112     /* Delete PID file */
00113     processIdFilename()->erase();
00114 }

void Daemon::runUnderUser int  id  )  [virtual]
 

Definition at line 69 of file Daemon.cc.

Referenced by runUnderUserNamed().

00070 {
00071     if (uid > 0) setuid(uid);
00072 }

void Daemon::runUnderUserNamed String name  )  [virtual]
 

Definition at line 74 of file Daemon.cc.

References Core::String::asCString(), and runUnderUser().

00075 {
00076     struct passwd *pass;
00077     pass = getpwnam(name->asCString());
00078     runUnderUser(pass->pw_uid);
00079 }

void Daemon::saveProcessId void   )  [protected, virtual]
 

Definition at line 138 of file Daemon.cc.

References Core::Stream::close(), Core::Stream::lf(), Core::Stream::print(), and processIdFilename().

Referenced by run().

00139 {
00140     Stream *pidfile;
00141 
00142     pidfile = processIdFilename()->withEncoding("default")->writeStream();
00143     pidfile->print((long int) getpid());
00144     pidfile->lf();
00145     pidfile->close();
00146 }

virtual void Tools::Daemon::signalHandler int  signo  )  [virtual]
 

Here you can define how the signals should be handled.


Member Data Documentation

bool Tools::Daemon::change_current_directory [protected]
 

Definition at line 39 of file Daemon.h.

Referenced by changeRootDirectory(), Daemon(), and run().

bool Tools::Daemon::close_std_streams [protected]
 

Definition at line 38 of file Daemon.h.

Referenced by Daemon(), redirectStreamsToNull(), and run().

String* Tools::Daemon::pid_path [protected]
 

Definition at line 40 of file Daemon.h.

Referenced by Daemon(), processIdFilename(), and processIdPath().


The documentation for this class was generated from the following files:
Generated on Mon Nov 27 09:52:35 2006 for Smalltalk like C++ Class Library by  doxygen 1.4.2