~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
{
70
  kill(parent_pid, SIGUSR1);
71
}
72
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
73
bool daemonize(bool nochdir, bool noclose, bool wait_sigusr1)
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.
74
{
75
    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.
76
    pid_t child= -1;
77
78
    parent_pid= getpid();
79
    signal(SIGUSR1, sigusr1_handler);
80
81
    child= fork();
82
83
    switch (child)
84
    {
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.
85
    case -1:
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
86
        return true;
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.
87
    case 0:
88
        break;
89
    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.
90
      if (wait_sigusr1)
91
      {
92
        /* parent */
93
        int exit_code= -1;
94
        int status;
2168.1.5 by Monty Taylor
Fixed an OSX warning.
95
        while (waitpid(child, &status, 0) != child)
96
        { }
97
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.
98
        if (WIFEXITED(status))
99
        {
100
          exit_code= WEXITSTATUS(status);
101
        }
102
        if (WIFSIGNALED(status))
103
        {
104
          exit_code= -1;
105
        }
106
        _exit(exit_code);
107
      }
108
      else
109
      {
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.
110
        _exit(EXIT_SUCCESS);
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.
111
      }
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.
112
    }
113
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.
114
    /* child */
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.
115
    if (setsid() == -1)
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
116
        return true;
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.
117
118
    if (nochdir == 0) {
119
        if(chdir("/") != 0) {
120
            perror("chdir");
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
121
            return true;
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.
122
        }
123
    }
124
125
    if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
126
        if(dup2(fd, STDIN_FILENO) < 0) {
127
            perror("dup2 stdin");
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
128
            return true;
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.
129
        }
130
        if(dup2(fd, STDOUT_FILENO) < 0) {
131
            perror("dup2 stdout");
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
132
            return true;
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.
133
        }
134
        if(dup2(fd, STDERR_FILENO) < 0) {
135
            perror("dup2 stderr");
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
136
            return true;
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.
137
        }
138
139
        if (fd > STDERR_FILENO) {
140
            if(close(fd) < 0) {
141
                perror("close");
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
142
                return true;
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.
143
            }
144
        }
145
    }
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
146
    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.
147
}
2167.2.1 by Monty Taylor
C++-ize daemon.c. Our codebase is c++.
148
149
} /* namespace drizzled */