bgpd will get a new process for RTR handling. Because of this it makes sense to cleanup the startup code a bit and not use flags to indicate which process to run but instead use the enum bgpd_process. Additionally change the PFD_PIPE_ROUTE to PFD_PIPE_RDE. The latter is less confusing since there is also PFD_SOCK_ROUTE.
OK? -- :wq Claudio Index: bgpd.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v retrieving revision 1.232 diff -u -p -r1.232 bgpd.c --- bgpd.c 30 Dec 2020 07:00:54 -0000 1.232 +++ bgpd.c 4 Jan 2021 16:00:30 -0000 @@ -90,7 +90,7 @@ usage(void) } #define PFD_PIPE_SESSION 0 -#define PFD_PIPE_ROUTE 1 +#define PFD_PIPE_RDE 1 #define PFD_SOCK_ROUTE 2 #define PFD_SOCK_PFKEY 3 #define POLL_MAX 4 @@ -102,6 +102,7 @@ int main(int argc, char *argv[]) { struct bgpd_config *conf; + enum bgpd_process proc = PROC_MAIN; struct rde_rib *rr; struct peer *p; struct pollfd pfd[POLL_MAX]; @@ -110,7 +111,6 @@ main(int argc, char *argv[]) char *conffile; char *saved_argv0; int debug = 0; - int rflag = 0, sflag = 0; int rfd, keyfd; int ch, status; int pipe_m2s[2]; @@ -151,10 +151,10 @@ main(int argc, char *argv[]) cmd_opts |= BGPD_OPT_VERBOSE; break; case 'R': - rflag = 1; + proc = PROC_RDE; break; case 'S': - sflag = 1; + proc = PROC_SE; break; default: usage(); @@ -164,7 +164,7 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; - if (argc > 0 || (sflag && rflag)) + if (argc > 0) usage(); if (cmd_opts & BGPD_OPT_NOACTION) { @@ -184,10 +184,16 @@ main(int argc, char *argv[]) exit(0); } - if (rflag) + switch (proc) { + case PROC_MAIN: + break; + case PROC_RDE: rde_main(debug, cmd_opts & BGPD_OPT_VERBOSE); - else if (sflag) + /* NOTREACHED */ + case PROC_SE: session_main(debug, cmd_opts & BGPD_OPT_VERBOSE); + /* NOTREACHED */ + } if (geteuid()) errx(1, "need root privileges"); @@ -278,7 +284,7 @@ BROKEN if (pledge("stdio rpath wpath cpa pfd[PFD_SOCK_PFKEY].events = POLLIN; set_pollfd(&pfd[PFD_PIPE_SESSION], ibuf_se); - set_pollfd(&pfd[PFD_PIPE_ROUTE], ibuf_rde); + set_pollfd(&pfd[PFD_PIPE_RDE], ibuf_rde); if (timeout < 0 || timeout > MAX_TIMEOUT) timeout = MAX_TIMEOUT; @@ -300,14 +306,14 @@ BROKEN if (pledge("stdio rpath wpath cpa quit = 1; } - if (handle_pollfd(&pfd[PFD_PIPE_ROUTE], ibuf_rde) == -1) { + if (handle_pollfd(&pfd[PFD_PIPE_RDE], ibuf_rde) == -1) { log_warnx("main: Lost connection to RDE"); msgbuf_clear(&ibuf_rde->w); free(ibuf_rde); ibuf_rde = NULL; quit = 1; } else { - if (dispatch_imsg(ibuf_rde, PFD_PIPE_ROUTE, conf) == + if (dispatch_imsg(ibuf_rde, PFD_PIPE_RDE, conf) == -1) quit = 1; } @@ -713,7 +719,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int switch (imsg.hdr.type) { case IMSG_KROUTE_CHANGE: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("route request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(struct kroute_full)) @@ -723,7 +729,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int rv = -1; break; case IMSG_KROUTE_DELETE: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("route request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(struct kroute_full)) @@ -733,7 +739,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int rv = -1; break; case IMSG_KROUTE_FLUSH: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("route request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE) log_warnx("wrong imsg len"); @@ -741,7 +747,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int rv = -1; break; case IMSG_NEXTHOP_ADD: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("nexthop request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(struct bgpd_addr)) @@ -751,7 +757,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int rv = -1; break; case IMSG_NEXTHOP_REMOVE: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("nexthop request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(struct bgpd_addr)) @@ -761,7 +767,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int conf); break; case IMSG_PFTABLE_ADD: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("pftable request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE + @@ -771,7 +777,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int rv = -1; break; case IMSG_PFTABLE_REMOVE: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("pftable request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE + @@ -781,7 +787,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int rv = -1; break; case IMSG_PFTABLE_COMMIT: - if (idx != PFD_PIPE_ROUTE) + if (idx != PFD_PIPE_RDE) log_warnx("pftable request not from RDE"); else if (imsg.hdr.len != IMSG_HEADER_SIZE) log_warnx("wrong imsg len");