mpm_common.c revision 709cbb7b338843a3f9d7b9b92e8e0c4b1f9b7848
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering/* ====================================================================
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * The Apache Software License, Version 1.1
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * Copyright (c) 2000-2003 The Apache Software Foundation. All rights
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * Redistribution and use in source and binary forms, with or without
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * modification, are permitted provided that the following conditions
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * 1. Redistributions of source code must retain the above copyright
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * notice, this list of conditions and the following disclaimer.
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * 2. Redistributions in binary form must reproduce the above copyright
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * notice, this list of conditions and the following disclaimer in
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * the documentation and/or other materials provided with the
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * distribution.
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * 3. The end-user documentation included with the redistribution,
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * if any, must include the following acknowledgment:
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * "This product includes software developed by the
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * Apache Software Foundation (http://www.apache.org/)."
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * Alternately, this acknowledgment may appear in the software itself,
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * if and wherever such third-party acknowledgments normally appear.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 4. The names "Apache" and "Apache Software Foundation" must
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * not be used to endorse or promote products derived from this
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * software without prior written permission. For written
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * permission, please contact apache@apache.org.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 5. Products derived from this software may not be called "Apache",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * nor may "Apache" appear in their name, without prior written
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * permission of the Apache Software Foundation.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * ====================================================================
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * This software consists of voluntary contributions made by many
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * individuals on behalf of the Apache Software Foundation. For more
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * information on the Apache Software Foundation, please see
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen * Portions of this software are based upon public domain software
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * originally written at the National Center for Supercomputing Applications,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * University of Illinois, Urbana-Champaign.
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen/* The purpose of this file is to store the code that MOST mpm's will need
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * this does not mean a function only goes into this file if every MPM needs
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * it. It means that if a function is needed by more than one MPM, and
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * future maintenance would be served by making the code common, then the
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen * function belongs here.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * This is going in src/main because it is not platform specific, it is
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * specific to multi-process servers, but NOT to Unix. Which is why it
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * does not belong in src/os/unix
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#ifdef AP_MPM_WANT_SET_SCOREBOARD
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek long int waittime = 1024 * 16; /* in usecs */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons);
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen for (tries = terminate ? 4 : 1; tries <= 9; ++tries) {
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen /* don't want to hold up progress any more than
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * necessary, but we need to allow children a few moments to exit.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Set delay with an exponential backoff.
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen /* now see who is done */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (i = 0; i < max_daemons; ++i) {
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen waitret = apr_proc_wait(&proc, NULL, NULL, APR_NOWAIT);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* ok, now it's being annoying */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_WARNING,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "child process %ld still did not exit, "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "sending a SIGTERM",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* die child scum */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_ERR,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "child process %ld still did not exit, "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "sending a SIGKILL",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* sending a SIGKILL kills the entire team on BeOS, and as
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * httpd thread is part of that team it removes any chance
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * of ever doing a restart. To counter this I'm changing to
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * use a kinder, gentler way of killing a specific thread
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * that is just as effective.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* gave it our best shot, but alas... If this really
102bd40e1ed71c7ab980a90435a1c23d4c786c63Lennart Poettering * is a child we are trying to kill and it really hasn't
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * exited, we will likely fail to bind to the port
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * after the restart.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_ERR,
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen "could not make child process %ld exit, "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "attempting to continue anyway",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* nothing left to wait for */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#endif /* AP_MPM_WANT_RECLAIM_CHILD_PROCESSES */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#ifdef AP_MPM_WANT_WAIT_OR_TIMEOUT
1ff28eaee33d9d0cee46bd176b6d6f8805c95036Tom Gundersen/* number of calls to wait_or_timeout between writable probes */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#ifndef INTERVAL_OF_WRITABLE_PROBES
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#define INTERVAL_OF_WRITABLE_PROBES 10
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int wait_or_timeout_counter;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekvoid ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode, apr_proc_t *ret,
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek rv = apr_proc_wait_all_procs(ret, exitcode, status, APR_NOWAIT, p);
66d3752e812915a549ebee01769ee761c1495667Jacob Keller if ((ret = reap_children(exitcode, status)) > 0) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#endif /* AP_MPM_WANT_WAIT_OR_TIMEOUT */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekint ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const char *sigdesc = apr_signal_description_get(signum);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Child died... if it died due to a fatal error,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * we should simply bail out. The caller needs to
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * check for bad rc from us and exit, running any
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * appropriate cleanups.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * If the child died due to a resource shortage,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * the parent should limit the rate of forking
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (status == APEXIT_CHILDSICK) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (status == APEXIT_CHILDFATAL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " returned a Fatal error..." APR_EOL_STR
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Apache is exiting!",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (APR_PROC_CHECK_SIGNALED(why)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (APR_PROC_CHECK_CORE_DUMP(why)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_NOTICE,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "child pid %ld exit signal %s (%d), "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "possible coredump in %s",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (long)pid->pid, sigdesc, signum,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_NOTICE,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "child pid %ld exit signal %s (%d)",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (long)pid->pid, sigdesc, signum);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#endif /* AP_MPM_WANT_PROCESS_CHILD_STATUS */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekvoid ap_sock_disable_nagle(apr_socket_t *s)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* The Nagle algorithm says that we should delay sending partial
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * packets in hopes of getting more data. We don't want to do
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * this; we are not telnet. There are bad interactions between
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * persistent connections and Nagle's algorithm that have very severe
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * performance penalties. (Failing to disable Nagle is not much of a
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * problem with simple HTTP.)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * In spite of these problems, failure here is not a shooting offense.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek apr_status_t status = apr_socket_opt_set(s, APR_TCP_NODELAY, 1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_WARNING, status, ap_server_conf,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "apr_socket_opt_set: (TCP_NODELAY)");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(uid_t) ap_uname2id(const char *name)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%s: bad user name %s", ap_server_argv0, name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(gid_t) ap_gname2id(const char *name)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%s: bad group name %s", ap_server_argv0, name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekint initgroups(const char *name, gid_t basegid)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#if defined(QNX) || defined(MPE) || defined(BEOS) || defined(_OSD_POSIX) || defined(TPF) || defined(__TANDEM) || defined(OS2) || defined(WIN32) || defined(NETWARE)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* QNX, MPE and BeOS do not appear to support supplementary groups. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#else /* ndef QNX */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek while (index < NGROUPS_MAX && ((g = getgrent()) != NULL)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (names = g->gr_mem; *names != NULL; ++names) {
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering#endif /* def QNX */
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering#endif /* def NEED_INITGROUPS */
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart PoetteringAP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod)
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering rv = apr_file_pipe_create(&((*pod)->pod_in), &((*pod)->pod_out), p);
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering apr_file_pipe_timeout_set((*pod)->pod_in, 0);
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering apr_sockaddr_info_get(&(*pod)->sa, ap_listeners->bind_addr->hostname,
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering APR_UNSPEC, ap_listeners->bind_addr->port, 0, p);
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering /* close these before exec. */
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart PoetteringAP_DECLARE(apr_status_t) ap_mpm_pod_check(ap_pod_t *pod)
b97e7fabaeaf12c88d6a10b2bfead54a77812105Lennart Poettering rv = apr_file_read(pod->pod_in, &c, &len);
7abaad1ab099b077ebd6452b14ef351483831245pomaAP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic apr_status_t pod_signal_internal(ap_pod_t *pod)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek rv = apr_file_write(pod->pod_out, &char_of_death, &one);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "write pipe_of_death");
apr_pool_t *p;
return rv;
return rv;
return rv;
apr_pool_destroy(p);
return rv;
return rv;
#ifdef AP_MPM_WANT_SET_PIDFILE
const char *arg)
return err;
return NULL;
#ifdef AP_MPM_WANT_SET_SCOREBOARD
const char *arg)
return err;
return NULL;
#ifdef AP_MPM_WANT_SET_LOCKFILE
const char *arg)
return err;
return NULL;
#ifdef AP_MPM_WANT_SET_MAX_REQUESTS
int ap_max_requests_per_child = 0;
const char *arg)
return err;
return NULL;
#ifdef AP_MPM_WANT_SET_COREDUMPDIR
const char *arg)
const char *fname;
return err;
if (!fname) {
return NULL;
const char ap_valid_accept_mutex_string[] =
void *dummy,
const char *arg)
return err;
return NULL;
#ifdef AP_MPM_WANT_SIGNAL_SERVER
static const char *dash_k_arg;
int running = 0;
int have_pid_file = 0;
const char *status;
*exit_status = 0;
otherpid);
if (running) {
if (!running) {
if (!running) {
if (!running) {
const char *optarg;
int fixed_args;
if (!dash_k_arg) {
if (optarg) {
if (dash_k_arg) {
#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE
const char *arg)
long value;
return err;
return NULL;
0, ap_server_conf,
return APR_SUCCESS;
#ifndef NO_USE_SIGACTION
#if defined(SA_ONESHOT)
#ifdef SIGBUS
#ifdef SIGABORT
#ifdef SIGABRT
#ifdef SIGILL
#ifdef SIGBUS
#ifdef SIGABORT
#ifdef SIGABRT
#ifdef SIGILL
return APR_SUCCESS;