Patch updated. 

ok?

Index: nfsd.c
===================================================================
RCS file: /cvs/src/sbin/nfsd/nfsd.c,v
retrieving revision 1.32
diff -u -p -u -r1.32 nfsd.c
--- nfsd.c      11 Mar 2013 17:40:10 -0000      1.32
+++ nfsd.c      24 Apr 2014 23:35:06 -0000
@@ -103,13 +103,10 @@ main(int argc, char *argv[])
 {
        struct nfsd_args nfsdargs;
        struct sockaddr_in inetaddr, inetpeer;
-       fd_set *ready, *sockbits;
-       size_t fd_size;
-       int ch, connect_type_cnt, i, maxsock = 0, msgsock;
+       int ch, connect_type_cnt, i;
        int nfsdcnt = DEFNFSDCNT, on, reregister = 0, sock;
        int udpflag = 0, tcpflag = 0, tcpsock;
        const char *errstr = NULL;
-       socklen_t len;
 
        /* Start by writing to both console and log. */
        openlog("nfsd", LOG_PID | LOG_PERROR, LOG_DAEMON);
@@ -264,7 +261,6 @@ main(int argc, char *argv[])
                        syslog(LOG_ERR, "can't register tcp with portmap");
                        return (1);
                }
-               maxsock = tcpsock;
                connect_type_cnt++;
        }
 
