I like the bgpd behaviour, and all the similar daemons should have the
same behaviour.
> If ospfd is running and you attempt to reload a configuration file
> but it has an error (or the parser thinks it has an error even though
> the file is valid..), yyerror just prints to stderr so the message
> is lost unless you're running ospfd in the foreground.
>
> I wrote a diff to handle this (included at the bottom of this mail)
> but then I noticed that bgpd already does the same, so this just syncs
> with bgpd's handling. OK?
>
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/parse.y,v
> retrieving revision 1.73
> diff -u -p -r1.73 parse.y
> --- parse.y 13 Dec 2010 13:43:37 -0000 1.73
> +++ parse.y 3 Mar 2013 21:13:58 -0000
> @@ -36,6 +36,7 @@
> #include <stdarg.h>
> #include <stdio.h>
> #include <string.h>
> +#include <syslog.h>
>
> #include "ospf.h"
> #include "ospfd.h"
> @@ -692,14 +693,16 @@ struct keywords {
> int
> yyerror(const char *fmt, ...)
> {
> - va_list ap;
> + va_list ap;
> + char *nfmt;
>
> file->errors++;
> va_start(ap, fmt);
> - fprintf(stderr, "%s:%d: ", file->name, yylval.lineno);
> - vfprintf(stderr, fmt, ap);
> - fprintf(stderr, "\n");
> + if (asprintf(&nfmt, "%s:%d: %s", file->name, yylval.lineno, fmt) == -1)
> + fatalx("yyerror asprintf");
> + vlog(LOG_CRIT, nfmt, ap);
> va_end(ap);
> + free(nfmt);
> return (0);
> }
>
>
>
> Here's the one I came up with myself FWIW.
>
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/parse.y,v
> retrieving revision 1.73
> diff -u -p -r1.73 parse.y
> --- parse.y 13 Dec 2010 13:43:37 -0000 1.73
> +++ parse.y 3 Mar 2013 21:01:25 -0000
> @@ -693,12 +693,14 @@ int
> yyerror(const char *fmt, ...)
> {
> va_list ap;
> + char *buf;
>
> file->errors++;
> va_start(ap, fmt);
> - fprintf(stderr, "%s:%d: ", file->name, yylval.lineno);
> - vfprintf(stderr, fmt, ap);
> - fprintf(stderr, "\n");
> + if (vasprintf(&buf, fmt, ap) >= 0) {
> + log_warnx("%s:%d: %s", file->name, yylval.lineno, buf);
> + free(buf);
> + }
> va_end(ap);
> return (0);
> }
>