1 // $Id: OS_NS_fcntl.cpp 80826 2008-03-04 14:51:23Z wotte $
3 #include "ace/OS_NS_fcntl.h"
5 ACE_RCSID(ace
, OS_NS_fcntl
, "$Id: OS_NS_fcntl.cpp 80826 2008-03-04 14:51:23Z wotte $")
7 #if !defined (ACE_HAS_INLINED_OSCALLS)
8 # include "ace/OS_NS_fcntl.inl"
9 #endif /* ACE_HAS_INLINED_OSCALLS */
11 #include "ace/OS_NS_stdio.h"
12 #include "ace/OS_NS_Thread.h"
13 #include "ace/OS_NS_macros.h"
14 #include "ace/Object_Manager_Base.h"
16 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
19 ACE_OS::open (const char *filename
,
22 LPSECURITY_ATTRIBUTES sa
)
24 ACE_OS_TRACE ("ACE_OS::open");
26 #if defined (ACE_WIN32)
27 DWORD access
= GENERIC_READ
;
28 if (ACE_BIT_ENABLED (mode
, O_WRONLY
))
29 access
= GENERIC_WRITE
;
30 else if (ACE_BIT_ENABLED (mode
, O_RDWR
))
31 access
= GENERIC_READ
| GENERIC_WRITE
;
33 DWORD creation
= OPEN_EXISTING
;
35 if ((mode
& (_O_CREAT
| _O_EXCL
)) == (_O_CREAT
| _O_EXCL
))
36 creation
= CREATE_NEW
;
37 else if ((mode
& (_O_CREAT
| _O_TRUNC
)) == (_O_CREAT
| _O_TRUNC
))
38 creation
= CREATE_ALWAYS
;
39 else if (ACE_BIT_ENABLED (mode
, _O_CREAT
))
40 creation
= OPEN_ALWAYS
;
41 else if (ACE_BIT_ENABLED (mode
, _O_TRUNC
))
42 creation
= TRUNCATE_EXISTING
;
46 if (ACE_BIT_ENABLED (mode
, _O_TEMPORARY
))
47 flags
|= FILE_FLAG_DELETE_ON_CLOSE
| FILE_ATTRIBUTE_TEMPORARY
;
49 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_WRITE_THROUGH
))
50 flags
|= FILE_FLAG_WRITE_THROUGH
;
51 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_OVERLAPPED
))
52 flags
|= FILE_FLAG_OVERLAPPED
;
53 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_NO_BUFFERING
))
54 flags
|= FILE_FLAG_NO_BUFFERING
;
55 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_RANDOM_ACCESS
))
56 flags
|= FILE_FLAG_RANDOM_ACCESS
;
57 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_SEQUENTIAL_SCAN
))
58 flags
|= FILE_FLAG_SEQUENTIAL_SCAN
;
59 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_DELETE_ON_CLOSE
))
60 flags
|= FILE_FLAG_DELETE_ON_CLOSE
;
61 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_BACKUP_SEMANTICS
))
62 flags
|= FILE_FLAG_BACKUP_SEMANTICS
;
63 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_POSIX_SEMANTICS
))
64 flags
|= FILE_FLAG_POSIX_SEMANTICS
;
66 ACE_MT (ACE_thread_mutex_t
*ace_os_monitor_lock
= 0;)
68 if (ACE_BIT_ENABLED (mode
, _O_APPEND
))
72 ace_os_monitor_lock
= static_cast <ACE_thread_mutex_t
*> (
73 ACE_OS_Object_Manager::preallocated_object
[
74 ACE_OS_Object_Manager::ACE_OS_MONITOR_LOCK
]);
75 ACE_OS::thread_mutex_lock (ace_os_monitor_lock
);
79 DWORD shared_mode
= perms
;
80 SECURITY_ATTRIBUTES sa_buffer
;
81 SECURITY_DESCRIPTOR sd_buffer
;
83 #if defined (ACE_HAS_WINCE)
84 ACE_HANDLE h
= ::CreateFileW (ACE_Ascii_To_Wide (filename
).wchar_rep (),
87 ACE_OS::default_win32_security_attributes_r
88 (sa
, &sa_buffer
, &sd_buffer
),
92 #else /* ACE_HAS_WINCE */
93 ACE_HANDLE h
= ::CreateFileA (filename
,
96 ACE_OS::default_win32_security_attributes_r
97 (sa
, &sa_buffer
, &sd_buffer
),
101 #endif /* ACE_HAS_WINCE */
103 if (ACE_BIT_ENABLED (mode
, _O_APPEND
))
106 if (h
!= ACE_INVALID_HANDLE
107 && ::SetFilePointer (h
,
110 FILE_END
) == INVALID_SET_FILE_POINTER
111 && GetLastError () != NO_ERROR
)
113 ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock
);)
114 ACE_FAIL_RETURN (ACE_INVALID_HANDLE
);
117 ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock
);)
120 if (h
== ACE_INVALID_HANDLE
)
124 #elif defined (INTEGRITY)
126 if(!strcmp(filename
,ACE_DEV_NULL
)) {
127 ACE_OSCALL_RETURN (::AllocateNullConsoleDescriptor(), ACE_HANDLE
, -1);
130 ACE_OSCALL_RETURN (::open (filename
, mode
, perms
), ACE_HANDLE
, -1);
134 ACE_OSCALL_RETURN (::open (filename
, mode
, perms
), ACE_HANDLE
, ACE_INVALID_HANDLE
);
135 #endif /* ACE_WIN32 */
138 #if defined (ACE_HAS_WCHAR)
140 ACE_OS::open (const wchar_t *filename
,
143 LPSECURITY_ATTRIBUTES sa
)
145 #if defined (ACE_WIN32)
146 // @@ (brunsch) Yuck, maybe there is a way to combine the code
147 // here with the char version
149 DWORD access
= GENERIC_READ
;
150 if (ACE_BIT_ENABLED (mode
, O_WRONLY
))
151 access
= GENERIC_WRITE
;
152 else if (ACE_BIT_ENABLED (mode
, O_RDWR
))
153 access
= GENERIC_READ
| GENERIC_WRITE
;
155 DWORD creation
= OPEN_EXISTING
;
157 if ((mode
& (_O_CREAT
| _O_EXCL
)) == (_O_CREAT
| _O_EXCL
))
158 creation
= CREATE_NEW
;
159 else if ((mode
& (_O_CREAT
| _O_TRUNC
)) == (_O_CREAT
| _O_TRUNC
))
160 creation
= CREATE_ALWAYS
;
161 else if (ACE_BIT_ENABLED (mode
, _O_CREAT
))
162 creation
= OPEN_ALWAYS
;
163 else if (ACE_BIT_ENABLED (mode
, _O_TRUNC
))
164 creation
= TRUNCATE_EXISTING
;
168 if (ACE_BIT_ENABLED (mode
, _O_TEMPORARY
))
169 flags
|= FILE_FLAG_DELETE_ON_CLOSE
| FILE_ATTRIBUTE_TEMPORARY
;
171 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_WRITE_THROUGH
))
172 flags
|= FILE_FLAG_WRITE_THROUGH
;
173 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_OVERLAPPED
))
174 flags
|= FILE_FLAG_OVERLAPPED
;
175 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_NO_BUFFERING
))
176 flags
|= FILE_FLAG_NO_BUFFERING
;
177 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_RANDOM_ACCESS
))
178 flags
|= FILE_FLAG_RANDOM_ACCESS
;
179 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_SEQUENTIAL_SCAN
))
180 flags
|= FILE_FLAG_SEQUENTIAL_SCAN
;
181 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_DELETE_ON_CLOSE
))
182 flags
|= FILE_FLAG_DELETE_ON_CLOSE
;
183 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_BACKUP_SEMANTICS
))
184 flags
|= FILE_FLAG_BACKUP_SEMANTICS
;
185 if (ACE_BIT_ENABLED (mode
, FILE_FLAG_POSIX_SEMANTICS
))
186 flags
|= FILE_FLAG_POSIX_SEMANTICS
;
188 ACE_MT (ACE_thread_mutex_t
*ace_os_monitor_lock
= 0;)
190 if (ACE_BIT_ENABLED (mode
, _O_APPEND
))
194 ace_os_monitor_lock
= static_cast <ACE_thread_mutex_t
*> (
195 ACE_OS_Object_Manager::preallocated_object
[
196 ACE_OS_Object_Manager::ACE_OS_MONITOR_LOCK
]);
197 ACE_OS::thread_mutex_lock (ace_os_monitor_lock
);
201 DWORD shared_mode
= perms
;
202 SECURITY_ATTRIBUTES sa_buffer
;
203 SECURITY_DESCRIPTOR sd_buffer
;
205 ACE_HANDLE h
= ::CreateFileW (filename
,
208 ACE_OS::default_win32_security_attributes_r
209 (sa
, &sa_buffer
, &sd_buffer
),
214 if (ACE_BIT_ENABLED (mode
, _O_APPEND
))
217 if (h
!= ACE_INVALID_HANDLE
218 && ::SetFilePointer (h
,
221 FILE_END
) == INVALID_SET_FILE_POINTER
222 && GetLastError () != NO_ERROR
)
224 ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock
);)
225 ACE_FAIL_RETURN (ACE_INVALID_HANDLE
);
228 ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock
);)
231 if (h
== ACE_INVALID_HANDLE
)
235 #else /* ACE_WIN32 */
236 // Just emulate with ascii version
237 return ACE_OS::open (ACE_Wide_To_Ascii (filename
).char_rep (),
241 #endif /* ACE_WIN32 */
243 #endif /* ACE_HAS_WCHAR */
245 ACE_END_VERSIONED_NAMESPACE_DECL