summaryrefslogtreecommitdiff
path: root/usr.sbin/ospf6d/parse.y
diff options
context:
space:
mode:
authorMarco Pfatschbacher <mpf@cvs.openbsd.org>2008-02-26 10:09:59 +0000
committerMarco Pfatschbacher <mpf@cvs.openbsd.org>2008-02-26 10:09:59 +0000
commitb46f88af58a8d288797f9ac76d7aef32576d1360 (patch)
tree5b31427ce019869d392e57042555456ed9749fda /usr.sbin/ospf6d/parse.y
parentc5ad3516ac1e4caaf6eafee610f3a026efecc199 (diff)
Have popfile() also close the main config file,
but only do the final popfile call after yyparse() is done. This also fixes config reload on SIGHUP for some daemons. Spotted by otto@. OK deraadt@
Diffstat (limited to 'usr.sbin/ospf6d/parse.y')
-rw-r--r--usr.sbin/ospf6d/parse.y29
1 files changed, 15 insertions, 14 deletions
diff --git a/usr.sbin/ospf6d/parse.y b/usr.sbin/ospf6d/parse.y
index 0bc09123b30..69163d8750a 100644
--- a/usr.sbin/ospf6d/parse.y
+++ b/usr.sbin/ospf6d/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.12 2007/12/13 08:54:05 claudio Exp $ */
+/* $OpenBSD: parse.y,v 1.13 2008/02/26 10:09:58 mpf Exp $ */
/*
* Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -51,7 +51,7 @@ static struct file {
char *name;
int lineno;
int errors;
-} *file;
+} *file, *topfile;
struct file *pushfile(const char *, int);
int popfile(void);
int check_file_secrecy(int, const char *);
@@ -589,8 +589,9 @@ lgetc(int quotec)
if (quotec) {
if ((c = getc(file->stream)) == EOF) {
- yyerror("reached end of file while parsing quoted string");
- if (popfile() == EOF)
+ yyerror("reached end of file while parsing "
+ "quoted string");
+ if (file == topfile || popfile() == EOF)
return (EOF);
return (quotec);
}
@@ -608,7 +609,7 @@ lgetc(int quotec)
}
while (c == EOF) {
- if (popfile() == EOF)
+ if (file == topfile || popfile() == EOF)
return (EOF);
c = getc(file->stream);
}
@@ -849,16 +850,15 @@ popfile(void)
{
struct file *prev;
- if ((prev = TAILQ_PREV(file, files, entry)) != NULL) {
+ if ((prev = TAILQ_PREV(file, files, entry)) != NULL)
prev->errors += file->errors;
- TAILQ_REMOVE(&files, file, entry);
- fclose(file->stream);
- free(file->name);
- free(file);
- file = prev;
- return (0);
- }
- return (EOF);
+
+ TAILQ_REMOVE(&files, file, entry);
+ fclose(file->stream);
+ free(file->name);
+ free(file);
+ file = prev;
+ return (file ? 0 : EOF);
}
struct ospfd_conf *
@@ -889,6 +889,7 @@ parse_config(char *filename, int opts)
free(conf);
return (NULL);
}
+ topfile = file;
LIST_INIT(&conf->area_list);
LIST_INIT(&conf->cand_list);