OSDN Git Service

* fhandler.h (fhandler_proc::opendir): Declare.
authorcorinna <corinna>
Fri, 12 Aug 2011 12:31:06 +0000 (12:31 +0000)
committercorinna <corinna>
Fri, 12 Aug 2011 12:31:06 +0000 (12:31 +0000)
(fhandler_proc::closedir): Declare.
* fhandler_proc.cc (fhandler_proc::opendir): New method.  Fetch list
of active processes here once to avoid potential duplicates.
(fhandler_proc::closedir): New method.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_proc.cc

index 8dc5248..933769a 100644 (file)
@@ -1,3 +1,11 @@
+2011-08-12  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler.h (fhandler_proc::opendir): Declare.
+       (fhandler_proc::closedir): Declare.
+       * fhandler_proc.cc (fhandler_proc::opendir): New method.  Fetch list
+       of active processes here once to avoid potential duplicates.
+       (fhandler_proc::closedir): New method.
+
 2011-08-11  Corinna Vinschen  <corinna@vinschen.de>
 
        * fhandler_proc.cc (fhandler_proc::get_proc_fhandler): Don't allow to
index b8c3f20..3cbcba9 100644 (file)
@@ -1440,6 +1440,8 @@ class fhandler_proc: public fhandler_virtual
  public:
   fhandler_proc ();
   virtual_ftype_t exists();
+  DIR *opendir (int fd) __attribute__ ((regparm (2)));
+  int closedir (DIR *);
   int readdir (DIR *, dirent *) __attribute__ ((regparm (3)));
   static fh_devices get_proc_fhandler (const char *path);
 
index 63178a0..94007ca 100644 (file)
@@ -220,6 +220,26 @@ fhandler_proc::fstat (struct __stat64 *buf)
   return -1;
 }
 
+DIR *
+fhandler_proc::opendir (int fd)
+{
+  DIR *dir = fhandler_virtual::opendir (fd);
+  if (dir && !(dir->__handle = (void *) new winpids ((DWORD) 0)))
+    {
+      free (dir);
+      dir = NULL;
+      set_errno (ENOMEM);
+    }
+  return dir;
+}
+
+int
+fhandler_proc::closedir (DIR *dir)
+{
+  free (dir->__handle);
+  return fhandler_virtual::closedir (dir);
+}
+
 int
 fhandler_proc::readdir (DIR *dir, dirent *de)
 {
@@ -232,7 +252,7 @@ fhandler_proc::readdir (DIR *dir, dirent *de)
     }
   else
     {
-      winpids pids ((DWORD) 0);
+      winpids &pids = *(winpids *) dir->__handle;
       int found = 0;
       res = ENMFILE;
       for (unsigned i = 0; i < pids.npids; i++)