summaryrefslogtreecommitdiff
path: root/usr.sbin/bgpctl/bgpctl.c
diff options
context:
space:
mode:
authorClaudio Jeker <claudio@cvs.openbsd.org>2018-07-20 12:42:46 +0000
committerClaudio Jeker <claudio@cvs.openbsd.org>2018-07-20 12:42:46 +0000
commit87b4df9b9a9b7d5f3978aca46beb406395641e6d (patch)
treedecc55b7eb3e6c33194cc618a5823297070082d3 /usr.sbin/bgpctl/bgpctl.c
parentdf7262c318056452c2a8a985b15116f8e2d2af62 (diff)
There is no need to have bgpd running when running bgpctl show mrt.
The first thing the code actually does is closing the socket. Instead move the code up to where currently the IRR filter code is. Additionally change the late pledges to just stdio since nothing after that needs rpath or wpath. OK benno@
Diffstat (limited to 'usr.sbin/bgpctl/bgpctl.c')
-rw-r--r--usr.sbin/bgpctl/bgpctl.c71
1 files changed, 39 insertions, 32 deletions
diff --git a/usr.sbin/bgpctl/bgpctl.c b/usr.sbin/bgpctl/bgpctl.c
index ee3594b9133..17703be446e 100644
--- a/usr.sbin/bgpctl/bgpctl.c
+++ b/usr.sbin/bgpctl/bgpctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpctl.c,v 1.205 2018/07/12 21:45:37 benno Exp $ */
+/* $OpenBSD: bgpctl.c,v 1.206 2018/07/20 12:42:45 claudio Exp $ */
/*
* Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
@@ -157,19 +157,50 @@ main(int argc, char *argv[])
if ((res = parse(argc, argv)) == NULL)
exit(1);
- if (res->action == IRRFILTER) {
+ memcpy(&neighbor.addr, &res->peeraddr, sizeof(neighbor.addr));
+ strlcpy(neighbor.descr, res->peerdesc, sizeof(neighbor.descr));
+ strlcpy(neighbor.shutcomm, res->shutcomm, sizeof(neighbor.shutcomm));
+
+ switch (res->action) {
+ case IRRFILTER:
if (!(res->flags & (F_IPV4|F_IPV6)))
res->flags |= (F_IPV4|F_IPV6);
irr_main(res->as.as, res->flags, res->irr_outdir);
+ break;
+ case SHOW_MRT:
+ if (pledge("stdio", NULL) == -1)
+ err(1, "pledge");
+
+ bzero(&ribreq, sizeof(ribreq));
+ if (res->as.type != AS_NONE)
+ ribreq.as = res->as;
+ if (res->addr.aid) {
+ ribreq.prefix = res->addr;
+ ribreq.prefixlen = res->prefixlen;
+ }
+ if (res->community.as != COMMUNITY_UNSET &&
+ res->community.type != COMMUNITY_UNSET)
+ ribreq.community = res->community;
+ if (res->large_community.as != COMMUNITY_UNSET &&
+ res->large_community.ld1 != COMMUNITY_UNSET &&
+ res->large_community.ld2 != COMMUNITY_UNSET)
+ ribreq.large_community = res->large_community;
+ /* XXX extended communities missing? */
+ ribreq.neighbor = neighbor;
+ ribreq.aid = res->aid;
+ ribreq.flags = res->flags;
+ show_mrt.arg = &ribreq;
+ if (!(res->flags & F_CTL_DETAIL))
+ show_rib_summary_head();
+ mrt_parse(res->mrtfd, &show_mrt, 1);
+ exit(0);
+ default:
+ break;
}
if (pledge("stdio rpath wpath unix", NULL) == -1)
err(1, "pledge");
- memcpy(&neighbor.addr, &res->peeraddr, sizeof(neighbor.addr));
- strlcpy(neighbor.descr, res->peerdesc, sizeof(neighbor.descr));
- strlcpy(neighbor.shutcomm, res->shutcomm, sizeof(neighbor.shutcomm));
-
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
err(1, "control_init: socket");
@@ -181,7 +212,7 @@ main(int argc, char *argv[])
if (connect(fd, (struct sockaddr *)&sun, sizeof(sun)) == -1)
err(1, "connect: %s", sockname);
- if (pledge("stdio rpath wpath", NULL) == -1)
+ if (pledge("stdio", NULL) == -1)
err(1, "pledge");
if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL)
@@ -192,6 +223,7 @@ main(int argc, char *argv[])
switch (res->action) {
case NONE:
case IRRFILTER:
+ case SHOW_MRT:
usage();
/* NOTREACHED */
case SHOW:
@@ -281,31 +313,6 @@ main(int argc, char *argv[])
if (!(res->flags & F_CTL_DETAIL))
show_rib_summary_head();
break;
- case SHOW_MRT:
- close(fd);
- bzero(&ribreq, sizeof(ribreq));
- if (res->as.type != AS_NONE)
- ribreq.as = res->as;
- if (res->addr.aid) {
- ribreq.prefix = res->addr;
- ribreq.prefixlen = res->prefixlen;
- }
- if (res->community.as != COMMUNITY_UNSET &&
- res->community.type != COMMUNITY_UNSET)
- ribreq.community = res->community;
- if (res->large_community.as != COMMUNITY_UNSET &&
- res->large_community.ld1 != COMMUNITY_UNSET &&
- res->large_community.ld2 != COMMUNITY_UNSET)
- ribreq.large_community = res->large_community;
- /* XXX extended communities missing? */
- ribreq.neighbor = neighbor;
- ribreq.aid = res->aid;
- ribreq.flags = res->flags;
- show_mrt.arg = &ribreq;
- if (!(res->flags & F_CTL_DETAIL))
- show_rib_summary_head();
- mrt_parse(res->mrtfd, &show_mrt, 1);
- exit(0);
case SHOW_RIB_MEM:
imsg_compose(ibuf, IMSG_CTL_SHOW_RIB_MEM, 0, 0, -1, NULL, 0);
break;