]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/statd.c
Work around RLIMIT_NOFILE-to-big problem
[nfs-utils.git] / utils / statd / statd.c
index 93c394f160401fa896dfece800cb2ea09d022b64..b57f71bb0091bf1bc46096e5dbb996d88cc33107 100644 (file)
@@ -18,6 +18,7 @@
 #include <rpc/rpc.h>
 #include <rpc/pmap_clnt.h>
 #include <rpcmisc.h>
+#include <sys/resource.h>
 #include <grp.h>
 #include "statd.h"
 #include "version.h"
@@ -209,6 +210,7 @@ int main (int argc, char **argv)
        int pid;
        int arg;
        int port = 0, out_port = 0;
+       struct rlimit rlim;
 
        int pipefds[2] = { -1, -1};
        char status;
@@ -320,6 +322,21 @@ int main (int argc, char **argv)
                                                   daemon mode. */
        }
 
+       if (getrlimit (RLIMIT_NOFILE, &rlim) != 0)
+               fprintf(stderr, "%s: getrlimit (RLIMIT_NOFILE) failed: %s\n",
+                               argv [0], strerror(errno));
+       else {
+               /* glibc sunrpc code dies if getdtablesize > FD_SETSIZE */
+               if (rlim.rlim_cur > FD_SETSIZE) {
+                       rlim.rlim_cur = FD_SETSIZE;
+
+                       if (setrlimit (RLIMIT_NOFILE, &rlim) != 0) {
+                               fprintf(stderr, "%s: setrlimit (RLIMIT_NOFILE) failed: %s\n",
+                                       argv [0], strerror(errno));
+                       }
+               }
+       }
+
 #ifdef SIMULATIONS
        if (argc > 1)
                /* LH - I _really_ need to update simulator... */