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

Annotation of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 146 - (hide 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 torben 26 #include <iostream>
2    
3     #include <signal.h>
4     #include <fcntl.h>
5 torben 114 #include <stdlib.h>
6     #include <cstring>
7 torben 26
8 torben 146 #include <sys/types.h>
9     #include <pwd.h>
10     #include <grp.h>
11    
12    
13 torben 26 #include "daemon.h"
14     #include "common.h"
15    
16    
17    
18     using namespace std;
19    
20 torben 146
21 torben 26 void signal_handler(int sig)
22     {
23 torben 146 switch (sig)
24     {
25     case SIGHUP:
26     Common::instance()->logMessage("hangup signal catched");
27     break;
28 torben 26
29 torben 146 case SIGTERM:
30     Common::instance()->logMessage("terminate signal catched...exiting");
31     Common::instance()->mainContinue = false;
32     break;
33 torben 26 }
34     }
35    
36 torben 146 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 torben 26 void daemonCleanup()
65     {
66     unlink( Common::instance()->pidfile.c_str() );
67     }
68    
69     void daemonize()
70 torben 146 {
71 torben 26 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 torben 146
82 torben 26 if (getppid() == 1) /* already a daemon */
83     return;
84 torben 146
85 torben 26 i=fork();
86 torben 146
87 torben 26 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 torben 146
93 torben 26 setsid(); /* obtain a new process group */
94 torben 146
95 torben 26 for (i=getdtablesize(); i>=0; --i)
96     close(i); /*close all descriptors*/
97 torben 146
98 torben 26 i=open("/dev/null", O_RDWR); /* handle std. io */
99     dup(i);
100 torben 146 dup(i);
101    
102 torben 26 umask(027); /* set newly created file permissions */
103 torben 146
104 torben 26 chdir("/tmp"); /* change running directory*/
105 torben 146
106 torben 26 /*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 torben 146
113 torben 26 /* first instance continues */
114     sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
115     write(lfp, str, strlen(str) );
116 torben 86 //signal(SIGCHLD, SIG_IGN); /* ignore child */
117 torben 26 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 torben 146 signal(SIGTERM, signal_handler); /* catch kill signal */
122 torben 26
123     /*this program is now a daemon*/
124     setegid( cmn->gid );
125     seteuid( cmn->uid );
126     }

  ViewVC Help
Powered by ViewVC 1.1.20