Two comments inline, otherwise OK. - todd
On Thu, 09 Oct 2014 14:52:50 +1000, David Gwynne wrote: > Index: net/rcmd.c > =================================================================== > RCS file: /cvs/src/lib/libc/net/rcmd.c,v > retrieving revision 1.56 > diff -u -p -r1.56 rcmd.c > --- net/rcmd.c 18 Nov 2009 07:43:22 -0000 1.56 > +++ net/rcmd.c 9 Oct 2014 04:49:30 -0000 > @@ -46,6 +46,7 @@ > #include <string.h> > #include <syslog.h> > #include <stdlib.h> > +#include <poll.h> > > int > rcmd(char **ahost, int rport, const char *locuser, const char *remuser, > @@ -63,7 +64,6 @@ rcmd_af(char **ahost, int porta, const c > struct addrinfo hints, *res, *r; > int error; > struct sockaddr_storage from; > - fd_set *readsp = NULL; > sigset_t oldmask, mask; > pid_t pid; > int s, lport, timo; > @@ -188,18 +188,14 @@ rcmd_af(char **ahost, int porta, const c > write(s, "", 1); > lport = 0; > } else { > + struct pollfd pfd[2]; > char num[8]; > int s2 = rresvport_af(&lport, af), s3; > socklen_t len = sizeof(from); > - int fdssize = howmany(MAX(s, s2)+1, NFDBITS) * sizeof(fd_mask); > > if (s2 < 0) > goto bad; > - readsp = (fd_set *)malloc(fdssize); > - if (readsp == NULL) { > - close(s2); > - goto bad; > - } > + > listen(s2, 1); > (void)snprintf(num, sizeof(num), "%d", lport); > if (write(s, num, strlen(num)+1) != strlen(num)+1) { > @@ -210,12 +206,15 @@ rcmd_af(char **ahost, int porta, const c > goto bad; > } > again: > - bzero(readsp, fdssize); > - FD_SET(s, readsp); > - FD_SET(s2, readsp); > + memset(pfd, 0, sizeof(pfd)); This memset is not needed, poll(2) will zero revents as needed. Unused poll structs just need to have their fd set to -1 (not 0). > + pfd[0].fd = s; > + pfd[0].events = POLLIN; > + pfd[1].fd = s2; > + pfd[1].events = POLLIN; > + > errno = 0; > - if (select(MAX(s, s2) + 1, readsp, 0, 0, 0) < 1 || > - !FD_ISSET(s2, readsp)) { > + if (poll(pfd, 2, INFTIM) < 1 || > + (pfd[1].revents & POLLIN) == 0) { You need to check for POLLIN|POLLHUP for this to be equivalent to the select version. > if (errno != 0) > (void)fprintf(stderr, > "rcmd: select (setting up stderr): %s\n", > @@ -288,14 +287,11 @@ again: > goto bad2; > } > sigprocmask(SIG_SETMASK, &oldmask, NULL); > - free(readsp); > return (s); > bad2: > if (lport) > (void)close(*fd2p); > bad: > - if (readsp) > - free(readsp); > (void)close(s); > sigprocmask(SIG_SETMASK, &oldmask, NULL); > return (-1); >