summaryrefslogtreecommitdiff
path: root/usr.sbin/bgpd
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bgpd')
-rw-r--r--usr.sbin/bgpd/bgpd.c28
-rw-r--r--usr.sbin/bgpd/bgpd.h5
-rw-r--r--usr.sbin/bgpd/control.c4
-rw-r--r--usr.sbin/bgpd/log.h5
-rw-r--r--usr.sbin/bgpd/session.c3
5 files changed, 34 insertions, 11 deletions
diff --git a/usr.sbin/bgpd/bgpd.c b/usr.sbin/bgpd/bgpd.c
index c5b4e24d129..3da06935170 100644
--- a/usr.sbin/bgpd/bgpd.c
+++ b/usr.sbin/bgpd/bgpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.c,v 1.136 2006/04/26 20:00:03 claudio Exp $ */
+/* $OpenBSD: bgpd.c,v 1.137 2006/05/27 21:24:36 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -53,8 +53,9 @@ struct filter_set_head *staticset;
struct filter_set_head *staticset6;
volatile sig_atomic_t mrtdump = 0;
volatile sig_atomic_t quit = 0;
-volatile sig_atomic_t reconfig = 0;
volatile sig_atomic_t sigchld = 0;
+volatile sig_atomic_t reconfig = 0;
+pid_t reconfpid = 0;
struct imsgbuf *ibuf_se;
struct imsgbuf *ibuf_rde;
@@ -309,9 +310,27 @@ main(int argc, char *argv[])
}
if (reconfig) {
+ u_int error;
+
reconfig = 0;
log_info("rereading config");
- reconfigure(conffile, &conf, &mrt_l, &peer_l, rules_l);
+ switch (reconfigure(conffile, &conf, &mrt_l, &peer_l,
+ rules_l)) {
+ case -1: /* fatal error */
+ quit = 1;
+ break;
+ case 0: /* all OK */
+ error = 0;
+ break;
+ default: /* parse error */
+ error = CTL_RES_PARSE_ERROR;
+ break;
+ }
+ if (reconfpid != 0) {
+ send_imsg_session(IMSG_CTL_RESULT, reconfpid,
+ &error, sizeof(error));
+ reconfpid = 0;
+ }
}
if (sigchld) {
@@ -421,7 +440,7 @@ reconfigure(char *conffile, struct bgpd_config *conf, struct mrt_head *mrt_l,
if (parse_config(conffile, conf, mrt_l, peer_l, &net_l, rules_l)) {
log_warnx("config file %s has errors, not reloading",
conffile);
- return (-1);
+ return (1);
}
cflags = conf->flags;
@@ -596,6 +615,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int idx)
log_warnx("reload request not from SE");
else
reconfig = 1;
+ reconfpid = imsg.hdr.pid;
break;
case IMSG_CTL_FIB_COUPLE:
if (idx != PFD_PIPE_SESSION)
diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h
index b35de4629da..c6d8e566d8d 100644
--- a/usr.sbin/bgpd/bgpd.h
+++ b/usr.sbin/bgpd/bgpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.h,v 1.200 2006/05/23 12:11:38 henning Exp $ */
+/* $OpenBSD: bgpd.h,v 1.201 2006/05/27 21:24:36 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -346,7 +346,8 @@ enum ctl_results {
CTL_RES_OK,
CTL_RES_NOSUCHPEER,
CTL_RES_DENIED,
- CTL_RES_NOCAP
+ CTL_RES_NOCAP,
+ CTL_RES_PARSE_ERROR
};
/* needed for session.h parse prototype */
diff --git a/usr.sbin/bgpd/control.c b/usr.sbin/bgpd/control.c
index 01dd6ba8085..d3a2ab64d0f 100644
--- a/usr.sbin/bgpd/control.c
+++ b/usr.sbin/bgpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.51 2006/05/27 15:43:13 claudio Exp $ */
+/* $OpenBSD: control.c,v 1.52 2006/05/27 21:24:36 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -271,7 +271,6 @@ control_dispatch_msg(struct pollfd *pfd, u_int *ctl_cnt)
0, 0, -1, p, sizeof(struct peer));
imsg_compose(&c->ibuf, IMSG_CTL_END, 0, 0, -1, NULL, 0);
break;
- case IMSG_CTL_RELOAD:
case IMSG_CTL_FIB_COUPLE:
case IMSG_CTL_FIB_DECOUPLE:
imsg_compose_parent(imsg.hdr.type, 0, NULL, 0);
@@ -320,6 +319,7 @@ control_dispatch_msg(struct pollfd *pfd, u_int *ctl_cnt)
log_warnx("got IMSG_CTL_NEIGHBOR_ with "
"wrong length");
break;
+ case IMSG_CTL_RELOAD:
case IMSG_CTL_KROUTE:
case IMSG_CTL_KROUTE_ADDR:
case IMSG_CTL_SHOW_NEXTHOP:
diff --git a/usr.sbin/bgpd/log.h b/usr.sbin/bgpd/log.h
index b99e757dd9a..ee0a4b62305 100644
--- a/usr.sbin/bgpd/log.h
+++ b/usr.sbin/bgpd/log.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: log.h,v 1.7 2006/05/23 12:11:38 henning Exp $ */
+/* $OpenBSD: log.h,v 1.8 2006/05/27 21:24:36 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -108,5 +108,6 @@ static const char * const ctl_res_strerror[] = {
"no error",
"no such neighbor",
"permission denied",
- "neighbor does not have this capability"
+ "neighbor does not have this capability",
+ "config file has errors, reload failed"
};
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c
index f537113c18e..a2317feffde 100644
--- a/usr.sbin/bgpd/session.c
+++ b/usr.sbin/bgpd/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.248 2006/05/27 15:43:13 claudio Exp $ */
+/* $OpenBSD: session.c,v 1.249 2006/05/27 21:24:36 claudio Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@@ -2394,6 +2394,7 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx, u_int *listener_cnt)
control_imsg_relay(&imsg);
break;
case IMSG_CTL_END:
+ case IMSG_CTL_RESULT:
control_imsg_relay(&imsg);
break;
case IMSG_UPDATE: