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); > } >