/[pengfork]/pengfork/src/misc.c
ViewVC logotype

Diff of /pengfork/src/misc.c

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

revision 1.9 by chupa, Sun Dec 1 01:19:07 2002 UTC revision 1.10 by chupa, Tue Dec 3 18:38:15 2002 UTC
# Line 26  Line 26 
26  #include <sys/stat.h>  #include <sys/stat.h>
27  #include <stdlib.h>  #include <stdlib.h>
28  #include <stdio.h>  #include <stdio.h>
29    #include <fcntl.h>
30  #include <unistd.h>  #include <unistd.h>
31  #include <sys/socket.h>  #include <sys/socket.h>
32  #include <netinet/in.h>  #include <netinet/in.h>
33  #include <arpa/inet.h>  #include <arpa/inet.h>
34    #include <signal.h>
35  #include <string.h>  #include <string.h>
36  #include <errno.h>  #include <errno.h>
37    
# Line 37  Line 39 
39  #include "log.h"  #include "log.h"
40  #include "misc.h"  #include "misc.h"
41  #include "options.h"  #include "options.h"
42    #include "sighndl.h"
43    
44    
45    void
46    daemon_mode (void)
47    {
48      int pid;
49      int f;
50    
51      pid = fork ();
52      if (pid == 0)
53        {
54          log_daemon();
55          log (LOG_NOTICE, gettext("%s daemon started\n"), PACKAGE_STRING);
56          f = open ("/dev/null", O_RDWR);
57          if (f < 0)
58            log (LOG_WARNING, gettext ("Unable to open /dev/null: %s (%d)\n"),
59                 strerror (errno), errno);
60          else
61            {
62              if (dup2 (f, 0) < 0)
63                log (LOG_WARNING, gettext ("Error calling dup2 stdin: %s (%d)\n"),
64                     strerror (errno), errno);
65              if (dup2 (f, 1) < 0)
66                log (LOG_WARNING,
67                     gettext ("Error calling dup2 stdout: %s (%d)\n"),
68                     strerror (errno), errno);
69              if (dup2 (f, 2) < 0)
70                log (LOG_WARNING,
71                     gettext ("Error calling dup2 stderr: %s (%d)\n"),
72                     strerror (errno), errno);
73              if (close (f) < 0)
74                log (LOG_WARNING,
75                     gettext ("Error calling close /dev/null: %s (%d)\n"),
76                     strerror (errno), errno);
77            }
78          if (setsid () < 0)
79            log (LOG_WARNING, gettext ("Error calling setsid: %s (%d)\n"),
80                 strerror (errno), errno);
81        }
82      else if (pid > 0)
83        {
84          exit (0);
85        }
86      else
87        {
88          log (LOG_ERR, gettext ("Unable to fork: %s (%d)\n"), strerror (errno),
89               errno);
90          exit (1);
91        }
92    }
93    
94    void
95    handle_signals (void)
96    {
97      signal (SIGINT, sig_exit);
98      signal (SIGTERM, sig_exit);
99      if (!PARAM_DAEMON)
100        signal (SIGHUP, sig_exit);
101    }
102    
103    int
104    running_from_pidfile (void)
105    {
106      int fd;
107      pid_t pid;
108      int r;
109      char pid_string[15];
110      
111      fd = open (PARAM_PID_FILE, O_RDONLY, 0644);
112      
113      if (fd != -1)
114        {
115          r = read (fd, pid_string, sizeof(pid_string) - 1);
116          pid_string[r] = '\0';
117          pid = atoi (pid_string);
118          close (fd);
119    
120          if (pid != 0 && kill (pid, 0) == -1)
121            {
122              /* we can create a pidfile now */
123              log (LOG_WARNING, gettext ("Removing stale pid file %s.\n"), PARAM_PID_FILE);
124            remove_pidfile ();
125            return 0;
126            }
127          else
128            {
129            if(pid)
130              {
131                log (LOG_ERR, gettext("%s is already running with pid %d.\n"),
132                     PACKAGE, pid);
133                return 1;               /* we're already running */
134              }
135            else
136              return 0;
137            }
138        }
139    
140      close (fd);
141      return 0;
142    }
143    
144    int
145    write_pidfile (void)
146    {  
147      int fd;
148      char pid_string[15];
149    
150      fd = open (PARAM_PID_FILE, O_RDWR | O_CREAT, 0644);
151      if( fd != -1)
152        {
153          snprintf (pid_string, sizeof(pid_string), "%d\n", getpid ());
154          write (fd, pid_string, strlen (pid_string));
155          close (fd);
156          return 1;
157        }
158      else
159        {
160          log (LOG_WARNING, gettext ("Can't create pid file %s: %s (%d).\n"),
161             PARAM_PID_FILE, strerror(errno), errno);
162          return 0;
163        }
164    }
165    
166    int
167    remove_pidfile (void)
168    {
169      if (unlink (PARAM_PID_FILE))
170        {
171          log (LOG_ERR, gettext("Can't remove %s: %s (%d).\n"),
172             PARAM_PID_FILE, strerror(errno), errno);
173          return 0;         /* cannot remove pidfile */
174        }
175      return 1;
176    }
177    
178  int  int
179  launch_ip_up (if_name, if_addr, dns, domain, mtu)  launch_ip_up (if_name, if_addr, dns, domain, mtu)
# Line 54  launch_ip_up (if_name, if_addr, dns, dom Line 191  launch_ip_up (if_name, if_addr, dns, dom
191    int pid;    int pid;
192    struct stat st;    struct stat st;
193    
194    snprintf (env_name, sizeof (env_name) - 1, "IFNAME=%s", if_name);    snprintf (env_name,   sizeof (env_name),   "IFNAME=%s", if_name);
195    snprintf (env_addr, sizeof (env_addr) - 1, "ADDRESS=%s",    snprintf (env_addr,   sizeof (env_addr),   "ADDRESS=%s",inet_ntoa (if_addr));
196              inet_ntoa (if_addr));    snprintf (env_dns,    sizeof (env_dns),    "DNS=%s",    inet_ntoa (dns));
197    snprintf (env_dns, sizeof (env_dns) - 1, "DNS=%s", inet_ntoa (dns));    snprintf (env_domain, sizeof (env_domain), "DOMAIN=%s", domain);
198    snprintf (env_domain, sizeof (env_domain) - 1, "DOMAIN=%s", domain);    snprintf (env_mtu,    sizeof (env_mtu),    "MTU=%d",    mtu);
   snprintf (env_mtu, sizeof (env_mtu) - 1, "MTU=%d", mtu);  
199    
200    if (PARAM_IP_UP && !stat (PARAM_IP_UP, &st))    if (PARAM_IP_UP && !stat (PARAM_IP_UP, &st))
201      {      {
# Line 101  launch_ip_down (if_name) Line 237  launch_ip_down (if_name)
237    int pid;    int pid;
238    struct stat st;    struct stat st;
239    
240    snprintf (name, sizeof (name) - 1, "IFNAME=%s", if_name);    snprintf (name, sizeof (name), "IFNAME=%s", if_name);
241    
242    if (PARAM_IP_DOWN && !stat (PARAM_IP_DOWN, &st))    if (PARAM_IP_DOWN && !stat (PARAM_IP_DOWN, &st))
243      {      {

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26