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?

ok tb

> 
> -- 
> :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");
> +                             }
>                       }
>               }
>  
> 

Reply via email to