Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / libltdl / lt__dirent.c
diff --git a/libltdl/lt__dirent.c b/libltdl/lt__dirent.c
new file mode 100644 (file)
index 0000000..30dc072
--- /dev/null
@@ -0,0 +1,107 @@
+/* lt__dirent.c -- internal directory entry scanning interface
+
+   Copyright (C) 2001, 2004 Free Software Foundation, Inc.
+   Written by Bob Friesenhahn, 2001
+
+   NOTE: The canonical source of this file is maintained with the
+   GNU Libtool package.  Report bugs to bug-libtool@gnu.org.
+
+GNU Libltdl is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+As a special exception to the GNU Lesser General Public License,
+if you distribute this file as part of a program or library that
+is built using GNU Libtool, you may include this file under the
+same distribution terms that you use for the rest of that program.
+
+GNU Libltdl is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with GNU Libltdl; see the file COPYING.LIB.  If not, a
+copy can be downloaded from  http://www.gnu.org/licenses/lgpl.html,
+or obtained by writing to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include "lt__private.h"
+
+#include <assert.h>
+#include <stddef.h>
+
+#include "lt__dirent.h"
+
+#if defined(__WINDOWS__)
+
+void
+closedir (DIR *entry)
+{
+  assert (entry != (DIR *) NULL);
+  FindClose (entry->hSearch);
+  free ((void *) entry);
+}
+
+
+DIR *
+opendir (const char *path)
+{
+  char file_spec[LT_FILENAME_MAX];
+  DIR *entry;
+
+  assert (path != (char *) 0);
+  if (lt_strlcpy (file_spec, path, sizeof file_spec) >= sizeof file_spec
+      || lt_strlcat (file_spec, "\\", sizeof file_spec) >= sizeof file_spec)
+    return (DIR *) 0;
+  entry = (DIR *) malloc (sizeof(DIR));
+  if (entry != (DIR *) 0)
+    {
+      entry->firsttime = TRUE;
+      entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData);
+
+      if (entry->hSearch == INVALID_HANDLE_VALUE)
+       {
+         if (lt_strlcat (file_spec, "\\*.*", sizeof file_spec) < sizeof file_spec)
+           {
+             entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData);
+           }
+
+         if (entry->hSearch == INVALID_HANDLE_VALUE)
+           {
+             entry = (free (entry), (DIR *) 0);
+           }
+       }
+    }
+
+  return entry;
+}
+
+
+struct dirent *
+readdir (DIR *entry)
+{
+  int status;
+
+  if (entry == (DIR *) 0)
+    return (struct dirent *) 0;
+
+  if (!entry->firsttime)
+    {
+      status = FindNextFile (entry->hSearch, &entry->Win32FindData);
+      if (status == 0)
+        return (struct dirent *) 0;
+    }
+
+  entry->firsttime = FALSE;
+  if (lt_strlcpy (entry->file_info.d_name, entry->Win32FindData.cFileName,
+       sizeof entry->file_info.d_name) >= sizeof entry->file_info.d_name)
+    return (struct dirent *) 0;
+  entry->file_info.d_namlen = strlen (entry->file_info.d_name);
+
+  return &entry->file_info;
+}
+
+#endif /*defined(__WINDOWS__)*/