diff --git a/src/acconfig.h b/src/acconfig.h
index 2101e23a69c3ecc5037fbb7859b379d198618d83..dba3f89b126c86e19cba0b979537d9e2f351523c 100644
--- a/src/acconfig.h
+++ b/src/acconfig.h
@@ -391,9 +391,6 @@
 /* Assembler prefix for general purpose registers */
 #undef PIKE_CPU_REG_PREFIX
 
-/* Number of possible filedesriptors */
-#define MAX_OPEN_FILEDESCRIPTORS 1024
-
 /* define this if #include <time.h> provides an external int timezone */
 #undef HAVE_EXTERNAL_TIMEZONE
 
diff --git a/src/configure.in b/src/configure.in
index 053b477c46e8fe16aa2153e1ac1ea2f7b2840ced..8e91694d68f83e5ed7a38cfadf23dea48bf68723 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -20,7 +20,6 @@ If this does not work, please use an absolute path to the configure script.])
 esac
 
 # Check that we can write to the source directory.
-sleep 1
 if touch "$srcdir/configure~"; then
   # Check that the system time is reasonably correct.
   if test `cd "$srcdir" && ls -1t configure configure~ | head -n 1` = "configure"; then
@@ -6177,81 +6176,6 @@ else
 fi
 
 ########################################################################
