~drizzle-trunk/drizzle/development

2131.10.1 by Stewart Smith
add a very simple --daemon or -d option to drizzled using the exact same code as memcached to start as a daemon.
1
/*    $Header: /cvsroot/wikipedia/willow/src/bin/willow/daemon.c,v 1.1 2005/05/02 19:15:21 kateturner Exp $    */
2
/*    $NetBSD: daemon.c,v 1.9 2003/08/07 16:42:46 agc Exp $    */
3
/*-
4
 * Copyright (c) 1990, 1993
5
 *    The Regents of the University of California.  All rights reserved.
2131.10.3 by Stewart Smith
update daemon.c copyright
6
 * Copyright (c) 2010
7
 *    Stewart Smith
2131.10.1 by Stewart Smith
add a very simple --daemon or -d option to drizzled using the exact same code as memcached to start as a daemon.
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 * 1. Redistributions of source code must retain the above copyright
13
 *    notice, this list of conditions and the following disclaimer.
14
 * 2. Redistributions in binary form must reproduce the above copyright
15
 *    notice, this list of conditions and the following disclaimer in the
16
 *    documentation and/or other materials provided with the distribution.
17
 * 3. Neither the name of the University nor the names of its contributors
18
 *    may be used to endorse or promote products derived from this software
19
 *    without specific prior written permission.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
 * SUCH DAMAGE.
32
 */
33
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
34
#include <config.h>
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
35
2131.10.1 by Stewart Smith
add a very simple --daemon or -d option to drizzled using the exact same code as memcached to start as a daemon.
36
#if defined __SUNPRO_C || defined __DECC || defined __HP_cc
37
# pragma ident "@(#)$Header: /cvsroot/wikipedia/willow/src/bin/willow/daemon.c,v 1.1 2005/05/02 19:15:21 kateturner Exp $"
38
# pragma ident "$NetBSD: daemon.c,v 1.9 2003/08/07 16:42:46 agc Exp $"
39
#endif
40
41
#include <fcntl.h>
42
#include <stdio.h>
43
#include <stdlib.h>
2131.10.2 by Stewart Smith
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.
44
#include <sys/types.h>
45
#include <sys/wait.h>
46
#include <signal.h>
2131.10.1 by Stewart Smith
add a very simple --daemon or -d option to drizzled using the exact same code as memcached to start as a daemon.
47
#include <unistd.h>
2131.10.2 by Stewart Smith
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.
48
#include <sys/select.h>
49
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
50
#include <drizzled/daemon.h>
51
52
namespace drizzled
53
{
54
2131.10.2 by Stewart Smith
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.
55
pid_t parent_pid;
56
2168.1.7 by Monty Taylor
Fixed a solaris warning. Wow. 3 for 3.
57
extern "C"
58
{
59
2167.2.3 by Monty Taylor
Fix daemonize c++ patch.
60
static void sigusr1_handler(int sig)
2131.10.2 by Stewart Smith
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.
61
{
62
  if (sig == SIGUSR1)
63
    _exit(EXIT_SUCCESS);
64
}
65
2168.1.7 by Monty Taylor
Fixed a solaris warning. Wow. 3 for 3.
66
}
67
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
68
void daemon_is_ready()
2131.10.2 by Stewart Smith
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.
69
{
2363.1.7 by Brian Aker
This shifts the closing of the socket to after we know that no errors are going to occur.
70
  int fd;
2131.10.2 by Stewart Smith
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.
71
  kill(parent_pid, SIGUSR1);
2363.1.7 by Brian Aker
This shifts the closing of the socket to after we know that no errors are going to occur.
72
73
  if ((fd = open("/dev/null", O_RDWR, 0)) != -1) 
74
  {
75
    if(dup2(fd, STDIN_FILENO) < 0)
76
    {
77
      perror("dup2 stdin");
78
      return;
79
    }
80
81
    if(dup2(fd, STDOUT_FILENO) < 0)
82
    {
83
      perror("dup2 stdout");
84
      return;
85
    }
86
87
    if(dup2(fd, STDERR_FILENO) < 0)
88
    {
89
      perror("dup2 stderr");
90
      return;
91
    }
92
93
    if (fd > STDERR_FILENO)
94
    {
95
      if (close(fd) < 0)
96
      {
97
        perror("close");
98
        return;
99
      }
100
    }
101
  }
2131.10.2 by Stewart Smith
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.
102
}
103
2363.1.7 by Brian Aker
This shifts the closing of the socket to after we know that no errors are going to occur.
104
bool daemonize()
2131.10.1 by Stewart Smith
add a very simple --daemon or -d option to drizzled using the exact same code as memcached to start as a daemon.
105
{
2363.1.7 by Brian Aker
This shifts the closing of the socket to after we know that no errors are going to occur.
106
  pid_t child= -1;
107
108
  parent_pid= getpid();
109
  signal(SIGUSR1, sigusr1_handler);
110
111
  child= fork();
112
113
  switch (child)
114
  {
115
  case -1:
116
    return true;
117
118
  case 0:
119
    break;
120
121
  default:
2131.10.2 by Stewart Smith
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.
122
    {
2363.1.7 by Brian Aker
This shifts the closing of the socket to after we know that no errors are going to occur.
123
      /* parent */
124
      int exit_code= -1;
125
      int status;
126
      while (waitpid(child, &status, 0) != child)
127
      { }
128
129
      if (WIFEXITED(status))
130
      {
131
        exit_code= WEXITSTATUS(status);
132
      }
133
      if (WIFSIGNALED(status))
134
      {
135
        exit_code= -1;
136
      }
137
      _exit(exit_code);
138
    }
139
  }
140
141
  /* child */
142
  if (setsid() == -1)
143
  {
144
    return true;
145
  }
146
147
  return false; 
2131.10.1 by Stewart Smith
add a very simple --daemon or -d option to drizzled using the exact same code as memcached to start as a daemon.
148
}
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
149
150
} /* namespace drizzled */