There is no reason why bgpd must be running to do a bgpctl show mrt call.
This diff moves the SHOW_MRT case up to the IRRFILTER one and also makes
the pledge() calls stricter. I see no reason why rpath or wpath are
needed and neither did benno@ remember why.

OK?
-- 
:wq Claudio

Index: bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
retrieving revision 1.205
diff -u -p -r1.205 bgpctl.c
--- bgpctl.c    12 Jul 2018 21:45:37 -0000      1.205
+++ bgpctl.c    17 Jul 2018 16:34:42 -0000
@@ -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;

Reply via email to