log.c revision dc64949d88a97fef0bfcb2eed2115dddafc41666
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/* ====================================================================
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * The Apache Software License, Version 1.1
b99dbaab171d91e1b664397cc40e039d0c087c65fielding * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * reserved.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * Redistribution and use in source and binary forms, with or without
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * modification, are permitted provided that the following conditions
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * 1. Redistributions of source code must retain the above copyright
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * notice, this list of conditions and the following disclaimer.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * 2. Redistributions in binary form must reproduce the above copyright
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * notice, this list of conditions and the following disclaimer in
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * the documentation and/or other materials provided with the
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * distribution.
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * 3. The end-user documentation included with the redistribution,
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * if any, must include the following acknowledgment:
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * "This product includes software developed by the
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * Apache Software Foundation (http://www.apache.org/)."
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * Alternately, this acknowledgment may appear in the software itself,
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * if and wherever such third-party acknowledgments normally appear.
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * 4. The names "Apache" and "Apache Software Foundation" must
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * not be used to endorse or promote products derived from this
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * software without prior written permission. For written
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * permission, please contact apache@apache.org.
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * 5. Products derived from this software may not be called "Apache",
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * nor may "Apache" appear in their name, without prior written
64185f9824e42f21ca7b9ae6c004484215c031a7rbb * permission of the Apache Software Foundation.
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * SUCH DAMAGE.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * ====================================================================
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * This software consists of voluntary contributions made by many
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * individuals on behalf of the Apache Software Foundation. For more
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * information on the Apache Software Foundation, please see
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * Portions of this software are based upon public domain software
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * originally written at the National Center for Supercomputing Applications,
7e79e8fd53348f9fc6e8009a4a2522425ab6f08ffielding * University of Illinois, Urbana-Champaign.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * http_log.c: Dealing with the logs and errors
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * Rob McCool
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingtypedef struct {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingint AP_DECLARE_DATA ap_default_loglevel = DEFAULT_LOGLEVEL;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAP_DECLARE(apr_status_t) ap_replace_stderr_log(apr_pool_t *p,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding const char *fname)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding APR_EBADPATH, NULL, "Invalid -E error log file %s",
f5fccb8eae1f1a5f212a5bda878479c281f36512trawick "%s: could not open error log file %s.",
fa4e5ac791dd1c84df616b28d4ee9751efe9c64frbb if ((rc = apr_file_open_stderr(&stderr_log, p)) == APR_SUCCESS) {
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm if ((rc = apr_file_dup2(stderr_log, stderr_file, p)) == APR_SUCCESS) {
066877f1a045103acfdd376d48cdd473c33f409bdougm "unable to replace stderr with error_log");
2cfdca5be0c69f65b43a888d6d3da846489b8fa5rbbstatic int log_child(apr_pool_t *p, const char *progname,
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm /* Child process code for 'ErrorLog "|..."';
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * may want a common framework for this, since I expect it will
061c3874622b67beff724876b9bd1b1f291f2eaafielding * be common for other foo-loggers to want this sort of thing...
2cfdca5be0c69f65b43a888d6d3da846489b8fa5rbb if (((rc = apr_procattr_create(&procattr, p)) == APR_SUCCESS)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding const char *pname;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding procnew = (apr_proc_t *)apr_pcalloc(p, sizeof(*procnew));
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding rc = apr_proc_create(procnew, pname, (const char * const *)args,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingstatic void open_error_log(server_rec *s, apr_pool_t *p)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding const char *fname;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* This starts a new process... */
0ef1b940b4850f644082d2d33f94a1db15686d40bjh "Couldn't start ErrorLog process");
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding else if (!strncasecmp(s->error_fname, "syslog", 6)) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding openlog(ap_server_argv0, LOG_NDELAY|LOG_CONS|LOG_PID,
066877f1a045103acfdd376d48cdd473c33f409bdougm openlog(ap_server_argv0, LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL7);
ec727afb817df0e5202135278c0d2902923cc980stoddard fname = ap_server_root_relative(p, s->error_fname);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding ap_log_error(APLOG_MARK, APLOG_STARTUP, APR_EBADPATH, NULL,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "%s: Invalid error log path %s.",
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "%s: could not open error log file %s.",
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingvoid ap_open_logs(server_rec *s_main, apr_pool_t *p)
4e1e8abb2a6e588366a4680b039b460fc5fe1ccdstoddard /* replace stderr with this new log */
40303323ae9960bd38a0f03d2c10e897a7badd88rbb if ((rc = apr_file_open_stderr(&errfile, p)) == APR_SUCCESS) {
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm "unable to replace stderr with error_log");
d2e443764d6855a4a06c8eb2b7708ab9b465ddeerbb /* note that stderr may still need to be replaced with something
39b67927abc1c24834e165444655939ea52c908aorlikowski * because it points to the old error log, or back to the tty
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * of the submitter.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * XXX: This is BS - /dev/null is non-portable
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (replace_stderr && freopen("/dev/null", "w", stderr) == NULL) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s_main,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "unable to replace stderr with /dev/null");
39b67927abc1c24834e165444655939ea52c908aorlikowski for (virt = s_main->next; virt; virt = virt->next) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding && strcmp(q->error_fname, virt->error_fname) == 0) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAP_DECLARE(void) ap_error_log2stderr(server_rec *s) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding apr_file_dup2(s->error_log, errfile, s->process->pool);
39b67927abc1c24834e165444655939ea52c908aorlikowskistatic void log_error_core(const char *file, int line, int level,
10a4cdd68ef1ca0e54af296fe1d08ac00150c90bwrowe const char *referer;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (s == NULL) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * If we are doing stderr logging (startup), don't log messages that are
2b484455736f4c30447aa852764f53282cbeb5ddrbb * above the default server log level unless it is a startup/shutdown
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding else if (s->error_log) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * If we are doing normal logging, don't log messages that are
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * above the server log level unless it is a startup/shutdown notice
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * If we are doing normal logging, don't log messages that are
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * above the server log level unless it is a startup/shutdown notice
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#endif /* TPF */
b0f20a4a26bcfa85724b1c2e5ec6a077f12ef44crbb * If we are doing syslog logging, don't log messages that are
7041bead13293c6a2e47ae1babc35f2da1d6a749trawick * above the server log level (including a startup/shutdown notice)
d2e443764d6855a4a06c8eb2b7708ab9b465ddeerbb if (logf && ((level & APLOG_STARTUP) != APLOG_STARTUP)) {
066877f1a045103acfdd376d48cdd473c33f409bdougm len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
3d96ee83babeec32482c9082c9426340cee8c44dwrowe /* In OSD/POSIX, the compiler returns for __FILE__
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm * a string like: __FILE__="*POSIX(/usr/include/stdio.h)"
0942697a9b5de44865676345a3828741c827efe6rbb * (it even returns an absolute path for sources in
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * the current directory). Here we try to strip this
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * down to the basename.
3597d6b10c88c252f156fe8061b659a38dea38c2rbb if (*e == ')') {
3597d6b10c88c252f156fe8061b659a38dea38c2rbb *e = '\0';
3597d6b10c88c252f156fe8061b659a38dea38c2rbb#endif /*_OSD_POSIX*/
3597d6b10c88c252f156fe8061b659a38dea38c2rbb#endif /* TPF */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (r && r->connection) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* XXX: TODO: add a method of selecting whether logged client
3d96ee83babeec32482c9082c9426340cee8c44dwrowe * addresses are in dotted quad or resolved form... dotted
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm * quad is the most secure, which is why I'm implementing it
0942697a9b5de44865676345a3828741c827efe6rbb * first. -djg
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
3597d6b10c88c252f156fe8061b659a38dea38c2rbb if (status != 0) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding len += apr_vsnprintf(errstr + len, MAX_STRING_LEN - len, fmt, args);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (r && (referer = apr_table_get(r->headers_in, "Referer"))) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm /* NULL if we are logging to syslog */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* Truncate for the terminator (as apr_snprintf does) */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding ap_run_error_log(file, line, level, status, s, r, pool, errstr + errstrlen);
6f984345bbfa9342dde1f2b7b8c35b7987d078afwroweAP_DECLARE(void) ap_log_error(const char *file, int line, int level,
061c3874622b67beff724876b9bd1b1f291f2eaafielding const char *fmt, ...)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding log_error_core(file, line, level, status, s, NULL, NULL, fmt, args);
ab5581cc78e9d865b0a6ab1404c53347b3276968rbbAP_DECLARE(void) ap_log_perror(const char *file, int line, int level,
ab5581cc78e9d865b0a6ab1404c53347b3276968rbb const char *fmt, ...)
cf5ace98ead10d803fda70674cb4dda30fddb832trawick log_error_core(file, line, level, status, NULL, NULL, p, fmt, args);
2b484455736f4c30447aa852764f53282cbeb5ddrbbAP_DECLARE(void) ap_log_rerror(const char *file, int line, int level,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding const char *fmt, ...)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding log_error_core(file, line, level, status, r->server, r, NULL, fmt, args);
10a4cdd68ef1ca0e54af296fe1d08ac00150c90bwrowe * IF APLOG_TOCLIENT is set,
6db54801798f6021bb464de7b3fdcc9dc3150f7bdgaudet * AND the error level is 'warning' or more severe,
066877f1a045103acfdd376d48cdd473c33f409bdougm * AND there isn't already error text associated with this request,
2b484455736f4c30447aa852764f53282cbeb5ddrbb * THEN make the message text available to ErrorDocument and
2b484455736f4c30447aa852764f53282cbeb5ddrbb * other error processors.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding && (apr_table_get(r->notes, "error-notes") == NULL)) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding ap_escape_html(r->pool, apr_pvsprintf(r->pool, fmt,
10a4cdd68ef1ca0e54af296fe1d08ac00150c90bwroweAP_DECLARE(void) ap_log_pid(apr_pool_t *p, const char *filename)
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm const char *fname;
e4c4fcc82268e0192db234c74a6db784b879fffdrbb ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, APR_EBADPATH,
2cfdca5be0c69f65b43a888d6d3da846489b8fa5rbb && apr_stat(&finfo, fname, APR_FINFO_MTIME, p) == APR_SUCCESS) {
7f1290cbf118bf3d34aecc68cff2e5bd0a23e126rbb /* AP_SIG_GRACEFUL and HUP call this on each restart.
7f1290cbf118bf3d34aecc68cff2e5bd0a23e126rbb * Only warn on first time through for this pid.
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm * XXX: Could just write first time through too, although
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm * that may screw up scripts written to do something
db2ef76dc744b13b9a9929ebb9e6f94712a81717rbb * based on the last modification time of the pid file.
fa4e5ac791dd1c84df616b28d4ee9751efe9c64frbb "shutdown of previous Apache run?",
f17e3ffa43ed4f41d984925d22eb9f8139fcbf1dstoddard APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD, p))
2cfdca5be0c69f65b43a888d6d3da846489b8fa5rbb "%s: could not log pid to file %s",
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding apr_file_printf(pid_file, "%ld" APR_EOL_STR, (long)mypid);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAP_DECLARE(apr_status_t) ap_read_pid(apr_pool_t *p, const char *filename,
d7150b84735ff36eeb3cde9c79ab2e69ee7ffd67rbb const apr_size_t BUFFER_SIZE = sizeof(long) * 3 + 2; /* see apr_ltoa */
d7150b84735ff36eeb3cde9c79ab2e69ee7ffd67rbb const char *fname;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, APR_EBADPATH,
2b484455736f4c30447aa852764f53282cbeb5ddrbb rv = apr_file_open(&pid_file, fname, APR_READ, APR_OS_DEFAULT, p);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* Ensure null-termination, so that strtol doesn't go crazy. */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding rv = apr_file_read_full(pid_file, buf, BUFFER_SIZE - 1, &bytes_read);
066877f1a045103acfdd376d48cdd473c33f409bdougm /* If we fill the buffer, we're probably reading a corrupt pid file.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * To be nice, let's also ensure the first char is a digit. */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (bytes_read == BUFFER_SIZE - 1 || !apr_isdigit(*buf)) {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile,
2a7d0035b5594ddc0907a9cc545e14ae5140c541manoj "[%s] file %s, line %d, assertion \"%s\" failed",
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* unix assert does an abort leading to a core dump */
2a7d0035b5594ddc0907a9cc545e14ae5140c541manoj/* piped log support */
3d96ee83babeec32482c9082c9426340cee8c44dwrowe/* forward declaration */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingstatic void piped_log_maintenance(int reason, void *data, apr_wait_t status);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (((status = apr_procattr_create(&procattr, pl->p)) != APR_SUCCESS) ||
066877f1a045103acfdd376d48cdd473c33f409bdougm /* Something bad happened, give up and go away. */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "piped_log_spawn: unable to setup child process '%s': %s",
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding pl->program, apr_strerror(status, buf, sizeof(buf)));
b0f20a4a26bcfa85724b1c2e5ec6a077f12ef44crbb const char *pname;
066877f1a045103acfdd376d48cdd473c33f409bdougm rc = apr_proc_create(procnew, pname, (const char * const *) args,
3d96ee83babeec32482c9082c9426340cee8c44dwrowe /* pjr - This no longer happens inside the child, */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* I am assuming that if apr_proc_create was */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* successful that the child is running. */
a952e0c6ece342d88f2bc04e20dcfc563398eed3rbb apr_proc_other_child_register(procnew, piped_log_maintenance, pl,
b0f20a4a26bcfa85724b1c2e5ec6a077f12ef44crbbstatic void piped_log_maintenance(int reason, void *data, apr_wait_t status)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding /* during a restart */
a7318397b355119d990d1f311b951dea2aafc53arbb /* during a restart */
case APR_OC_REASON_UNWRITABLE:
case APR_OC_REASON_RESTART:
case APR_OC_REASON_UNREGISTER:
return APR_SUCCESS;
pl->p = p;
return NULL;
return NULL;
return pl;
return APR_SUCCESS;
int rc;
pl->p = p;
return pl;