-
-AC_MSG_CHECKING(available file descriptors)
-AC_CACHE_VAL(pike_cv_max_open_fd,
-[
-  if test "x$enable_binary" = "xno"; then
-    pike_cv_max_open_fd=256
-  else
-    AC_TRY_RUN([
-#include <stdio.h>
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_RESOURCE_H
-#include <sys/resource.h>
-#endif
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-
-#ifndef MAX_FD
-#define MAX_FD 65536
-#endif
-
-int main()
-{
-  FILE *f;
-  long limit;
-
-#if !defined(RLIMIT_NOFILE) && defined(RLIMIT_OFILE)
-#define RLIMIT_NOFILE RLIMIT_OFILE
-#endif
-
-#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE)
-  struct rlimit lim;
-
-  if(getrlimit(RLIMIT_NOFILE,&lim))
-  {
-    limit = MAX_FD;
-  }else{
-    if(lim.rlim_max == RLIM_INFINITY)
-    {
-      limit = 1024 * 1024 * 2; /* Noone needs more :-) */
-      
-#if defined(OPEN_MAX)
-      /* On Darwin we can find a reasonable limit in OPEN_MAX which limits.h
-         will include from sys/syslimits.h. */
-      limit = (OPEN_MAX < limit) ? OPEN_MAX : limit;
-#endif	 
-    }else{
-      limit=lim.rlim_max;
-      if(limit > 1024 * 1024 * 2) limit= 1024 * 1024 * 2;
-    }
-  }
-#else
-  limit = MAX_FD;
-#endif
-
-  f=fopen("conftest.out.2","w");
-  fprintf(f,"%ld\n",(long)limit);
-  fclose(f);
-
-  return 0;
-}
-    ],
-    pike_cv_max_open_fd=`cat conftest.out.2`
-    ,
-    pike_cv_max_open_fd=256
-    ,
-    pike_cv_max_open_fd=256
-  )
-  fi
-])
-AC_MSG_RESULT($pike_cv_max_open_fd)
-AC_DEFINE_UNQUOTED(MAX_OPEN_FILEDESCRIPTORS,$pike_cv_max_open_fd)
-
 AC_MSG_CHECKING(full availability of struct rusage members)
 AC_CACHE_VAL(pike_cv_func_getrusage_full,
 [
diff --git a/src/fdlib.c b/src/fdlib.c
index 8952566805b2991dbeb18f2d2222ae7a7934c518..65ecfa95aa8c2a62a78a2f9ab7b25be63c87474f 100644
--- a/src/fdlib.c
+++ b/src/fdlib.c
@@ -27,8 +27,8 @@
 
 static MUTEX_T fd_mutex;
 
-HANDLE da_handle[MAX_OPEN_FILEDESCRIPTORS];
-int fd_type[MAX_OPEN_FILEDESCRIPTORS];
+HANDLE da_handle[FD_SETSIZE];
+int fd_type[FD_SETSIZE];
 int first_free_handle;
 
 /* #define FD_DEBUG */
@@ -123,7 +123,7 @@ PMOD_EXPORT char *debug_fd_info(int fd)
   if(fd<0)
     return "BAD";
 
-  if(fd > MAX_OPEN_FILEDESCRIPTORS)
+  if(fd > FD_SETSIZE)
     return "OUT OF RANGE";
 
   switch(fd_type[fd])
@@ -176,7 +176,7 @@ void fd_init(void)
   da_handle[2] = GetStdHandle(STD_ERROR_HANDLE);
 
   first_free_handle=3;
-  for(e=3;e<MAX_OPEN_FILEDESCRIPTORS-1;e++)
+  for(e=3;e<FD_SETSIZE-1;e++)
     fd_type[e]=e+1;
   fd_type[e]=FD_NO_MORE_FREE;
   mt_unlock(&fd_mutex);
diff --git a/src/fdlib.h b/src/fdlib.h
index d3775fffa5fbed1e803ff96fffffb80c3708e613..200375862c8415209db23f7225220258d6388aff 100644
--- a/src/fdlib.h
+++ b/src/fdlib.h
@@ -57,7 +57,10 @@
 #define SOCKET_CAPABILITIES (fd_BIDIRECTIONAL | fd_CAN_NONBLOCK | fd_CAN_SHUTDOWN)
 
 #ifndef FD_SETSIZE
-#define FD_SETSIZE MAX_OPEN_FILEDESCRIPTORS
+/*
+ * in reality: almost unlimited actually.
+ */
+#define FD_SETSIZE 65536
 #endif
 
 #include <winbase.h>
@@ -203,7 +206,7 @@ PMOD_EXPORT const char *debug_fd_inet_ntop(int af, const void *addr,
 
 struct my_fd_set_s
 {
-  char bits[MAX_OPEN_FILEDESCRIPTORS/8];
+  char bits[FD_SETSIZE/8];
 };
 
 typedef struct my_fd_set_s my_fd_set;
@@ -218,29 +221,29 @@ typedef struct my_fd_set_s my_fd_set;
 #define my_FD_ISSET(FD,S) ((S)->bits[(FD)>>3]&(1<<(FD&7)))
 #define my_FD_ZERO(S) memset(& (S)->bits, 0, sizeof(my_fd_set))
 
-#define fd_copy_my_fd_set_to_fd_set(TO,FROM,max) do {			\
-   int e_,d_,max_=MINIMUM(MAX_OPEN_FILEDESCRIPTORS>>3,(max+7)>>3);	\
-   (TO)->fd_count=0;							\
-   for(e_=0;e_<max_;e_++)						\
-   {									\
-     int b_=(FROM)->bits[e_];						\
-     if(b_)								\
-     {									\
-       for(d_=0;d_<8;d_++)						\
-       {								\
-         if(b_ & (1<<d_))						\
-         {								\
-           int fd_=(e_<<3)+d_;						\
-           fd_check_fd(fd_);						\
-           (TO)->fd_array[(TO)->fd_count++]=(SOCKET)da_handle[fd_];	\
-         }								\
-       }								\
-     }									\
-   }									\
-}while(0)
-
-extern HANDLE da_handle[MAX_OPEN_FILEDESCRIPTORS];
-extern int fd_type[MAX_OPEN_FILEDESCRIPTORS];
+#define fd_copy_my_fd_set_to_fd_set(TO,FROM,max) do {                   \
+    int e_,d_,max_=MINIMUM(FD_SETSIZE>>3,(max+7)>>3);                   \
+    (TO)->fd_count=0;							\
+    for(e_=0;e_<max_;e_++)						\
+    {									\
+      int b_=(FROM)->bits[e_];						\
+      if(b_)								\
+      {									\
+        for(d_=0;d_<8;d_++)						\
+        {								\
+          if(b_ & (1<<d_))						\
+          {								\
+            int fd_=(e_<<3)+d_;						\
+            fd_check_fd(fd_);						\
+            (TO)->fd_array[(TO)->fd_count++]=(SOCKET)da_handle[fd_];	\
+          }								\
+        }								\
+      }									\
+    }									\
+  }while(0)
+
+extern HANDLE da_handle[FD_SETSIZE];
+extern int fd_type[FD_SETSIZE];
 
 #define fd_FD_CLR(X,Y) FD_CLR((SOCKET)da_handle[X],Y)
 #define fd_FD_SET(X,Y) \
diff --git a/src/global.h b/src/global.h
index a700c7f4d6b141ffc09e1c85565f5b0ba8684b93..7e349ec5eea0a0cdb961dfd0e95f79ff3201b200 100644
--- a/src/global.h
+++ b/src/global.h
@@ -283,12 +283,6 @@ void *alloca();
 # endif
 #endif
 
-#ifdef __NT__
-/* We are running NT */
-#undef FD_SETSIZE
-#define FD_SETSIZE MAX_OPEN_FILEDESCRIPTORS
-#endif
-
 #ifdef HAVE_DEVICES_TIMER_H
 /* On AmigaOS, struct timeval is defined in a variety of places
    and a variety of ways.  Making sure <devices/timer.h> is included
diff --git a/src/modules/_Stdio/file.c b/src/modules/_Stdio/file.c
index 3f0e4abbe5cf2af20db80bfffe9d424ff713caa5..a1bd1bec42c11153d56fa61b110cdfa49b7e0ba6 100644
--- a/src/modules/_Stdio/file.c
+++ b/src/modules/_Stdio/file.c
@@ -5755,23 +5755,77 @@ static void exit_file_locking(void)
  */
 static void f_get_all_active_fd(INT32 args)
 {
-  int i,fds,ne;
+  int i,fds=0;
   PIKE_STAT_T foo;
-
-  ne = MAX_OPEN_FILEDESCRIPTORS;
+  struct svalue *sp;
 
   pop_n_elems(args);
-  for (i=fds=0; i<ne; i++)
+  sp = Pike_sp;
   {
-    int q;
+    DIR *tmp;
     THREADS_ALLOW();
-    q = fd_fstat(i,&foo);
-    THREADS_DISALLOW();
-    if(!q)
+#ifndef __NT__
+    if( (tmp = opendir(
+#ifdef HAVE_DARWIN_XATTR
+           "/dev/fd"
+#else
+           "/proc/self/fd"
+#endif
+           )) )
     {
-      push_int(i);
-      fds++;
+      INT_TYPE dfd = dirfd(tmp);
+
+      while(1)
+      {
+        INT_TYPE fd;
+        char *ep;
+        struct dirent ent, *res;
+        /* solaris, linux, cygwin, darwin, netbsd et.al. */
+        res = NULL;
+        while( UNLIKELY(readdir_r( tmp, &ent, &res ))
+               && UNLIKELY(errno==EINTR))
+          ;
+        if( !res )
+          break;
+
+        fd = strtol(res->d_name, &ep, 10);
+
+        if( LIKELY(ep != res->d_name) && (fd != dfd) )
+        {
+          SET_SVAL_TYPE_SUBTYPE(*sp,PIKE_T_INT,0);
+          sp++->u.integer = fd;
+          fds++;
+        }
+      }
+      closedir(tmp);
     }
+    else
+#endif /* __NT__ */
+    {
+#ifdef HAVE_SYSCONF
+      int max = sysconf(_SC_OPEN_MAX);
+      /* NOTE: This might have been lowered, so we might not actually
+       * get all FD:s.  It is usually good, however.
+       *
+       * Also, this is not used on many systems
+       */
+#else
+      int max = 65535;
+#endif
+      for (i=0; i<max; i++)
+      {
+        int q;
+        q = fd_fstat(i,&foo);
+        if(!q)
+        {
+          SET_SVAL_TYPE_SUBTYPE(*sp,PIKE_T_INT,0);
+          sp++->u.integer = i;
+          fds++;
+        }
+      }
+    }
+    THREADS_DISALLOW();
+    Pike_sp = sp;
   }
   f_aggregate(fds);
 }
diff --git a/src/modules/spider/spider.c b/src/modules/spider/spider.c
index cb6cef4cbc13f1830fcdb930be53269436f39187..62f9704d30e2d79c82ecbc244df25c8c2982a263 100644
--- a/src/modules/spider/spider.c
+++ b/src/modules/spider/spider.c
@@ -986,31 +986,6 @@ void do_html_parse_lines(struct pike_string *ss,
   }
 }
 
