diff options
author | Henning Brauer <henning@cvs.openbsd.org> | 2005-03-30 11:23:16 +0000 |
---|---|---|
committer | Henning Brauer <henning@cvs.openbsd.org> | 2005-03-30 11:23:16 +0000 |
commit | ecb8f851ab9f0fc220d4801c8dfb9e881c04d5cc (patch) | |
tree | 320d24289149f6dd872416ecca969cb84e4a77ab /usr.sbin/bgpd/session.c | |
parent | 52345c2f1694327d6cb03d31ffe011d16ed720cc (diff) |
bgpd used to open listeners in advance in the parent and the SE picked
those it needed, closing all the others. this has some nasty races.
so let the parent keep the list of listeners so it knows when it has
to open a new one
claudio ok, also tested by jason ackley
Diffstat (limited to 'usr.sbin/bgpd/session.c')
-rw-r--r-- | usr.sbin/bgpd/session.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c index 296e925a725..b51e2328a7b 100644 --- a/usr.sbin/bgpd/session.c +++ b/usr.sbin/bgpd/session.c @@ -1,7 +1,7 @@ -/* $OpenBSD: session.c,v 1.215 2005/03/28 15:16:46 henning Exp $ */ +/* $OpenBSD: session.c,v 1.216 2005/03/30 11:23:15 henning Exp $ */ /* - * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> + * Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -2109,17 +2109,20 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx, u_int *listener_cnt) if (idx != PFD_PIPE_MAIN) fatalx("reconf request not from parent"); nla = imsg.data; - TAILQ_FOREACH(la, conf->listen_addrs, entry) { + TAILQ_FOREACH(la, conf->listen_addrs, entry) if (!la_cmp(la, nla)) break; - } - - if ((nla->fd = imsg_get_fd(ibuf)) == -1) - log_warnx("expected to receive fd for %s " - "but didn't receive any", - log_sockaddr((struct sockaddr *)&la->sa)); if (la == NULL) { + if (nla->reconf != RECONF_REINIT) + fatal("king bula sez: expected REINIT"); + + if ((nla->fd = imsg_get_fd(ibuf)) == -1) + log_warnx("expected to receive fd for " + "%s but didn't receive any", + log_sockaddr((struct sockaddr *) + &la->sa)); + la = calloc(1, sizeof(struct listen_addr)); if (la == NULL) fatal(NULL); @@ -2130,9 +2133,11 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx, u_int *listener_cnt) TAILQ_INSERT_TAIL(nconf->listen_addrs, la, entry); } else { + if (nla->reconf != RECONF_KEEP) + fatal("king bula sez: expected KEEP"); la->reconf = RECONF_KEEP; - close(nla->fd); } + break; case IMSG_RECONF_DONE: if (idx != PFD_PIPE_MAIN) @@ -2156,12 +2161,6 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx, u_int *listener_cnt) !p->conf.cloned) p->conf.reconf_action = RECONF_DELETE; - /* if there are no new listeners, keep default ones */ - if (TAILQ_EMPTY(nconf->listen_addrs)) - TAILQ_FOREACH(la, conf->listen_addrs, entry) - if (la->flags & DEFAULT_LISTENER) - la->reconf = RECONF_KEEP; - /* delete old listeners */ for (la = TAILQ_FIRST(conf->listen_addrs); la != NULL; la = nla) { |