summaryrefslogtreecommitdiff
path: root/ace/OS_Dirent.h
blob: bbac4ab4eff4afe062d3bb819f702abc4498b6b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// -*- C++ -*-

//=============================================================================
/**
 *  @file   OS_Dirent.h
 *
 *  $Id$
 *
 *  @author Doug Schmidt <schmidt@cs.wustl.edu>
 *  @author Jesper S. M|ller<stophph@diku.dk>
 *  @author and a cast of thousands...
 */
//=============================================================================

#ifndef ACE_OS_DIRENT_H
#define ACE_OS_DIRENT_H
#include "ace/pre.h"

#include "ace/config-all.h"
#include "ace/OS_Export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#if !defined (ACE_WIN32) && !defined (ACE_PSOS) && !defined (ACE_HAS_WINCE)
# include /**/ <sys/types.h>
# if !defined (ACE_LACKS_UNISTD_H)
#   include /**/ <unistd.h>  // VxWorks needs this to compile
# endif /* !ACE_LACKS_UNISTD_H */
# include /**/ <dirent.h>
#endif /* !ACE_WIN32 && !ACE_PSOS */

// At least compile on some of the platforms without <ACE_DIR> info yet.
# if !defined (ACE_HAS_DIRENT)
typedef int ACE_DIR;
struct dirent {
};
# endif /* ACE_HAS_DIRENT */

#if defined (ACE_LACKS_STRUCT_DIR)
struct dirent {
  unsigned short d_ino;
  unsigned short d_off;
  unsigned short d_reclen;
  ACE_TCHAR d_name[1];
};

struct ACE_DIR {
  /// The name of the directory we are looking into
  ACE_TCHAR *directory_name_;

  /// Remember the handle between calls.
  HANDLE current_handle_;

  /// The struct for the results
  dirent *dirent_;

  /// The struct for intermediate results.
  ACE_TEXT_WIN32_FIND_DATA fdata_;

  /// A flag to remember if we started reading already.
  int started_reading_;
};
#elif defined (ACE_PSOS) && !defined (ACE_PSOS_DIAB_PPC)
// Create our own definition of the DIR struct, like what
// is available in the newer DIAB PPC header files
struct ACE_DIR
{
  /// The directory handle
  XDIR            xdir;

  /// The directory entry
  struct dirent   dirent;
};
#else
typedef DIR ACE_DIR;
# endif /* ACE_LACKS_STRUCT_DIR */

#if defined rewinddir
# undef rewinddir
#endif /* rewinddir */

/**
 * @class ACE_OS_Dirent
 *
 * @brief This class is a wrapper for the dirent.h operations
 *
 */
class ACE_OS_Export ACE_OS_Dirent
{
public:
  static ACE_DIR *opendir (const ACE_TCHAR *filename);
  static void closedir (ACE_DIR *);
  static dirent *readdir (ACE_DIR *);
  static int readdir_r (ACE_DIR *dirp,
                        dirent *entry,
                        dirent **result);
  static long telldir (ACE_DIR *);
  static void seekdir (ACE_DIR *,
                       long loc);
  static void rewinddir (ACE_DIR *);

  static int scandir (const ACE_TCHAR *dirname,
                      dirent **namelist[],
                      int (*selector) (const dirent *filename),
                      int (*comparator) (const dirent **f1,
                                         const dirent **f2));
private:
  // Win32 emulation functions
  static ACE_DIR *opendir_emulation (const ACE_TCHAR *filename);
  static int scandir_emulation (const ACE_TCHAR *dirname,
                                dirent **namelist[],
                                int (*selector)(const dirent *entry),
                                int (*comparator)(const dirent **f1,
                                                  const dirent**f2));
  static void closedir_emulation (ACE_DIR *);
  static dirent *readdir_emulation (ACE_DIR *);
};

# if defined (ACE_HAS_INLINED_OSCALLS)
#   if defined (ACE_INLINE)
#     undef ACE_INLINE
#   endif /* ACE_INLINE */
#   define ACE_INLINE inline
#   include "ace/OS_Dirent.inl"
# endif /* ACE_HAS_INLINED_OSCALLS */

#include "ace/post.h"
#endif /* ACE_OS_DIRENT_H */