summaryrefslogtreecommitdiff
path: root/ace/OS_NS_dirent.inl
diff options
context:
space:
mode:
Diffstat (limited to 'ace/OS_NS_dirent.inl')
-rw-r--r--ace/OS_NS_dirent.inl189
1 files changed, 188 insertions, 1 deletions
diff --git a/ace/OS_NS_dirent.inl b/ace/OS_NS_dirent.inl
index fc532b41367..520b23f5105 100644
--- a/ace/OS_NS_dirent.inl
+++ b/ace/OS_NS_dirent.inl
@@ -1,4 +1,191 @@
// -*- C++ -*-
// $Id$
-// This is a placeholder.
+ACE_INLINE void
+ACE_OS::closedir (ACE_DIR *d)
+{
+#if defined (ACE_HAS_DIRENT)
+# if defined (ACE_PSOS)
+
+ u_long result = ::close_dir (&(d->xdir));
+ delete d;
+ if (result != 0)
+ errno = result;
+
+# else /* ! ACE_PSOS */
+
+# if defined (ACE_WIN32)
+ ACE_OS::closedir_emulation (d);
+ delete [] d->directory_name_;
+ delete d;
+# else /* ACE_WIN32 */
+ ::closedir (d);
+# endif /* ACE_WIN32 */
+
+# endif /* ACE_PSOS */
+#else /* ACE_HAS_DIRENT */
+ ACE_UNUSED_ARG (d);
+#endif /* ACE_HAS_DIRENT */
+}
+
+ACE_INLINE ACE_DIR *
+ACE_OS::opendir (const ACE_TCHAR *filename)
+{
+#if defined (ACE_HAS_DIRENT)
+# if defined (ACE_PSOS)
+ // The pointer to the <ACE_DIR> buffer *must* be passed to
+ // <ACE_OS::closedir> to free it and avoid a memory leak.
+ ACE_DIR *dir;
+ u_long result;
+ ACE_NEW_RETURN (dir, ACE_DIR, 0);
+ result = ::open_dir (ACE_const_cast (ACE_TCHAR *,
+ filename),
+ &dir->xdir);
+ if (result == 0)
+ return dir;
+ else
+ {
+ errno = result;
+ return 0;
+ }
+# else /* ! ACE_PSOS */
+# if defined (ACE_WIN32)
+ return ::ACE_OS::opendir_emulation (filename);
+# else /* ! ACE_WIN32 */
+ // VxWorks' ::opendir () is declared with a non-const argument.
+ return ::opendir (ACE_const_cast (ACE_TCHAR *, filename));
+# endif /* ACE_WIN32 */
+# endif /* ACE_PSOS */
+#else
+ ACE_UNUSED_ARG (filename);
+ ACE_NOTSUP_RETURN (0);
+#endif /* ACE_HAS_DIRENT */
+}
+
+ACE_INLINE struct dirent *
+ACE_OS::readdir (ACE_DIR *d)
+{
+#if defined (ACE_HAS_DIRENT)
+# if defined (ACE_PSOS)
+
+ u_long result = ::read_dir (&d->xdir, &d->dirent);
+ if (0 == result)
+ return &d->dirent;
+ else
+ {
+ errno = result;
+ return 0;
+ }
+
+# else /* ! ACE_PSOS */
+# if defined (ACE_WIN32)
+ return ACE_OS::readdir_emulation (d);
+# else /* defined (ACE_WIN32) */
+ return ::readdir (d);
+# endif /* defined (ACE_WIN32) */
+# endif /* ACE_PSOS */
+#else
+ ACE_UNUSED_ARG (d);
+ ACE_NOTSUP_RETURN (0);
+#endif /* ACE_HAS_DIRENT */
+}
+
+ACE_INLINE int
+ACE_OS::readdir_r (ACE_DIR *dirp,
+ struct dirent *entry,
+ struct dirent **result)
+{
+#if !defined (ACE_HAS_REENTRANT_FUNCTIONS)
+ ACE_UNUSED_ARG (entry);
+ // <result> has better not be 0!
+ *result = ACE_OS::readdir (dirp);
+ if (*result)
+ return 0; // Keep iterating
+ else
+ return 1; // Oops, some type of error!
+#elif defined (ACE_HAS_DIRENT) && !defined (ACE_LACKS_READDIR_R)
+# if (defined (sun) && (defined (_POSIX_PTHREAD_SEMANTICS) || \
+ (_FILE_OFFSET_BITS == 64))) || \
+ (!defined (sun) && (defined (ACE_HAS_PTHREADS_STD) || \
+ defined (ACE_HAS_PTHREADS_DRAFT7) || \
+ defined (__USE_POSIX) || \
+ defined (__FreeBSD__) || \
+ defined (HPUX_11)))
+# if defined (__GNUG__) && defined (DIGITAL_UNIX)
+ return readdir_r (dirp, entry, result);
+# else
+ return ::readdir_r (dirp, entry, result);
+# endif /* defined (__GNUG__) && defined (DIGITAL_UNIX) */
+# else /* ! POSIX.1c - this is draft 4 or draft 6 */
+# if defined (HPUX_10) /* But HP 10.x doesn't follow the draft either */
+ *result = entry;
+ return ::readdir_r (dirp, entry);
+# else
+ // <result> had better not be 0!
+ *result = ::readdir_r (dirp, entry);
+ return 0;
+# endif /* HPUX_10 */
+# endif /* ! POSIX.1c */
+#else /* ! ACE_HAS_DIRENT || ACE_LACKS_READDIR_R */
+ ACE_UNUSED_ARG (dirp);
+ ACE_UNUSED_ARG (entry);
+ ACE_UNUSED_ARG (result);
+ ACE_NOTSUP_RETURN (0);
+
+#endif /* ACE_HAS_REENTRANT_FUNCTIONS */
+}
+
+ACE_INLINE void
+ACE_OS::rewinddir (ACE_DIR *d)
+{
+#if defined (ACE_HAS_DIRENT)
+# if defined (ACE_LACKS_SEEKDIR)
+# if defined (ACE_LACKS_REWINDDIR)
+ ACE_UNUSED_ARG (d);
+# else /* ! defined (ACE_LACKS_REWINDDIR) */
+ ::rewinddir (d);
+# endif /* ! defined (ACE_LACKS_REWINDDIR) */
+# else /* ! ACE_LACKS_SEEKDIR */
+ // We need to implement <rewinddir> using <seekdir> since it's often
+ // defined as a macro...
+ ::seekdir (d, long (0));
+# endif /* ! ACE_LACKS_SEEKDIR */
+#else
+ ACE_UNUSED_ARG (d);
+#endif /* ACE_HAS_DIRENT */
+}
+
+ACE_INLINE int
+ACE_OS::scandir (const ACE_TCHAR *dirname,
+ struct dirent **namelist[],
+ int (*selector)(const struct dirent *),
+ int (*comparator) (const struct dirent **f1,
+ const struct dirent **f2))
+{
+#if defined (ACE_HAS_SCANDIR)
+ return ::scandir (dirname, namelist, selector, comparator);
+#else /* ! defined ( ACE_HAS_SCANDIR) */
+ return ACE_OS::scandir_emulation (dirname, namelist, selector, comparator);
+#endif /* ACE_HAS_SCANDIR */
+}
+ACE_INLINE void
+ACE_OS::seekdir (ACE_DIR *d, long loc)
+{
+#if defined (ACE_HAS_DIRENT) && !defined (ACE_LACKS_SEEKDIR)
+ ::seekdir (d, loc);
+#else /* ! ACE_HAS_DIRENT || ACE_LACKS_SEEKDIR */
+ ACE_UNUSED_ARG (d);
+ ACE_UNUSED_ARG (loc);
+#endif /* ! ACE_HAS_DIRENT || ACE_LACKS_SEEKDIR */
+}
+
+ACE_INLINE long
+ACE_OS::telldir (ACE_DIR *d)
+{
+#if defined (ACE_HAS_DIRENT) && !defined (ACE_LACKS_TELLDIR)
+ return ::telldir (d);
+#else /* ! ACE_HAS_DIRENT || ACE_LACKS_TELLDIR */
+ ACE_UNUSED_ARG (d);
+ ACE_NOTSUP_RETURN (-1);
+#endif /* ! ACE_HAS_DIRENT || ACE_LACKS_TELLDIR */
+}