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

Contents of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

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

  ViewVC Help
Powered by ViewVC 1.1.20