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

Contents of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 86 - (show 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 #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 //signal(SIGCHLD, SIG_IGN); /* ignore child */
81 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