summaryrefslogtreecommitdiff
path: root/server/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/log.c')
-rw-r--r--server/log.c59
1 files changed, 49 insertions, 10 deletions
diff --git a/server/log.c b/server/log.c
index 3aa20b0b..42a77290 100644
--- a/server/log.c
+++ b/server/log.c
@@ -265,7 +265,8 @@ static void log_child_errfn(apr_pool_t *pool, apr_status_t err,
* stderr for the child will be the same as the stdout of the parent.
* Otherwise the child will inherit the stderr from the parent. */
static int log_child(apr_pool_t *p, const char *progname,
- apr_file_t **fpin, int dummy_stderr)
+ apr_file_t **fpin, apr_cmdtype_e cmdtype,
+ int dummy_stderr)
{
/* Child process code for 'ErrorLog "|..."';
* may want a common framework for this, since I expect it will
@@ -277,8 +278,7 @@ static int log_child(apr_pool_t *p, const char *progname,
apr_file_t *outfile, *errfile;
if (((rc = apr_procattr_create(&procattr, p)) == APR_SUCCESS)
- && ((rc = apr_procattr_cmdtype_set(procattr,
- APR_SHELLCMD_ENV)) == APR_SUCCESS)
+ && ((rc = apr_procattr_cmdtype_set(procattr, cmdtype)) == APR_SUCCESS)
&& ((rc = apr_procattr_io_set(procattr,
APR_FULL_BLOCK,
APR_NO_PIPE,
@@ -325,12 +325,26 @@ static int open_error_log(server_rec *s, int is_main, apr_pool_t *p)
if (*s->error_fname == '|') {
apr_file_t *dummy = NULL;
+ apr_cmdtype_e cmdtype = APR_SHELLCMD_ENV;
+ fname = s->error_fname + 1;
+ /* In 2.4 favor PROGRAM_ENV, accept "||prog" syntax for compatibility
+ * and "|$cmd" to override the default.
+ * Any 2.2 backport would continue to favor SHELLCMD_ENV so there
+ * accept "||prog" to override, and "|$cmd" to ease conversion.
+ */
+ if (*fname == '|') {
+ cmdtype = APR_PROGRAM_ENV;
+ ++fname;
+ }
+ if (*fname == '$')
+ ++fname;
+
/* Spawn a new child logger. If this is the main server_rec,
* the new child must use a dummy stderr since the current
* stderr might be a pipe to the old logger. Otherwise, the
* child inherits the parents stderr. */
- rc = log_child(p, s->error_fname + 1, &dummy, is_main);
+ rc = log_child(p, fname, &dummy, cmdtype, is_main);
if (rc != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_STARTUP, rc, NULL,
"Couldn't start ErrorLog process");
@@ -883,12 +897,12 @@ static apr_status_t piped_log_spawn(piped_log *pl)
apr_status_t status;
if (((status = apr_procattr_create(&procattr, pl->p)) != APR_SUCCESS) ||
- ((status = apr_procattr_cmdtype_set(procattr,
- APR_SHELLCMD_ENV)) != APR_SUCCESS) ||
+ ((status = apr_procattr_cmdtype_set(procattr, pl->cmdtype))
+ != APR_SUCCESS) ||
((status = apr_procattr_child_in_set(procattr,
ap_piped_log_read_fd(pl),
ap_piped_log_write_fd(pl)))
- != APR_SUCCESS) ||
+ != APR_SUCCESS) ||
((status = apr_procattr_child_errfn_set(procattr, log_child_errfn))
!= APR_SUCCESS) ||
((status = apr_procattr_error_check_set(procattr, 1)) != APR_SUCCESS)) {
@@ -1012,7 +1026,9 @@ static apr_status_t piped_log_cleanup(void *data)
}
-AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
+AP_DECLARE(piped_log *) ap_open_piped_log_ex(apr_pool_t *p,
+ const char *program,
+ apr_cmdtype_e cmdtype)
{
piped_log *pl;
@@ -1020,6 +1036,7 @@ AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
pl->p = p;
pl->program = apr_pstrdup(p, program);
pl->pid = NULL;
+ pl->cmdtype = cmdtype;
if (apr_file_pipe_create(&ap_piped_log_read_fd(pl),
&ap_piped_log_write_fd(pl), p) != APR_SUCCESS) {
return NULL;
@@ -1045,13 +1062,15 @@ static apr_status_t piped_log_cleanup(void *data)
return APR_SUCCESS;
}
-AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
+AP_DECLARE(piped_log *) ap_open_piped_log_ex(apr_pool_t *p,
+ const char *program,
+ apr_cmdtype_e cmdtype)
{
piped_log *pl;
apr_file_t *dummy = NULL;
int rc;
- rc = log_child(p, program, &dummy, 0);
+ rc = log_child(p, program, &dummy, cmdtype, 0);
if (rc != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_STARTUP, rc, NULL,
"Couldn't start piped log process");
@@ -1069,6 +1088,26 @@ AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
#endif
+AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p,
+ const char *program)
+{
+ apr_cmdtype_e cmdtype = APR_SHELLCMD_ENV;
+
+ /* In 2.4 favor PROGRAM_ENV, accept "||prog" syntax for compatibility
+ * and "|$cmd" to override the default.
+ * Any 2.2 backport would continue to favor SHELLCMD_ENV so there
+ * accept "||prog" to override, and "|$cmd" to ease conversion.
+ */
+ if (*program == '|') {
+ cmdtype = APR_PROGRAM_ENV;
+ ++program;
+ }
+ if (*program == '$')
+ ++program;
+
+ return ap_open_piped_log_ex(p, program, cmdtype);
+}
+
AP_DECLARE(void) ap_close_piped_log(piped_log *pl)
{
apr_pool_cleanup_run(pl->p, pl, piped_log_cleanup);