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

Annotation of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 153 - (hide annotations) (download)
Mon Dec 8 13:14:55 2008 UTC (15 years, 5 months ago) by torben
File size: 2770 byte(s)
Add default signal handler

1 torben 26 #include <iostream>
2 torben 153 #include <sstream>
3 torben 26 #include <signal.h>
4     #include <fcntl.h>
5 torben 114 #include <stdlib.h>
6     #include <cstring>
7 torben 26
8 torben 146 #include <sys/types.h>
9     #include <pwd.h>
10     #include <grp.h>
11    
12    
13 torben 152 #include "ConfigFile.h"
14 torben 26 #include "daemon.h"
15     #include "common.h"
16    
17    
18    
19     using namespace std;
20    
21 torben 146
22 torben 26 void signal_handler(int sig)
23     {
24 torben 146 switch (sig)
25     {
26     case SIGHUP:
27     Common::instance()->logMessage("hangup signal catched");
28     break;
29 torben 26
30 torben 146 case SIGTERM:
31     Common::instance()->logMessage("terminate signal catched...exiting");
32     Common::instance()->mainContinue = false;
33     break;
34 torben 153 default:
35     std::stringstream ss;
36     ss << "Received unknown signal: " << sig;
37     Common::instance()->logMessage(ss.str());
38     break;
39 torben 26 }
40     }
41    
42 torben 146 void lookup_uid_values()
43     {
44     Common* cmn = Common::instance();
45    
46 torben 152 std::string userstr = cmn->GetConfigfile()->GetValue("smsdaemon","user");
47     std::string groupstr = cmn->GetConfigfile()->GetValue("smsdaemon","group");
48    
49     passwd* pass = getpwnam(userstr.c_str());
50 torben 146 if (pass != 0)
51     {
52     cmn->uid = pass->pw_uid;
53     }
54     else
55     {
56 torben 152 cmn->logMessage( string("could not lookup userid: ") + userstr );
57 torben 146 exit(1);
58     }
59    
60 torben 152 group* grp = getgrnam(groupstr.c_str() );
61 torben 146 if (grp != 0)
62     {
63     cmn->gid = grp->gr_gid;
64     }
65     else
66     {
67 torben 152 cmn->logMessage( string("could not lookup groupid: ") + groupstr );
68 torben 146 exit(1);
69     }
70     }
71    
72    
73 torben 26 void daemonCleanup()
74     {
75     unlink( Common::instance()->pidfile.c_str() );
76     }
77    
78     void daemonize()
79 torben 146 {
80 torben 26 int i, lfp;
81     char str[10];
82     Common* cmn = Common::instance();
83    
84     if (getuid() != 0)
85     {
86     cout << "Please start this daemon as root\n" << endl;
87     daemon_shutdown(0);
88     }
89    
90 torben 146
91 torben 26 if (getppid() == 1) /* already a daemon */
92     return;
93 torben 146
94 torben 26 i=fork();
95 torben 146
96 torben 26 if (i<0) /* fork error */
97     daemon_shutdown(FORK_ERROR);
98     if (i>0) /* parent exits */
99     daemon_shutdown(0);
100     /* child daemon continues */
101 torben 146
102 torben 26 setsid(); /* obtain a new process group */
103 torben 146
104 torben 26 for (i=getdtablesize(); i>=0; --i)
105     close(i); /*close all descriptors*/
106 torben 146
107 torben 26 i=open("/dev/null", O_RDWR); /* handle std. io */
108     dup(i);
109 torben 146 dup(i);
110    
111 torben 26 umask(027); /* set newly created file permissions */
112 torben 146
113 torben 26 chdir("/tmp"); /* change running directory*/
114 torben 146
115 torben 26 /*attempt to create lockfile and put a file-lock on it*/
116     lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);
117     if (lfp<0) /* can not open */
118     daemon_shutdown(CANT_OPEN_LOCK);
119     if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */
120     daemon_shutdown(ALREADY_LOCKED);
121 torben 146
122 torben 26 /* first instance continues */
123     sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
124     write(lfp, str, strlen(str) );
125 torben 86 //signal(SIGCHLD, SIG_IGN); /* ignore child */
126 torben 26 signal(SIGTSTP, SIG_IGN); /* ignore tty signals */
127     signal(SIGTTOU, SIG_IGN);
128     signal(SIGTTIN, SIG_IGN);
129     signal(SIGHUP, signal_handler); /* catch hangup signal */
130 torben 146 signal(SIGTERM, signal_handler); /* catch kill signal */
131 torben 26
132     /*this program is now a daemon*/
133     setegid( cmn->gid );
134     seteuid( cmn->uid );
135     }

  ViewVC Help
Powered by ViewVC 1.1.20