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

Contents of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 190 - (show annotations) (download)
Wed Dec 17 13:51:57 2008 UTC (15 years, 5 months ago) by torben
File size: 2956 byte(s)
more verbose daemon shutdown procedure

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

  ViewVC Help
Powered by ViewVC 1.1.20