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

Diff of /smsdaemon/daemon.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 114 by torben, Sun Nov 2 20:14:20 2008 UTC revision 325 by torben, Wed Sep 16 16:37:34 2009 UTC
# Line 1  Line 1 
1  #include <iostream>  #include <iostream>
2    #include <sstream>
3  #include <signal.h>  #include <signal.h>
4  #include <fcntl.h>  #include <fcntl.h>
5  #include <stdlib.h>  #include <stdlib.h>
6  #include <cstring>  #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"  #include "daemon.h"
16  #include "common.h"  #include "Common.h"
17    #include "Logger.h"
18    
19    
20    
21  using namespace std;  using namespace std;
22    
23    
24  void signal_handler(int sig)  void signal_handler(int sig)
25  {  {
26          switch(sig) {          switch (sig)
27                  case SIGHUP:          {
28                          Common::instance()->logMessage("hangup signal catched");          case SIGHUP:
29                          break;                  Logger::logMessage("Reload config");
30                    Common::instance()->reloadConfig = true;
31                  case SIGTERM:  
32                          Common::instance()->logMessage("terminate signal catched...exiting");                  break;
33                          Common::instance()->mainContinue = false;  
34                          break;          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()  void daemonCleanup()
79  {  {
80          unlink( Common::instance()->pidfile.c_str() );          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()  void daemonize()
90  {        {
91          int i, lfp;          int i, lfp;
92          char str[10];          char str[10];
93          Common* cmn = Common::instance();          Common* cmn = Common::instance();
# Line 44  void daemonize() Line 98  void daemonize()
98                  daemon_shutdown(0);                  daemon_shutdown(0);
99          }          }
100    
101                                            
102          if (getppid() == 1) /* already a daemon */          if (getppid() == 1) /* already a daemon */
103                  return;                  return;
104                                                            
105          i=fork();          i=fork();
106                                                            
107          if (i<0) /* fork error */          if (i<0) /* fork error */
108                  daemon_shutdown(FORK_ERROR);                  daemon_shutdown(FORK_ERROR);
109          if (i>0) /* parent exits */          if (i>0) /* parent exits */
110                  daemon_shutdown(0);                  daemon_shutdown(0);
111          /* child daemon continues */          /* child daemon continues */
112                                                                    
113          setsid(); /* obtain a new process group */          setsid(); /* obtain a new process group */
114                                                                                    
115          for (i=getdtablesize(); i>=0; --i)          for (i=getdtablesize(); i>=0; --i)
116                  close(i); /*close all descriptors*/                  close(i); /*close all descriptors*/
117                                                                                                    
118          i=open("/dev/null", O_RDWR); /* handle std. io */          i=open("/dev/null", O_RDWR); /* handle std. io */
         dup(i);  
119          dup(i);          dup(i);
120                                                                                                                            dup(i);
121    
122          umask(027); /* set newly created file permissions */          umask(027); /* set newly created file permissions */
123                                                                                                                            
124          chdir("/tmp"); /* change running directory*/          chdir("/tmp"); /* change running directory*/
125            
126          /*attempt to create lockfile and put a file-lock on it*/          /*attempt to create lockfile and put a file-lock on it*/
127          lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);          lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);
128          if (lfp<0) /* can not open */          if (lfp<0) /* can not open */
129                  daemon_shutdown(CANT_OPEN_LOCK);                  daemon_shutdown(CANT_OPEN_LOCK);
130          if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */          if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */
131                  daemon_shutdown(ALREADY_LOCKED);                  daemon_shutdown(ALREADY_LOCKED);
132                                            
133          /* first instance continues */          /* first instance continues */
134          sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */          sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
135          write(lfp, str, strlen(str) );          write(lfp, str, strlen(str) );
# Line 84  void daemonize() Line 138  void daemonize()
138          signal(SIGTTOU, SIG_IGN);          signal(SIGTTOU, SIG_IGN);
139          signal(SIGTTIN, SIG_IGN);          signal(SIGTTIN, SIG_IGN);
140          signal(SIGHUP, signal_handler); /* catch hangup signal */          signal(SIGHUP, signal_handler); /* catch hangup signal */
141          signal(SIGTERM, signal_handler); /* catch kill signal */                  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*/          /*this program is now a daemon*/
146          setegid( cmn->gid );          setegid( cmn->gid );

Legend:
Removed from v.114  
changed lines
  Added in v.325

  ViewVC Help
Powered by ViewVC 1.1.20