/[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 146 by torben, Sun Dec 7 20:06:12 2008 UTC
# Line 5  Line 5 
5  #include <stdlib.h>  #include <stdlib.h>
6  #include <cstring>  #include <cstring>
7    
8    #include <sys/types.h>
9    #include <pwd.h>
10    #include <grp.h>
11    
12    
13  #include "daemon.h"  #include "daemon.h"
14  #include "common.h"  #include "common.h"
15    
# Line 12  Line 17 
17    
18  using namespace std;  using namespace std;
19    
20    
21  void signal_handler(int sig)  void signal_handler(int sig)
22  {  {
23          switch(sig) {          switch (sig)
24                  case SIGHUP:          {
25                          Common::instance()->logMessage("hangup signal catched");          case SIGHUP:
26                          break;                  Common::instance()->logMessage("hangup signal catched");
27                    break;
28                  case SIGTERM:  
29                          Common::instance()->logMessage("terminate signal catched...exiting");          case SIGTERM:
30                          Common::instance()->mainContinue = false;                  Common::instance()->logMessage("terminate signal catched...exiting");
31                          break;                  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()  void daemonCleanup()
65  {  {
66          unlink( Common::instance()->pidfile.c_str() );          unlink( Common::instance()->pidfile.c_str() );
67  }  }
68    
69  void daemonize()  void daemonize()
70  {        {
71          int i, lfp;          int i, lfp;
72          char str[10];          char str[10];
73          Common* cmn = Common::instance();          Common* cmn = Common::instance();
# Line 44  void daemonize() Line 78  void daemonize()
78                  daemon_shutdown(0);                  daemon_shutdown(0);
79          }          }
80    
81                                            
82          if (getppid() == 1) /* already a daemon */          if (getppid() == 1) /* already a daemon */
83                  return;                  return;
84                                                            
85          i=fork();          i=fork();
86                                                            
87          if (i<0) /* fork error */          if (i<0) /* fork error */
88                  daemon_shutdown(FORK_ERROR);                  daemon_shutdown(FORK_ERROR);
89          if (i>0) /* parent exits */          if (i>0) /* parent exits */
90                  daemon_shutdown(0);                  daemon_shutdown(0);
91          /* child daemon continues */          /* child daemon continues */
92                                                                    
93          setsid(); /* obtain a new process group */          setsid(); /* obtain a new process group */
94                                                                                    
95          for (i=getdtablesize(); i>=0; --i)          for (i=getdtablesize(); i>=0; --i)
96                  close(i); /*close all descriptors*/                  close(i); /*close all descriptors*/
97                                                                                                    
98          i=open("/dev/null", O_RDWR); /* handle std. io */          i=open("/dev/null", O_RDWR); /* handle std. io */
         dup(i);  
99          dup(i);          dup(i);
100                                                                                                                            dup(i);
101    
102          umask(027); /* set newly created file permissions */          umask(027); /* set newly created file permissions */
103                                                                                                                            
104          chdir("/tmp"); /* change running directory*/          chdir("/tmp"); /* change running directory*/
105            
106          /*attempt to create lockfile and put a file-lock on it*/          /*attempt to create lockfile and put a file-lock on it*/
107          lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);          lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640);
108          if (lfp<0) /* can not open */          if (lfp<0) /* can not open */
109                  daemon_shutdown(CANT_OPEN_LOCK);                  daemon_shutdown(CANT_OPEN_LOCK);
110          if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */          if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */
111                  daemon_shutdown(ALREADY_LOCKED);                  daemon_shutdown(ALREADY_LOCKED);
112                                            
113          /* first instance continues */          /* first instance continues */
114          sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */          sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */
115          write(lfp, str, strlen(str) );          write(lfp, str, strlen(str) );
# Line 84  void daemonize() Line 118  void daemonize()
118          signal(SIGTTOU, SIG_IGN);          signal(SIGTTOU, SIG_IGN);
119          signal(SIGTTIN, SIG_IGN);          signal(SIGTTIN, SIG_IGN);
120          signal(SIGHUP, signal_handler); /* catch hangup signal */          signal(SIGHUP, signal_handler); /* catch hangup signal */
121          signal(SIGTERM, signal_handler); /* catch kill signal */                  signal(SIGTERM, signal_handler); /* catch kill signal */
122    
123          /*this program is now a daemon*/          /*this program is now a daemon*/
124          setegid( cmn->gid );          setegid( cmn->gid );

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

  ViewVC Help
Powered by ViewVC 1.1.20