On Fri, Mar 26, 2021 at 10:37:27AM +0100, Theo Buehler wrote: > On Fri, Mar 26, 2021 at 09:52:04AM +0100, Claudio Jeker wrote: > > This diff replaces mostly the same code in the poll loop with a for loop. > > It also gives a hint which process closed a connection. > > This is much nicer. Would the msgbuf_write() errors not benefit from the > same hint?
Was thinking the same, I may add them there too. > ok tb Thanks > > > > -- > > :wq Claudio > > > > Index: main.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v > > retrieving revision 1.123 > > diff -u -p -r1.123 main.c > > --- main.c 25 Mar 2021 12:18:45 -0000 1.123 > > +++ main.c 26 Mar 2021 08:48:47 -0000 > > @@ -837,6 +837,8 @@ suicide(int sig __attribute__((unused))) > > > > } > > > > +#define NPFD 3 > > + > > int > > main(int argc, char *argv[]) > > { > > @@ -845,7 +847,8 @@ main(int argc, char *argv[]) > > size_t i, id, outsz = 0, talsz = 0; > > pid_t procpid, rsyncpid, httppid; > > int fd[2]; > > - struct pollfd pfd[3]; > > + struct pollfd pfd[NPFD]; > > + struct msgbuf *queues[NPFD]; > > struct roa **out = NULL; > > struct repo *rp; > > char *rsync_prog = "openrsync"; > > @@ -1079,8 +1082,11 @@ main(int argc, char *argv[]) > > */ > > > > pfd[0].fd = rsync; > > + queues[0] = &rsyncq; > > pfd[1].fd = proc; > > + queues[1] = &procq; > > pfd[2].fd = http; > > + queues[2] = &httpq; > > > > /* > > * Prime the process with our TAL file. > > @@ -1096,53 +1102,30 @@ main(int argc, char *argv[]) > > err(1, "fchdir"); > > > > while (entity_queue > 0 && !killme) { > > - pfd[0].events = POLLIN; > > - if (rsyncq.queued) > > - pfd[0].events |= POLLOUT; > > - pfd[1].events = POLLIN; > > - if (procq.queued) > > - pfd[1].events |= POLLOUT; > > - pfd[2].events = POLLIN; > > - if (httpq.queued) > > - pfd[2].events |= POLLOUT; > > + for (i = 0; i < NPFD; i++) { > > + pfd[i].events = POLLIN; > > + if (queues[i]->queued) > > + pfd[i].events |= POLLOUT; > > + } > > > > - if ((c = poll(pfd, 3, INFTIM)) == -1) { > > + if ((c = poll(pfd, NPFD, INFTIM)) == -1) { > > if (errno == EINTR) > > continue; > > err(1, "poll"); > > } > > > > - if ((pfd[0].revents & (POLLERR|POLLNVAL)) || > > - (pfd[1].revents & (POLLERR|POLLNVAL)) || > > - (pfd[2].revents & (POLLERR|POLLNVAL))) > > - errx(1, "poll: bad fd"); > > - if ((pfd[0].revents & POLLHUP) || > > - (pfd[1].revents & POLLHUP) || > > - (pfd[2].revents & POLLHUP)) > > - errx(1, "poll: hangup"); > > - > > - if (pfd[0].revents & POLLOUT) { > > - switch (msgbuf_write(&rsyncq)) { > > - case 0: > > - errx(1, "write: connection closed"); > > - case -1: > > - err(1, "write"); > > - } > > - } > > - if (pfd[1].revents & POLLOUT) { > > - switch (msgbuf_write(&procq)) { > > - case 0: > > - errx(1, "write: connection closed"); > > - case -1: > > - err(1, "write"); > > - } > > - } > > - if (pfd[2].revents & POLLOUT) { > > - switch (msgbuf_write(&httpq)) { > > - case 0: > > - errx(1, "write: connection closed"); > > - case -1: > > - err(1, "write"); > > + for (i = 0; i < NPFD; i++) { > > + if (pfd[i].revents & (POLLERR|POLLNVAL)) > > + errx(1, "poll[%zu]: bad fd", i); > > + if (pfd[i].revents & POLLHUP) > > + errx(1, "poll[%zu]: hangup", i); > > + if (pfd[i].revents & POLLOUT) { > > + switch (msgbuf_write(queues[i])) { > > + case 0: > > + errx(1, "write: connection closed"); > > + case -1: > > + err(1, "write"); > > + } > > } > > } > > > > > -- :wq Claudio