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

Annotation of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 325 - (hide annotations) (download)
Wed Sep 16 16:37:34 2009 UTC (14 years, 8 months ago) by torben
File size: 3015 byte(s)
Compile with latest g++

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

  ViewVC Help
Powered by ViewVC 1.1.20