summaryrefslogtreecommitdiff
path: root/ace/OS_Dirent.cpp
diff options
context:
space:
mode:
authorelliott_c <elliott_c@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2002-05-08 19:04:55 +0000
committerelliott_c <elliott_c@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2002-05-08 19:04:55 +0000
commitf5dc0de6fb7fe60ebfc503c53f7e49e0fab6d613 (patch)
tree2fc9b945e33ea8499ceb79d07c5547026f646180 /ace/OS_Dirent.cpp
parent3d7f8b3b0c174fee684d3bab76459a6668ae8c95 (diff)
downloadATCD-f5dc0de6fb7fe60ebfc503c53f7e49e0fab6d613.tar.gz
ChangeLogTag: Wed May 8 13:57:58 2002 Chad Elliott <elliott_c@ociweb.com>
Diffstat (limited to 'ace/OS_Dirent.cpp')
-rw-r--r--ace/OS_Dirent.cpp217
1 files changed, 127 insertions, 90 deletions
diff --git a/ace/OS_Dirent.cpp b/ace/OS_Dirent.cpp
index 8be0cdd60d3..98230442617 100644
--- a/ace/OS_Dirent.cpp
+++ b/ace/OS_Dirent.cpp
@@ -2,8 +2,8 @@
#include "ace/OS_Dirent.h"
#include "ace/OS_String.h"
-#include "ace/OS_Memory.h"
-#include "ace/Log_Msg.h"
+#include "ace/OS_Memory.h"
+#include "ace/Log_Msg.h"
#include "ace/OS.h"
ACE_RCSID(ace, OS_Dirent, "$Id$")
@@ -19,11 +19,11 @@ ACE_OS_Dirent::opendir_emulation (const ACE_TCHAR *filename)
ACE_DIR *dir;
ACE_TCHAR extra[3] = {0,0,0};
-/*
- Note: the semantics of the win32 function FindFirstFile take the
- basename(filename) as a pattern to be matched within the dirname(filename).
- This is contrary to the behavior of the posix function readdir which treats
- basename(filename) as a directory to be opened and read.
+/*
+ Note: the semantics of the win32 function FindFirstFile take the
+ basename(filename) as a pattern to be matched within the dirname(filename).
+ This is contrary to the behavior of the posix function readdir which treats
+ basename(filename) as a directory to be opened and read.
For this reason, we append a slash-star or backslash-star to the supplied
filename so the result is that FindFirstFile will do what we need.
@@ -38,23 +38,23 @@ ACE_OS_Dirent::opendir_emulation (const ACE_TCHAR *filename)
*/
size_t lastchar = ACE_OS_String::strlen (filename);
- if (lastchar > 0)
+ if (lastchar > 0)
{
- if (filename[lastchar-1] != '*')
+ if (filename[lastchar-1] != '*')
{
- if (filename[lastchar-1] != '/' && filename[lastchar-1] != '\\')
+ if (filename[lastchar-1] != '/' && filename[lastchar-1] != '\\')
ACE_OS_String::strcpy (extra, ACE_LIB_TEXT ("/*"));
else
ACE_OS_String::strcpy (extra, ACE_LIB_TEXT ("*"));
}
}
-
- ACE_NEW_RETURN (dir, ACE_DIR, 0);
+
+ ACE_NEW_RETURN (dir, ACE_DIR, 0);
ACE_NEW_RETURN (dir->directory_name_,
ACE_TCHAR[lastchar + ACE_OS_String::strlen (extra) + 1],
0);
ACE_OS_String::strcpy (dir->directory_name_, filename);
- if (extra[0])
+ if (extra[0])
ACE_OS_String::strcat (dir->directory_name_, extra);
dir->current_handle_ = INVALID_HANDLE_VALUE;
dir->started_reading_ = 0;
@@ -75,9 +75,13 @@ ACE_OS_Dirent::closedir_emulation (ACE_DIR *d)
d->current_handle_ = INVALID_HANDLE_VALUE;
d->started_reading_ = 0;
- ACE_OS_Memory::free (d->dirent_);
+ if (d->dirent_ != 0)
+ {
+ ACE_OS_Memory::free (d->dirent_->d_name);
+ ACE_OS_Memory::free (d->dirent_);
+ }
#else /* ACE_WIN32 */
- ACE_UNUSED_ARG (d);
+ ACE_UNUSED_ARG (d);
#endif /* ACE_WIN32 */
}
@@ -85,8 +89,12 @@ dirent *
ACE_OS_Dirent::readdir_emulation (ACE_DIR *d)
{
#if defined (ACE_WIN32)
- ACE_OS_Memory::free (d->dirent_);
- d->dirent_ = 0;
+ if (d->dirent_ != 0)
+ {
+ ACE_OS_Memory::free (d->dirent_->d_name);
+ ACE_OS_Memory::free (d->dirent_);
+ d->dirent_ = 0;
+ }
if (!d->started_reading_)
{
@@ -95,15 +103,11 @@ ACE_OS_Dirent::readdir_emulation (ACE_DIR *d)
if (d->current_handle_ != INVALID_HANDLE_VALUE)
{
- // Skip "." and ".."
- int retval = 1;
- while (*d->fdata_.cFileName == '.'
- && retval
- && d->fdata_.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
- retval = ACE_TEXT_FindNextFile (d->current_handle_, &d->fdata_);
- if (retval == 0)
+ // readdir under UNIX doesn't skip '.' and '..', so
+ // why should this implementation
+ if (ACE_TEXT_FindNextFile (d->current_handle_, &d->fdata_) == 0)
{
- ::FindClose (d->current_handle_);
+ ::FindClose (d->current_handle_);
d->current_handle_ = INVALID_HANDLE_VALUE;
}
}
@@ -124,14 +128,19 @@ ACE_OS_Dirent::readdir_emulation (ACE_DIR *d)
if (d->current_handle_ != INVALID_HANDLE_VALUE)
{
- d->dirent_ = (dirent *)
- ACE_OS_Memory::malloc (sizeof (dirent)
- + ((ACE_OS_String::strlen (d->fdata_.cFileName) + 1
- * sizeof (ACE_TCHAR))));
- ACE_OS_String::strcpy (d->dirent_->d_name, d->fdata_.cFileName);
- d->dirent_->d_reclen = sizeof (dirent)
- + (ACE_OS_String::strlen (d->dirent_->d_name) * sizeof (ACE_TCHAR));
- return d->dirent_;
+ d->dirent_ = (dirent *)
+ ACE_OS_Memory::malloc (sizeof (dirent));
+
+ if (d->dirent_ != 0)
+ {
+ d->dirent_->d_name = (ACE_TCHAR*)
+ ACE_OS_Memory::malloc ((ACE_OS_String::strlen (d->fdata_.cFileName) + 1)
+ * sizeof (ACE_TCHAR));
+ ACE_OS_String::strcpy (d->dirent_->d_name, d->fdata_.cFileName);
+ d->dirent_->d_reclen = sizeof (dirent);
+ }
+
+ return d->dirent_;
}
else
return 0;
@@ -141,92 +150,120 @@ ACE_OS_Dirent::readdir_emulation (ACE_DIR *d)
#endif /* ACE_WIN32 */
}
-extern "C"
+extern "C"
{
- typedef int (*ACE_SCANDIR_COMPARATOR) (const void *, const void *);
+ typedef int (*ACE_SCANDIR_COMPARATOR) (const void *, const void *);
}
-int
-ACE_OS_Dirent::scandir_emulation (const ACE_TCHAR *dirname,
- dirent **namelist[],
- int (*selector) (const dirent *entry),
+int
+ACE_OS_Dirent::scandir_emulation (const ACE_TCHAR *dirname,
+ dirent **namelist[],
+ int (*selector) (const dirent *entry),
int (*comparator) (const dirent **f1,
const dirent **f2))
-{
+{
ACE_DIR *dirp = ACE_OS_Dirent::opendir (dirname);
- if (dirp == 0)
+ if (dirp == 0)
return -1;
- // A sanity check here. "namelist" had better not be zero.
- else if (namelist == 0)
+ // A sanity check here. "namelist" had better not be zero.
+ else if (namelist == 0)
return -1;
-
- dirent **vector = 0;
- dirent *dp;
- int arena_size = 0;
-
- int nfiles = 0;
+
+ dirent **vector = 0;
+ dirent *dp;
+ int arena_size = 0;
+
+ int nfiles = 0;
int fail = 0;
-
+
// @@ This code shoulduse readdir_r() rather than readdir().
for (dp = ACE_OS_Dirent::readdir (dirp);
- dp != 0;
+ dp != 0;
dp = ACE_OS_Dirent::readdir (dirp))
{
if (selector && (*selector)(dp) == 0)
- continue;
-
+ continue;
+
// If we get here, we have a dirent that the user likes.
- if (nfiles == arena_size)
+ if (nfiles == arena_size)
{
- dirent **newv;
- if (arena_size == 0)
- arena_size = 10;
- else
- arena_size *= 2;
-
+ dirent **newv;
+ if (arena_size == 0)
+ arena_size = 10;
+ else
+ arena_size *= 2;
+
newv = (dirent **) ACE_OS_Memory::realloc (vector,
arena_size * sizeof (dirent *));
- if (newv == 0)
+ if (newv == 0)
{
fail = 1;
- break;
- }
- vector = newv;
- }
+ break;
+ }
+ vector = newv;
+ }
- int dsize =
- sizeof (dirent) +
+#if defined (ACE_LACKS_STRUCT_DIR)
+ dirent *newdp = (dirent *) ACE_OS_Memory::malloc (sizeof (dirent));
+#else
+ int dsize =
+ sizeof (dirent) +
((ACE_OS_String::strlen (dp->d_name) + 1) * sizeof (ACE_TCHAR));
- dirent *newdp = (dirent *) ACE_OS_Memory::malloc (dsize);
-
- if (newdp == 0)
+ dirent *newdp = (dirent *) ACE_OS_Memory::malloc (dsize);
+#endif /* ACE_LACKS_STRUCT_DIR */
+
+ if (newdp == 0)
+ {
+ fail = 1;
+ break;
+ }
+
+#if defined (ACE_LACKS_STRUCT_DIR)
+ newdp->d_name = (ACE_TCHAR*) ACE_OS_Memory::malloc (
+ (ACE_OS_String::strlen (dp->d_name) + 1) * sizeof (ACE_TCHAR));
+
+ if (newdp->d_name == 0)
{
- fail = 1;
- break;
- }
-
- vector[nfiles++] = (dirent *) ACE_OS_String::memcpy (newdp, dp, dsize);
- }
-
- if (fail)
- {
- ACE_OS_Dirent::closedir (dirp);
+ fail = 1;
+ ACE_OS_Memory::free (newdp);
+ break;
+ }
+
+ // Don't use memcpy here since d_name is now a pointer
+ newdp->d_ino = dp->d_ino;
+ newdp->d_off = dp->d_off;
+ newdp->d_reclen = dp->d_reclen;
+ ACE_OS_String::strcpy (newdp->d_name, dp->d_name);
+ vector[nfiles++] = newdp;
+#else
+ vector[nfiles++] = (dirent *) ACE_OS_String::memcpy (newdp, dp, dsize);
+#endif /* ACE_LACKS_STRUCT_DIR */
+ }
+
+ if (fail)
+ {
+ ACE_OS_Dirent::closedir (dirp);
while (nfiles-- > 0)
- ACE_OS_Memory::free (vector[nfiles]);
- ACE_OS_Memory::free (vector);
- return -1;
- }
-
- ACE_OS_Dirent::closedir (dirp);
+ {
+#if defined (ACE_LACKS_STRUCT_DIR)
+ ACE_OS_Memory::free (vector[nfiles]->d_name);
+#endif /* ACE_LACKS_STRUCT_DIR */
+ ACE_OS_Memory::free (vector[nfiles]);
+ }
+ ACE_OS_Memory::free (vector);
+ return -1;
+ }
+
+ ACE_OS_Dirent::closedir (dirp);
- *namelist = vector;
+ *namelist = vector;
- if (comparator)
+ if (comparator)
ACE_OS::qsort (*namelist,
nfiles,
sizeof (dirent *),
- (ACE_SCANDIR_COMPARATOR) comparator);
+ (ACE_SCANDIR_COMPARATOR) comparator);
- return nfiles;
+ return nfiles;
}