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

Contents of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 146 - (show annotations) (download)
Sun Dec 7 20:06:12 2008 UTC (15 years, 5 months ago) by torben
File size: 2411 byte(s)
Added configuration module

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

  ViewVC Help
Powered by ViewVC 1.1.20