-/*! @decl array(int) get_all_active_fds()
- */
-void f_get_all_active_fd(INT32 args)
-{
-  int i,fds,ne;
-  PIKE_STAT_T foo;
-
-  ne = MAX_OPEN_FILEDESCRIPTORS;
-
-  pop_n_elems(args);
-  for (i=fds=0; i<ne; i++)
-  {
-    int q;
-    THREADS_ALLOW();
-    q = fd_fstat(i,&foo);
-    THREADS_DISALLOW();
-    if(!q)
-    {
-      push_int(i);
-      fds++;
-    }
-  }
-  f_aggregate(fds);
-}
-
 /*! @decl string fd_info(int fd)
  */
 void f_fd_info(INT32 args)
@@ -1167,10 +1142,6 @@ PIKE_MODULE_INIT
   /* function(int,void|int:int) */
   ADD_FUNCTION("stardate", f_stardate, tDeprecated(tFunc(tInt tInt,tInt)), 0);
 
-  /* function(:array(int)) */
-  ADD_FUNCTION("get_all_active_fd", f_get_all_active_fd,
-	       tDeprecated(tFunc(tNone,tArr(tInt))), OPT_EXTERNAL_DEPEND);
-
   /* function(int:string) */
   ADD_FUNCTION("fd_info", f_fd_info, tDeprecated(tFunc(tInt,tStr)),
                OPT_EXTERNAL_DEPEND);
