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

Contents of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 158 - (show annotations) (download)
Mon Dec 8 21:49:49 2008 UTC (15 years, 5 months ago) by torben
File size: 2864 byte(s)
rename:
	util.* -> Util.*
	common.* -> Common.*

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 unlink( Common::instance()->pidfile.c_str() );
78 }
79
80 void daemonize()
81 {
82 int i, lfp;
83 char str[10];
84 Common* cmn = Common::instance();
85
86 if (getuid() != 0)
87 {
88 cout << "Please start this daemon as root\n" << endl;
89 daemon_shutdown(0);
90 }
91
92
93 if (getppid() == 1) /* already a daemon */
94 return;
95
96 i=fork();
97
98 if (i<0) /* fork error */
99 daemon_shutdown(FORK_ERROR);
100 if (i>0) /* parent exits */
101 daemon_shutdown(0);
102 /* child daemon continues */
103
104 setsid(); /* obtain a new process group */
105
106 for (i=getdtablesize(); i>=0; --i)
107 close(i); /*close all descriptors*/
108
109 i=open("/dev/null", O_RDWR); /* handle std. io */
110 dup(i);
111 dup(i);
112
113 umask(027); /* set newly created file permissions */
114
115 chdir("/tmp"); /* change running directory*/
116
117 /*attempt to create lockfile and put a file-lock on it*/
118 lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);
119 if (lfp<0) /* can not open */
120 daemon_shutdown(CANT_OPEN_LOCK);
121 if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */
122 daemon_shutdown(ALREADY_LOCKED);
123
124 /* first instance continues */
125 sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
126 write(lfp, str, strlen(str) );
127 //signal(SIGCHLD, SIG_IGN); /* ignore child */
128 signal(SIGTSTP, SIG_IGN); /* ignore tty signals */
129 signal(SIGTTOU, SIG_IGN);
130 signal(SIGTTIN, SIG_IGN);
131 signal(SIGHUP, signal_handler); /* catch hangup signal */
132 signal(SIGTERM, signal_handler); /* catch kill signal */
133 signal(SIGINT, signal_handler); /* keyboard interrupt */
134 signal(SIGQUIT, signal_handler); /* QUIT */
135
136 /*this program is now a daemon*/
137 setegid( cmn->gid );
138 seteuid( cmn->uid );
139 }

  ViewVC Help
Powered by ViewVC 1.1.20