diff options
author | elliott_c <elliott_c@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2002-05-08 19:04:55 +0000 |
---|---|---|
committer | elliott_c <elliott_c@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2002-05-08 19:04:55 +0000 |
commit | f5dc0de6fb7fe60ebfc503c53f7e49e0fab6d613 (patch) | |
tree | 2fc9b945e33ea8499ceb79d07c5547026f646180 /ace/OS_Dirent.cpp | |
parent | 3d7f8b3b0c174fee684d3bab76459a6668ae8c95 (diff) | |
download | ATCD-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.cpp | 217 |
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; } |