Changes to attempt to silence bcc64x
[ACE_TAO.git] / ACE / ace / OS_NS_sys_stat.inl
blobb3a7d38e142efa908d589ae7bb24db5214318d90
1 // -*- C++ -*-
2 #include "ace/OS_NS_unistd.h"
3 #include "ace/OS_NS_fcntl.h"
4 #include "ace/OS_NS_errno.h"
5 #include "ace/OS_NS_macros.h"
7 #ifdef ACE_MQX
8 #  include "ace/MQX_Filesystem.h"
9 #endif
11 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
13 namespace ACE_OS
16   ACE_INLINE ACE_HANDLE
17   creat (const ACE_TCHAR *filename, mode_t mode)
18   {
19     ACE_OS_TRACE ("ACE_OS::creat");
20 #if defined (ACE_WIN32) || defined (ACE_MQX)
21     return ACE_OS::open (filename, O_CREAT|O_TRUNC|O_WRONLY, mode);
22 #else
23     return ::creat (ACE_TEXT_ALWAYS_CHAR (filename), mode);
24 #endif /* ACE_WIN32 */
25   }
27   ACE_INLINE int
28   fstat (ACE_HANDLE handle, ACE_stat *stp)
29   {
30     ACE_OS_TRACE ("ACE_OS::fstat");
31 #if defined (ACE_WIN32)
32     BY_HANDLE_FILE_INFORMATION fdata;
34     if (::GetFileInformationByHandle (handle, &fdata) == FALSE)
35       {
36         ACE_OS::set_errno_to_last_error ();
37         return -1;
38       }
39     else if (fdata.nFileSizeHigh != 0)
40       {
41         errno = EINVAL;
42         return -1;
43       }
44     else
45       {
46         stp->st_size = fdata.nFileSizeLow;
47         stp->st_atime = ACE_Time_Value (fdata.ftLastAccessTime).sec ();
48         stp->st_mtime = ACE_Time_Value (fdata.ftLastWriteTime).sec ();
49         stp->st_ctime = ACE_Time_Value (fdata.ftCreationTime).sec ();
50         stp->st_nlink = static_cast<short> (fdata.nNumberOfLinks);
51         stp->st_dev = stp->st_rdev = 0; // No equivalent conversion.
52         stp->st_mode = S_IXOTH | S_IROTH |
53           (fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? 0 : S_IWOTH) |
54           (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? S_IFDIR : S_IFREG);
55       }
56     return 0;
57 #elif defined (ACE_LACKS_FSTAT)
58     ACE_NOTSUP_RETURN (-1);
59 #elif defined (ACE_MQX)
60     return MQX_Filesystem::inst ().fstat (handle, stp);
61 #else
62     return ::fstat (handle, stp);
63 #endif /* !ACE_WIN32 */
64   }
66   // This function returns the number of bytes in the file referenced by
67   // FD.
68   ACE_INLINE ACE_OFF_T
69   filesize (ACE_HANDLE handle)
70   {
71     ACE_OS_TRACE ("ACE_OS::filesize");
72 #if defined (ACE_WIN32)
73 # if defined (_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
74     LARGE_INTEGER size;
75     return
76       (::GetFileSizeEx (handle, &size)
77        ? size.QuadPart
78        : (ACE_OS::set_errno_to_last_error (), -1));
79 # else
80     DWORD const size = ::GetFileSize (handle, 0);
81     return
82       (size != INVALID_FILE_SIZE
83        ? static_cast<ACE_OFF_T> (size)
84        : (ACE_OS::set_errno_to_last_error (), -1));
85 # endif  /* _FILE_OFFSET_BITS == 64 */
86 #else /* !ACE_WIN32 */
87     ACE_stat sb;
88     return ACE_OS::fstat (handle, &sb) == -1 ?
89                     static_cast<ACE_OFF_T> (-1) : sb.st_size;
90 #endif
91   }
93   ACE_INLINE ACE_OFF_T
94   filesize (const ACE_TCHAR *filename)
95   {
96     ACE_OS_TRACE ("ACE_OS::filesize");
98 #if defined (ACE_LACKS_STAT)
99     ACE_HANDLE const h = ACE_OS::open (filename, O_RDONLY);
100     if (h != ACE_INVALID_HANDLE)
101       {
102         ACE_OFF_T const size = ACE_OS::filesize (h);
103         ACE_OS::close (h);
104         return size;
105       }
106     else
107       return -1;
108 #else /* !ACE_LACKS_STAT */
109     ACE_stat sb;
110     return ACE_OS::stat (filename, &sb) == -1 ?
111                     static_cast<ACE_OFF_T> (-1) : sb.st_size;
112 #endif /* ACE_LACKS_STAT */
113   }
115   ACE_INLINE int
116   lstat (const char *file, ACE_stat *stp)
117   {
118     ACE_OS_TRACE ("ACE_OS::lstat");
119 # if defined (ACE_LACKS_LSTAT)
120     return ACE_OS::stat (file, stp);
121 # else /* !ACE_LACKS_LSTAT */
122     return ::lstat (file, stp);
123 # endif /* ACE_LACKS_LSTAT */
124   }
126 #if defined (ACE_HAS_WCHAR)
127   ACE_INLINE int
128   lstat (const wchar_t *file, ACE_stat *stp)
129   {
130     ACE_OS_TRACE ("ACE_OS::lstat");
131 # if defined (ACE_LACKS_LSTAT)
132     return ACE_OS::stat (file, stp);
133 # else
134     return ACE_OS::lstat (ACE_Wide_To_Ascii (file).char_rep (), stp);
135 # endif /* ACE_LACKS_LSTAT */
136   }
137 #endif /* ACE_HAS_WCHAR */
139   ACE_INLINE int
140   mkdir (const char *path, mode_t mode)
141   {
142 #if defined (ACE_MKDIR_LACKS_MODE)
143     ACE_UNUSED_ARG (mode);
144 #  if defined (ACE_MKDIR_EQUIVALENT)
145     return ACE_MKDIR_EQUIVALENT (path);
146 #  else
147     return ::mkdir (path);
148 #  endif
149 #else
150     return::mkdir (path, mode);
151 #endif
152   }
154 #if defined (ACE_HAS_WCHAR)
156   ACE_INLINE int
157   mkdir (const wchar_t *path, mode_t mode)
158   {
159 #if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
160     ACE_UNUSED_ARG (mode);
161     return ::_wmkdir (path);
162 #else
163     return ACE_OS::mkdir (ACE_Wide_To_Ascii (path).char_rep (), mode);
164 #endif /* ACE_WIN32 && ACE_USES_WCHAR */
165   }
167 #endif /* ACE_HAS_WCHAR */
169   ACE_INLINE int
170   mkfifo (const ACE_TCHAR *file, mode_t mode)
171   {
172     ACE_OS_TRACE ("ACE_OS::mkfifo");
173 #if defined (ACE_LACKS_MKFIFO)
174     ACE_UNUSED_ARG (file);
175     ACE_UNUSED_ARG (mode);
176     ACE_NOTSUP_RETURN (-1);
177 #else
178     return ::mkfifo (ACE_TEXT_ALWAYS_CHAR (file), mode);
179 #endif /* ACE_LACKS_MKFIFO */
180   }
182   ACE_INLINE int
183   stat (const char *file, ACE_stat *stp)
184   {
185     ACE_OS_TRACE ("ACE_OS::stat");
186 #if defined (ACE_LACKS_STAT)
187     ACE_NOTSUP_RETURN (-1);
188 #elif defined (ACE_MQX)
189     return MQX_Filesystem::inst ().stat (file, stp);
190 #else
191     return ACE_STAT_FUNC_NAME (file, stp);
192 #endif /* ACE_LACKS_STAT */
193   }
195 #if defined (ACE_HAS_WCHAR)
196   ACE_INLINE int
197   stat (const wchar_t *file, ACE_stat *stp)
198   {
199     ACE_OS_TRACE ("ACE_OS::stat");
200 #if defined (__BORLANDC__) \
201     || defined (_MSC_VER) \
202     || (defined (__MINGW32__) && !defined (__MINGW64_VERSION_MAJOR))
203     return ACE_WSTAT_FUNC_NAME (file, stp);
204 #else
205     ACE_Wide_To_Ascii nfile (file);
206     return ACE_OS::stat (nfile.char_rep (), stp);
207 #endif /* __BORLANDC__  */
208   }
209 #endif /* ACE_HAS_WCHAR */
211   ACE_INLINE mode_t
212   umask (mode_t cmask)
213   {
214     ACE_OS_TRACE ("ACE_OS::umask");
215 # if defined (ACE_LACKS_UMASK)
216     ACE_UNUSED_ARG (cmask);
217     ACE_NOTSUP_RETURN ((mode_t)-1);
218 # elif defined (ACE_HAS_TR24731_2005_CRT)
219     int old_mode;
220     int const new_mode = static_cast<int> (cmask);
221     ACE_SECURECRTCALL (_umask_s (new_mode, &old_mode), mode_t, -1, old_mode);
222     return static_cast<mode_t> (old_mode);
223 # elif defined (ACE_WIN32) && !defined (__BORLANDC__)
224     return ::_umask (cmask);
225 # else
226     return ::umask (cmask); // This call shouldn't fail...
227 # endif /* ACE_LACKS_UMASK */
228   }
230 } // ACE_OS namespace
232 ACE_END_VERSIONED_NAMESPACE_DECL