~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/daemon.c

  • Committer: Stewart Smith
  • Date: 2011-02-02 02:48:47 UTC
  • mto: (2155.1.1 build)
  • mto: This revision was merged to the branch mainline in revision 2156.
  • Revision ID: stewart@flamingspork.com-20110202024847-v7runbytes0krsdm
wait until after the server has started up properly and about ready to receive connections before returning control if --daemon. Also make errors/logs on stderr still appear.

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
#include <fcntl.h>
38
38
#include <stdio.h>
39
39
#include <stdlib.h>
 
40
#include <sys/types.h>
 
41
#include <sys/wait.h>
 
42
#include <signal.h>
40
43
#include <unistd.h>
41
 
 
42
 
int daemonize(int nochdir, int noclose);
43
 
 
44
 
int daemonize(int nochdir, int noclose)
 
44
#include <sys/select.h>
 
45
 
 
46
int daemonize(int nochdir, int noclose, int wait_sigusr1);
 
47
int daemon_is_ready(void);
 
48
void sigusr1_handler(int sig);
 
49
 
 
50
pid_t parent_pid;
 
51
 
 
52
void sigusr1_handler(int sig)
 
53
{
 
54
  if (sig == SIGUSR1)
 
55
    _exit(EXIT_SUCCESS);
 
56
}
 
57
 
 
58
int daemon_is_ready()
 
59
{
 
60
  kill(parent_pid, SIGUSR1);
 
61
  return 0;
 
62
}
 
63
 
 
64
int daemonize(int nochdir, int noclose, int wait_sigusr1)
45
65
{
46
66
    int fd;
47
 
 
48
 
    switch (fork()) {
 
67
    pid_t child= -1;
 
68
 
 
69
    parent_pid= getpid();
 
70
    signal(SIGUSR1, sigusr1_handler);
 
71
 
 
72
    child= fork();
 
73
 
 
74
    switch (child)
 
75
    {
49
76
    case -1:
50
77
        return (-1);
51
78
    case 0:
52
79
        break;
53
80
    default:
 
81
      if (wait_sigusr1)
 
82
      {
 
83
        /* parent */
 
84
        int exit_code= -1;
 
85
        int status;
 
86
        while (waitpid(child, &status, 0) != child);
 
87
        if (WIFEXITED(status))
 
88
        {
 
89
          exit_code= WEXITSTATUS(status);
 
90
        }
 
91
        if (WIFSIGNALED(status))
 
92
        {
 
93
          exit_code= -1;
 
94
        }
 
95
        _exit(exit_code);
 
96
      }
 
97
      else
 
98
      {
54
99
        _exit(EXIT_SUCCESS);
 
100
      }
55
101
    }
56
102
 
 
103
    /* child */
57
104
    if (setsid() == -1)
58
105
        return (-1);
59
106