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

Contents of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 214 - (show annotations) (download)
Mon Dec 22 22:22:42 2008 UTC (15 years, 4 months ago) by torben
File size: 2997 byte(s)
Make smsdaemon less 'crashable' if a config value is not defined in the config file

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

  ViewVC Help
Powered by ViewVC 1.1.20