svc.c (svc_getreq, svc_getreqset): Avoid using internal, private
authorTheodore Tso <tytso@mit.edu>
Wed, 14 Apr 1999 16:04:09 +0000 (16:04 +0000)
committerTheodore Tso <tytso@mit.edu>
Wed, 14 Apr 1999 16:04:09 +0000 (16:04 +0000)
fd_set structure elements (Needed for Linux/glibc 2.1)

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@11360 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/rpc/ChangeLog
src/lib/rpc/svc.c

index 337bd03c47201f650d78078f81770c5968bdbda5..2db24107cfe0ff799b534cfc44fd3a89722110ab 100644 (file)
@@ -1,3 +1,8 @@
+1999-04-14    <tytso@rsts-11.mit.edu>
+
+       * svc.c (svc_getreq, svc_getreqset): Avoid using internal, private
+               fd_set structure elements (Needed for Linux/glibc 2.1)
+
 Thu Apr  1 19:11:50 1999  Tom Yu  <tlyu@mit.edu>
 
        * rpc_commondata.c: Add initializers to prevent lossage on systems
index b5bc708a08b9d50d69db2b20c5a4562c1f58fc0d..725570b0c346c05b6282855422a6fda2c7d95f1b 100644 (file)
@@ -50,6 +50,7 @@ extern int errno;
 
 #ifdef FD_SETSIZE
 static SVCXPRT **xports;
+static int max_xport = 0;
 #else
 #define NOFILE 32
 
@@ -93,6 +94,8 @@ xprt_register(xprt)
        if (sock < _gssrpc_rpc_dtablesize()) {
                xports[sock] = xprt;
                FD_SET(sock, &svc_fdset);
+               if (max_xport < sock)
+                       max_xport = sock;
        }
 #else
        if (sock < NOFILE) {
@@ -116,6 +119,10 @@ xprt_unregister(xprt)
        if ((sock < _gssrpc_rpc_dtablesize()) && (xports[sock] == xprt)) {
                xports[sock] = (SVCXPRT *)0;
                FD_CLR(sock, &svc_fdset);
+               if (max_xport = sock) {
+                       while ((max_xport > 0) && xports[max_xport] == 0)
+                               max_xport--;
+               }
        }
 #else
        if ((sock < NOFILE) && (xports[sock] == xprt)) {
@@ -371,9 +378,14 @@ svc_getreq(rdfds)
 {
 #ifdef FD_SETSIZE
        fd_set readfds;
+       int     i, mask;
 
        FD_ZERO(&readfds);
-       readfds.fds_bits[0] = rdfds;
+       for (i=0, mask=1; rdfds; i++, mask <<=1) {
+               if (rdfds & mask)
+                       FD_SET(i, &readfds);
+               rdfds &= ~mask;
+       }
        svc_getreqset(&readfds);
 #else
        int readfds = rdfds & svc_fds;
@@ -402,7 +414,6 @@ svc_getreqset(readfds)
        rpc_u_int32 mask;
        int bit;
        rpc_u_int32 *maskp;
-       register int setsize;
        register int sock;
         bool_t no_dispatch;
 
@@ -412,11 +423,8 @@ svc_getreqset(readfds)
        r.rq_clntcred = &(cred_area[2*MAX_AUTH_BYTES]);
 
 #ifdef FD_SETSIZE
-       setsize = _gssrpc_rpc_dtablesize();     
-
-       maskp = (rpc_u_int32 *)readfds->fds_bits;
-       for (sock = 0; sock < setsize; sock += NFDBITS) {
-           for (mask = *maskp++; bit = ffs(mask); mask ^= (1 << (bit - 1))) {
+       for (sock = 0; sock <= max_xport; sock++) {
+           if (FD_ISSET(sock, readfds)) {
                /* sock has input waiting */
                xprt = xports[sock + bit - 1];
 #else