select(2) to poll(2) conversion for mountd(8)

2014-10-20 Thread Dimitris Papastamos
Hi everyone,

I've tested this on my home setup and it seems to work.

Let me know if anything else needs working.

Cheers,
Dimitris

===
RCS file: /cvs/src/sbin/mountd/mountd.c,v
retrieving revision 1.76
diff -u -p -r1.76 mountd.c
--- mountd.c24 Aug 2014 14:45:00 -  1.76
+++ mountd.c20 Oct 2014 14:50:27 -
@@ -54,6 +54,7 @@
 #include grp.h
 #include netdb.h
 #include netgroup.h
+#include poll.h
 #include pwd.h
 #include signal.h
 #include stdio.h
@@ -289,10 +290,9 @@ main(int argc, char *argv[])
 void
 mountd_svc_run(void)
 {
-   fd_set *fds = NULL;
-   int fds_size = 0;
-   extern fd_set *__svc_fdset;
-   extern int __svc_fdsetsize;
+   struct pollfd *pfd = NULL, *newp;
+   nfds_t saved_max_pollfd = 0;
+   int nready;
 
for (;;) {
if (gothup) {
@@ -305,33 +305,30 @@ mountd_svc_run(void)
(caddr_t)0, umntall_each);
exit(0);
}
-   if (__svc_fdset) {
-   int bytes = howmany(__svc_fdsetsize, NFDBITS) *
-   sizeof(fd_mask);
-   if (fds_size != __svc_fdsetsize) {
-   if (fds)
-   free(fds);
-   fds = (fd_set *)malloc(bytes);  /* XXX */
-   fds_size = __svc_fdsetsize;
+   if (svc_max_pollfd  saved_max_pollfd) {
+   newp = reallocarray(pfd, svc_max_pollfd, sizeof(*pfd));
+   if (!newp) {
+   free(pfd);
+   perror(mountd_svc_run: - realloc failed);
+   return;
}
-   memcpy(fds, __svc_fdset, bytes);
-   } else {
-   if (fds)
-   free(fds);
-   fds = NULL;
+   pfd = newp;
+   saved_max_pollfd = svc_max_pollfd;
}
-   switch (select(svc_maxfd+1, fds, 0, 0, (struct timeval *)0)) {
+   memcpy(pfd, svc_pollfd, svc_max_pollfd * sizeof(*pfd));
+
+   nready = poll(pfd, svc_max_pollfd, INFTIM);
+   switch (nready) {
case -1:
if (errno == EINTR)
break;
-   perror(mountd_svc_run: - select failed);
-   if (fds)
-   free(fds);
+   perror(mountd_svc_run: - poll failed);
+   free(pfd);
return;
case 0:
break;
default:
-   svc_getreqset2(fds, svc_maxfd+1);
+   svc_getreq_poll(pfd, nready);
break;
}
}



Re: select(2) to poll(2) conversion for mountd(8)

2014-10-20 Thread Todd C. Miller
This looks correct and matches what svc_run() does.

 - todd