diff --git a/src/pike_embed.c b/src/pike_embed.c
index 8ea8b03caff3f8ef4df99162367e4b616adfe48e..559c30ab933ce101310704889221e9306fc7a6db 100644
--- a/src/pike_embed.c
+++ b/src/pike_embed.c
@@ -306,29 +306,6 @@ void init_pike_runtime(void (*exit_cb)(int))
 #endif /* STACK_DEBUG */
 #endif /* HAVE_GETRLIMIT && RLIMIT_STACK */
 
-#if 0
-#if !defined(RLIMIT_NOFILE) && defined(RLIMIT_OFILE)
-#define RLIMIT_NOFILE RLIMIT_OFILE
-#endif
-
-#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE)
-  {
-    struct rlimit lim;
-    long tmp;
-    if(!getrlimit(RLIMIT_NOFILE, &lim))
-    {
-#ifdef RLIM_INFINITY
-      if(lim.rlim_max == RLIM_INFINITY)
-	lim.rlim_max=MAX_OPEN_FILEDESCRIPTORS;
-#endif
-      tmp=MINIMUM(lim.rlim_max, MAX_OPEN_FILEDESCRIPTORS);
-      lim.rlim_cur=tmp;
-      setrlimit(RLIMIT_NOFILE, &lim);
-    }
-  }
-#endif
-#endif
-  
   TRACE((stderr, "Init time...\n"));
   
   UPDATE_CURRENT_TIME();
diff --git a/src/signal_handler.c b/src/signal_handler.c
index f1dbae1046f8e293c7e12d270305ca08ff3a29db..2f8ed8303d3b3d010886149ff40c8a4ac5922170 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -2143,27 +2143,6 @@ static HANDLE get_inheritable_handle(struct mapping *optional,
       if(fd == -1)
 	Pike_error("File for %s is not open.\n",name);
 
-#if 0
-      {
-	int q;
-	for(q=0;q<MAX_OPEN_FILEDESCRIPTORS;q++)
-	{
-	  if(fd_type[q]<-1)
-	  {
-	    DWORD flags;
-	    fprintf(stderr,"%3d: %d %08x",q,fd_type[q],da_handle[q],flags);
-	    GetHandleInformation((HANDLE)da_handle[q],&flags);
-	    if(flags & HANDLE_FLAG_INHERIT)
-	      fprintf(stderr," inheritable");
-	    if(flags & HANDLE_FLAG_PROTECT_FROM_CLOSE)
-	      fprintf(stderr," non-closable");
-	    fprintf(stderr,"\n");
-	  }
-	}
-      }
-#endif
-
-
       if(!(fd_query_properties(fd, 0) & fd_INTERPROCESSABLE))
       {
 	void create_proxy_pipe(struct object *o, int for_reading);