@@ -274,33 +270,29 @@ main(int argc, char *argv[])
        setproctitle("master");
 
        /*
-        * Allocate space for the fd_set pointers and fill in sockbits
-        */
-       fd_size = howmany(maxsock + 1, NFDBITS) * sizeof(fd_mask);
-       sockbits = malloc(fd_size);
-       ready = malloc(fd_size);
-       if (sockbits == NULL || ready == NULL) {
-               syslog(LOG_ERR, "cannot allocate memory");
-               return (1);
-       }
-       memset(sockbits, 0, fd_size);
-       if (tcpflag)
-               FD_SET(tcpsock, sockbits);
-
-       /*
         * Loop forever accepting connections and passing the sockets
         * into the kernel for the mounts.
         */
        for (;;) {
-               memcpy(ready, sockbits, fd_size);
+               struct pollfd           pfd;
+               struct sockaddr_in      inetpeer;
+               int ret, msgsock, timeout;
+               socklen_t len;
+
+               pfd.fd = tcpsock;
+               pfd.events = POLLIN;
+               timeout = -1;
+
                if (connect_type_cnt > 1) {
-                       if (select(maxsock + 1,
-                           ready, NULL, NULL, NULL) < 1) {
-                               syslog(LOG_ERR, "select failed: %m");
+                       ret = poll(&pfd, 1, timeout);
+                       if (ret < 1) {
+                               syslog(LOG_ERR, "poll failed: %m");
                                return (1);
                        }
+                               
                }
-               if (tcpflag && FD_ISSET(tcpsock, ready)) {
+               
+               if (tcpflag) {
                        len = sizeof(inetpeer);
                        if ((msgsock = accept(tcpsock,
                            (struct sockaddr *)&inetpeer, &len)) < 0) {




On Thu, 24 Apr 2014 19:27:29 -0400
Peter Malone <[email protected]> wrote:

> The more I think about this..... if we want to continue the select() 
> NULL functionality then timeout should be a negative value for poll(), 
> as NULL is unrecognized and zero is a zero-length timeout.
> 
> 
> On 04/24/14 18:08, Peter Malone wrote:
> > As promised. I cleaned up some of the code as well.
> >
> > One item of note - select() took a NULL value for timeout. I did not want 
> > to do this with poll(), so I defaulted with 10 instead. We should probably 
> > discuss this. I didn't even try to compile poll() with NULL - I don't think 
> > it's a good idea and I'm sure the compiler wouldn't be happy. Thoughts?
> >
> >
> > Index: nfsd.c
> > ===================================================================
> > RCS file: /cvs/src/sbin/nfsd/nfsd.c,v
> > retrieving revision 1.32
> > diff -u -p -u -r1.32 nfsd.c
> > --- nfsd.c  11 Mar 2013 17:40:10 -0000      1.32
> > +++ nfsd.c  24 Apr 2014 22:00:20 -0000
> > @@ -103,13 +103,10 @@ main(int argc, char *argv[])
> >   {
> >     struct nfsd_args nfsdargs;
> >     struct sockaddr_in inetaddr, inetpeer;
> > -   fd_set *ready, *sockbits;
> > -   size_t fd_size;
> > -   int ch, connect_type_cnt, i, maxsock = 0, msgsock;
> > +   int ch, connect_type_cnt, i;
> >     int nfsdcnt = DEFNFSDCNT, on, reregister = 0, sock;
> >     int udpflag = 0, tcpflag = 0, tcpsock;
> >     const char *errstr = NULL;
> > -   socklen_t len;
> >   
> >     /* Start by writing to both console and log. */
> >     openlog("nfsd", LOG_PID | LOG_PERROR, LOG_DAEMON);
> > @@ -264,7 +261,6 @@ main(int argc, char *argv[])
> >                     syslog(LOG_ERR, "can't register tcp with portmap");
> >                     return (1);
> >             }
> > -           maxsock = tcpsock;
> >             connect_type_cnt++;
> >     }
> >   
> > @@ -274,33 +270,29 @@ main(int argc, char *argv[])
> >     setproctitle("master");
> >   
> >     /*
> > -    * Allocate space for the fd_set pointers and fill in sockbits
> > -    */
> > -   fd_size = howmany(maxsock + 1, NFDBITS) * sizeof(fd_mask);
> > -   sockbits = malloc(fd_size);
> > -   ready = malloc(fd_size);
> > -   if (sockbits == NULL || ready == NULL) {
> > -           syslog(LOG_ERR, "cannot allocate memory");
> > -           return (1);
> > -   }
> > -   memset(sockbits, 0, fd_size);
> > -   if (tcpflag)
> > -           FD_SET(tcpsock, sockbits);
> > -
> > -   /*
> >      * Loop forever accepting connections and passing the sockets
> >      * into the kernel for the mounts.
> >      */
> >     for (;;) {
> > -           memcpy(ready, sockbits, fd_size);
> > +           struct pollfd           pfd;
> > +           struct sockaddr_in      inetpeer;
> > +           int ret, msgsock, timeout;
> > +           socklen_t len;
> > +
> > +           pfd.fd = tcpsock;
> > +           pfd.events = POLLIN;
> > +           timeout = 10;
> > +
> >             if (connect_type_cnt > 1) {
> > -                   if (select(maxsock + 1,
> > -                       ready, NULL, NULL, NULL) < 1) {
> > -                           syslog(LOG_ERR, "select failed: %m");
> > +                   ret = poll(&pfd, 1, timeout);
> > +                   if (ret < 1) {
> > +                           syslog(LOG_ERR, "poll failed: %m");
> >                             return (1);
> >                     }
> > +                           
> >             }
> > -           if (tcpflag && FD_ISSET(tcpsock, ready)) {
> > +           
> > +           if (tcpflag) {
> >                     len = sizeof(inetpeer);
> >                     if ((msgsock = accept(tcpsock,
> >                         (struct sockaddr *)&inetpeer, &len)) < 0) {
> >
> >
> >
> >
> >
> >
> >
> > On Wed, 23 Apr 2014 21:56:56 -0400
> > Peter Malone <[email protected]> wrote:
> >
> >> Sounds good. I'll work on that tomorrow afternoon/evening.
> >>
> >>
> >> On 04/23/14 21:55, Ted Unangst wrote:
> >>> On Wed, Apr 23, 2014 at 21:38, Peter Malone wrote:
> >>>> Hi,
> >>>>
> >>>> Similar to the others. malloc & memset replacement with calloc, this time
> >>>> in sbin/nfsd/nfsd.c
> >>>>          fd_size = howmany(maxsock + 1, NFDBITS) * sizeof(fd_mask);
> >>>> -        sockbits = malloc(fd_size);
> >>>> +        sockbits = calloc(1, fd_size);
> >>>>          ready = malloc(fd_size);
> >>> As with ping6, I think this is better converted to poll.
> >
> 


-- 
Peter Malone <[email protected]>

Reply via email to