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

Diff of /smsdaemon/daemon.cpp

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

revision 86 by torben, Mon Jun 16 07:39:56 2008 UTC revision 196 by torben, Thu Dec 18 06:53:29 2008 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>
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"  #include "daemon.h"
15  #include "common.h"  #include "Common.h"
16    #include "Logger.h"
17    
18    
19    
20  using namespace std;  using namespace std;
21    
22    
23  void signal_handler(int sig)  void signal_handler(int sig)
24  {  {
25          switch(sig) {          switch (sig)
26                  case SIGHUP:          {
27                          Common::instance()->logMessage("hangup signal catched");          case SIGHUP:
28                          break;                  Logger::logMessage("hangup signal catched");
29                    break;
30                  case SIGTERM:  
31                          Common::instance()->logMessage("terminate signal catched...exiting");          case SIGTERM:
32                          Common::instance()->mainContinue = false;                  Logger::logMessage("terminate signal catched...exiting");
33                          break;                  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()  void daemonCleanup()
76  {  {
77          unlink( Common::instance()->pidfile.c_str() );          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()  void daemonize()
87  {        {
88          int i, lfp;          int i, lfp;
89          char str[10];          char str[10];
90          Common* cmn = Common::instance();          Common* cmn = Common::instance();
# Line 42  void daemonize() Line 95  void daemonize()
95                  daemon_shutdown(0);                  daemon_shutdown(0);
96          }          }
97    
98                                            
99          if (getppid() == 1) /* already a daemon */          if (getppid() == 1) /* already a daemon */
100                  return;                  return;
101                                                            
102          i=fork();          i=fork();
103                                                            
104          if (i<0) /* fork error */          if (i<0) /* fork error */
105                  daemon_shutdown(FORK_ERROR);                  daemon_shutdown(FORK_ERROR);
106          if (i>0) /* parent exits */          if (i>0) /* parent exits */
107                  daemon_shutdown(0);                  daemon_shutdown(0);
108          /* child daemon continues */          /* child daemon continues */
109                                                                    
110          setsid(); /* obtain a new process group */          setsid(); /* obtain a new process group */
111                                                                                    
112          for (i=getdtablesize(); i>=0; --i)          for (i=getdtablesize(); i>=0; --i)
113                  close(i); /*close all descriptors*/                  close(i); /*close all descriptors*/
114                                                                                                    
115          i=open("/dev/null", O_RDWR); /* handle std. io */          i=open("/dev/null", O_RDWR); /* handle std. io */
         dup(i);  
116          dup(i);          dup(i);
117                                                                                                                            dup(i);
118    
119          umask(027); /* set newly created file permissions */          umask(027); /* set newly created file permissions */
120                                                                                                                            
121          chdir("/tmp"); /* change running directory*/          chdir("/tmp"); /* change running directory*/
122            
123          /*attempt to create lockfile and put a file-lock on it*/          /*attempt to create lockfile and put a file-lock on it*/
124          lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);          lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);
125          if (lfp<0) /* can not open */          if (lfp<0) /* can not open */
126                  daemon_shutdown(CANT_OPEN_LOCK);                  daemon_shutdown(CANT_OPEN_LOCK);
127          if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */          if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */
128                  daemon_shutdown(ALREADY_LOCKED);                  daemon_shutdown(ALREADY_LOCKED);
129                                            
130          /* first instance continues */          /* first instance continues */
131          sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */          sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
132          write(lfp, str, strlen(str) );          write(lfp, str, strlen(str) );
# Line 82  void daemonize() Line 135  void daemonize()
135          signal(SIGTTOU, SIG_IGN);          signal(SIGTTOU, SIG_IGN);
136          signal(SIGTTIN, SIG_IGN);          signal(SIGTTIN, SIG_IGN);
137          signal(SIGHUP, signal_handler); /* catch hangup signal */          signal(SIGHUP, signal_handler); /* catch hangup signal */
138          signal(SIGTERM, signal_handler); /* catch kill signal */                  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*/          /*this program is now a daemon*/
143          setegid( cmn->gid );          setegid( cmn->gid );

Legend:
Removed from v.86  
changed lines
  Added in v.196

  ViewVC Help
Powered by ViewVC 1.1.20