/[projects]/smsdaemon/daemon.cpp
ViewVC logotype

Annotation of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 86 - (hide annotations) (download)
Mon Jun 16 07:39:56 2008 UTC (15 years, 11 months ago) by torben
File size: 2005 byte(s)
daemon.cpp: do not ignore child signals

util.(h|cpp): make a safe replacement for system(3) call
ShellExecPlugin.cpp: use this safer replacement


1 torben 26 #include <iostream>
2    
3     #include <signal.h>
4     #include <fcntl.h>
5    
6     #include "daemon.h"
7     #include "common.h"
8    
9    
10    
11     using namespace std;
12    
13    
14     void signal_handler(int sig)
15     {
16     switch(sig) {
17     case SIGHUP:
18     Common::instance()->logMessage("hangup signal catched");
19     break;
20    
21     case SIGTERM:
22     Common::instance()->logMessage("terminate signal catched...exiting");
23     Common::instance()->mainContinue = false;
24     break;
25     }
26     }
27    
28     void daemonCleanup()
29     {
30     unlink( Common::instance()->pidfile.c_str() );
31     }
32    
33     void daemonize()
34     {
35     int i, lfp;
36     char str[10];
37     Common* cmn = Common::instance();
38    
39     if (getuid() != 0)
40     {
41     cout << "Please start this daemon as root\n" << endl;
42     daemon_shutdown(0);
43     }
44    
45    
46     if (getppid() == 1) /* already a daemon */
47     return;
48    
49     i=fork();
50    
51     if (i<0) /* fork error */
52     daemon_shutdown(FORK_ERROR);
53     if (i>0) /* parent exits */
54     daemon_shutdown(0);
55     /* child daemon continues */
56    
57     setsid(); /* obtain a new process group */
58    
59     for (i=getdtablesize(); i>=0; --i)
60     close(i); /*close all descriptors*/
61    
62     i=open("/dev/null", O_RDWR); /* handle std. io */
63     dup(i);
64     dup(i);
65    
66     umask(027); /* set newly created file permissions */
67    
68     chdir("/tmp"); /* change running directory*/
69    
70     /*attempt to create lockfile and put a file-lock on it*/
71     lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);
72     if (lfp<0) /* can not open */
73     daemon_shutdown(CANT_OPEN_LOCK);
74     if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */
75     daemon_shutdown(ALREADY_LOCKED);
76    
77     /* first instance continues */
78     sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
79     write(lfp, str, strlen(str) );
80 torben 86 //signal(SIGCHLD, SIG_IGN); /* ignore child */
81 torben 26 signal(SIGTSTP, SIG_IGN); /* ignore tty signals */
82     signal(SIGTTOU, SIG_IGN);
83     signal(SIGTTIN, SIG_IGN);
84     signal(SIGHUP, signal_handler); /* catch hangup signal */
85     signal(SIGTERM, signal_handler); /* catch kill signal */
86    
87     /*this program is now a daemon*/
88     setegid( cmn->gid );
89     seteuid( cmn->uid );
90     }

  ViewVC Help
Powered by ViewVC 1.1.20