1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 AP_DECLARE(apr_status_t
) ap_mpm_pod_open(apr_pool_t
*p
, ap_pod_t
**pod
)
27 *pod
= apr_palloc(p
, sizeof(**pod
));
28 rv
= apr_file_pipe_create(&((*pod
)->pod_in
), &((*pod
)->pod_out
), p
);
29 if (rv
!= APR_SUCCESS
) {
33 apr_file_pipe_timeout_set((*pod)->pod_in, 0);
37 /* close these before exec. */
38 apr_file_inherit_unset((*pod
)->pod_in
);
39 apr_file_inherit_unset((*pod
)->pod_out
);
44 AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t
*pod
)
50 /* we need to surface EINTR so we'll have to grab the
51 * native file descriptor and do the OS read() ourselves
53 apr_os_file_get(&fd
, pod
->pod_in
);
66 AP_DECLARE(apr_status_t
) ap_mpm_pod_close(ap_pod_t
*pod
)
70 rv
= apr_file_close(pod
->pod_out
);
71 if (rv
!= APR_SUCCESS
) {
75 rv
= apr_file_close(pod
->pod_in
);
76 if (rv
!= APR_SUCCESS
) {
82 static apr_status_t
pod_signal_internal(ap_pod_t
*pod
, int graceful
)
85 char char_of_death
= graceful
? GRACEFUL_CHAR
: RESTART_CHAR
;
88 rv
= apr_file_write(pod
->pod_out
, &char_of_death
, &one
);
89 if (rv
!= APR_SUCCESS
) {
90 ap_log_error(APLOG_MARK
, APLOG_WARNING
, rv
, ap_server_conf
,
91 "write pipe_of_death");
96 AP_DECLARE(apr_status_t
) ap_mpm_pod_signal(ap_pod_t
*pod
, int graceful
)
98 return pod_signal_internal(pod
, graceful
);
101 AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t
*pod
, int num
, int graceful
)
104 apr_status_t rv
= APR_SUCCESS
;
106 for (i
= 0; i
< num
&& rv
== APR_SUCCESS
; i
++) {
107 rv
= pod_signal_internal(pod
, graceful
);