Make fdwalk work when /proc isn't mounted
authorDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Thu, 2 Apr 2009 08:16:25 +0000 (04:16 -0400)
committerDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Thu, 2 Apr 2009 08:16:25 +0000 (04:16 -0400)
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/closefrom.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fdwalk.c

index 9b1c7e4..e88b69e 100644 (file)
@@ -27,7 +27,7 @@ static int close_lowfd (void *lowfdp, int fd)
 {
   int lowfd = (int)lowfdp;
   if (fd >= lowfd)
-    close (fd);
+    (void) close (fd);
   return 0;
 }
 
index be3aeda..7a8ffad 100644 (file)
 
 #include <stdlib.h>
 #include <dirent.h>
+#include <sys/resource.h>
 
 /* Docs: http://docs.sun.com/app/docs/doc/816-5168/fdwalk-3c  */
 
 int fdwalk (int (*func)(void *, int), void *cd)
 {
-  DIR *dir = opendir ("/proc/self/fd");
-  if (!dir)
-    return -1;
-
-  /* Note that fdwalk is not required to be thread-safe so we don't need to
-     use the _r version.  */
-  struct dirent *dirent;
-  while ((dirent = readdir (dir)))
+  int res;
+  DIR *dir;
+
+  dir = opendir ("/proc/self/fd");
+  if (dir)
+    {
+      /* Note that fdwalk is not required to be thread-safe so we don't need to
+         use the _r version.  */
+      struct dirent *dirent;
+      while ((dirent = readdir (dir)))
+       {
+         int fd;
+
+         if (dirent->d_name[0] == '.')
+           continue;
+         fd = atoi (dirent->d_name);
+         if (fd == dirfd (dir))
+           continue;
+         res = (*func)(cd, fd);
+         if (res != 0)
+           break;
+       }
+
+      (void) closedir (dir);
+    }
+  else
     {
-      if (dirent->d_name[0] == '.')
-        continue;
-      int fd = atoi (dirent->d_name);
-      if (fd == dirfd (dir))
-        continue;
-      (*func)(cd, fd);
+      struct rlimit rlim;
+      int fd;
+
+      if (getrlimit (RLIMIT_NOFILE, &rlim) != 0)
+       return -1;
+      for (fd = 0; fd < rlim.rlim_max; fd++)
+       {
+         res = (*func)(cd, fd);
+         if (res != 0)
+           break;
+       }
     }
 
-  return closedir (dir);
+  return res;
 }