1 /* ====================================================================
2 * The Apache Software License, Version 1.1
4 * Copyright (c) 2000-2003 The Apache Software Foundation. All rights
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * 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
16 * the documentation and/or other materials provided with the
19 * 3. The end-user documentation included with the redistribution,
20 * if any, must include the following acknowledgment:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowledgment may appear in the software itself,
24 * if and wherever such third-party acknowledgments normally appear.
26 * 4. The names "Apache" and "Apache Software Foundation" must
27 * not be used to endorse or promote products derived from this
28 * software without prior written permission. For written
29 * permission, please contact apache@apache.org.
31 * 5. Products derived from this software may not be called "Apache",
32 * nor may "Apache" appear in their name, without prior written
33 * permission of the Apache Software Foundation.
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47 * ====================================================================
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
54 * Portions of this software are based upon public domain software
55 * originally written at the National Center for Supercomputing Applications,
56 * University of Illinois, Urbana-Champaign.
65 AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod)
69 *pod = apr_palloc(p, sizeof(**pod));
70 rv = apr_file_pipe_create(&((*pod)->pod_in), &((*pod)->pod_out), p);
71 if (rv != APR_SUCCESS) {
75 apr_file_pipe_timeout_set((*pod)->pod_in, 0);
79 /* close these before exec. */
80 apr_file_inherit_unset((*pod)->pod_in);
81 apr_file_inherit_unset((*pod)->pod_out);
86 AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod)
92 /* we need to surface EINTR so we'll have to grab the
93 * native file descriptor and do the OS read() ourselves
95 apr_os_file_get(&fd, pod->pod_in);
108 AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod)
112 rv = apr_file_close(pod->pod_out);
113 if (rv != APR_SUCCESS) {
117 rv = apr_file_close(pod->pod_in);
118 if (rv != APR_SUCCESS) {
124 static apr_status_t pod_signal_internal(ap_pod_t *pod, int graceful)
127 char char_of_death = graceful ? GRACEFUL_CHAR : RESTART_CHAR;
130 rv = apr_file_write(pod->pod_out, &char_of_death, &one);
131 if (rv != APR_SUCCESS) {
132 ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf,
133 "write pipe_of_death");
138 AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful)
140 return pod_signal_internal(pod, graceful);
143 AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful)
146 apr_status_t rv = APR_SUCCESS;
148 for (i = 0; i < num && rv == APR_SUCCESS; i++) {
149 rv = pod_signal_internal(pod, graceful);