diff options
-rw-r--r-- | sysdep/unix/config.Y | 24 | ||||
-rw-r--r-- | sysdep/unix/io.c | 2 | ||||
-rw-r--r-- | sysdep/unix/log.c | 5 |
3 files changed, 19 insertions, 12 deletions
diff --git a/sysdep/unix/config.Y b/sysdep/unix/config.Y index bd9c3822..f0a517e9 100644 --- a/sysdep/unix/config.Y +++ b/sysdep/unix/config.Y @@ -12,29 +12,33 @@ CF_HDR CF_DECLS -CF_KEYWORDS(LOG, SYSLOG, ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG) +CF_KEYWORDS(LOG, SYSLOG, ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG, STDERR) %type <i> log_mask log_mask_list log_cat +%type <g> log_file CF_GRAMMAR CF_ADDTO(conf, log_config) -log_config: LOG TEXT log_mask ';' { - struct log_config *c = cfg_allocz(sizeof(struct log_config)); - FILE *f = rfopen(new_config->pool, $2, "a"); - if (!f) cf_error("Unable to open log file `%s': %m", $2); - c->mask = $3; - c->fh = f; - add_tail(&new_config->logfiles, &c->n); - } - | LOG SYSLOG log_mask ';' { +log_config: LOG log_file log_mask ';' { struct log_config *c = cfg_allocz(sizeof(struct log_config)); + c->fh = $2; c->mask = $3; add_tail(&new_config->logfiles, &c->n); } ; +log_file: + TEXT { + FILE *f = tracked_fopen(new_config->pool, $1, "a"); + if (!f) cf_error("Unable to open log file `%s': %m", $1); + $$ = f; + } + | SYSLOG { $$ = NULL; } + | STDERR { $$ = stderr; } + ; + log_mask: ALL { $$ = ~0; } | '{' log_mask_list '}' { $$ = $2; } diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index 7d6a6f22..45db1a10 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -83,7 +83,7 @@ static struct resclass rf_class = { }; void * -rfopen(pool *p, char *name, char *mode) +tracked_fopen(pool *p, char *name, char *mode) { FILE *f = fopen(name, mode); diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c index afc30a92..b4a028da 100644 --- a/sysdep/unix/log.c +++ b/sysdep/unix/log.c @@ -167,7 +167,10 @@ log_init(int debug) void log_switch(list *l) { - current_log_list = l; + if (EMPTY_LIST(*l)) + current_log_list = &init_log_list; + else + current_log_list = l; } void |