mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 01:37:00 +00:00
243 lines
7.7 KiB
C++
243 lines
7.7 KiB
C++
// $Id: OS_NS_fcntl.cpp 91781 2010-09-15 12:49:15Z johnnyw $
|
|
|
|
#include "ace/OS_NS_fcntl.h"
|
|
|
|
#if !defined (ACE_HAS_INLINED_OSCALLS)
|
|
# include "ace/OS_NS_fcntl.inl"
|
|
#endif /* ACE_HAS_INLINED_OSCALLS */
|
|
|
|
#include "ace/OS_NS_stdio.h"
|
|
#include "ace/OS_NS_Thread.h"
|
|
#include "ace/OS_NS_macros.h"
|
|
#include "ace/Object_Manager_Base.h"
|
|
|
|
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
|
|
|
|
ACE_HANDLE
|
|
ACE_OS::open (const char *filename,
|
|
int mode,
|
|
mode_t perms,
|
|
LPSECURITY_ATTRIBUTES sa)
|
|
{
|
|
ACE_OS_TRACE ("ACE_OS::open");
|
|
|
|
#if defined (ACE_WIN32)
|
|
DWORD access = GENERIC_READ;
|
|
if (ACE_BIT_ENABLED (mode, O_WRONLY))
|
|
access = GENERIC_WRITE;
|
|
else if (ACE_BIT_ENABLED (mode, O_RDWR))
|
|
access = GENERIC_READ | GENERIC_WRITE;
|
|
|
|
DWORD creation = OPEN_EXISTING;
|
|
|
|
if ((mode & (_O_CREAT | _O_EXCL)) == (_O_CREAT | _O_EXCL))
|
|
creation = CREATE_NEW;
|
|
else if ((mode & (_O_CREAT | _O_TRUNC)) == (_O_CREAT | _O_TRUNC))
|
|
creation = CREATE_ALWAYS;
|
|
else if (ACE_BIT_ENABLED (mode, _O_CREAT))
|
|
creation = OPEN_ALWAYS;
|
|
else if (ACE_BIT_ENABLED (mode, _O_TRUNC))
|
|
creation = TRUNCATE_EXISTING;
|
|
|
|
DWORD flags = 0;
|
|
|
|
if (ACE_BIT_ENABLED (mode, _O_TEMPORARY))
|
|
flags |= FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY;
|
|
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_WRITE_THROUGH))
|
|
flags |= FILE_FLAG_WRITE_THROUGH;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_OVERLAPPED))
|
|
flags |= FILE_FLAG_OVERLAPPED;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_NO_BUFFERING))
|
|
flags |= FILE_FLAG_NO_BUFFERING;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_RANDOM_ACCESS))
|
|
flags |= FILE_FLAG_RANDOM_ACCESS;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_SEQUENTIAL_SCAN))
|
|
flags |= FILE_FLAG_SEQUENTIAL_SCAN;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_DELETE_ON_CLOSE))
|
|
flags |= FILE_FLAG_DELETE_ON_CLOSE;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_BACKUP_SEMANTICS))
|
|
flags |= FILE_FLAG_BACKUP_SEMANTICS;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_POSIX_SEMANTICS))
|
|
flags |= FILE_FLAG_POSIX_SEMANTICS;
|
|
|
|
ACE_MT (ACE_thread_mutex_t *ace_os_monitor_lock = 0;)
|
|
|
|
if (ACE_BIT_ENABLED (mode, _O_APPEND))
|
|
{
|
|
ACE_MT
|
|
(
|
|
ace_os_monitor_lock = static_cast <ACE_thread_mutex_t *> (
|
|
ACE_OS_Object_Manager::preallocated_object[
|
|
ACE_OS_Object_Manager::ACE_OS_MONITOR_LOCK]);
|
|
ACE_OS::thread_mutex_lock (ace_os_monitor_lock);
|
|
)
|
|
}
|
|
|
|
DWORD shared_mode = perms;
|
|
SECURITY_ATTRIBUTES sa_buffer;
|
|
SECURITY_DESCRIPTOR sd_buffer;
|
|
|
|
#if defined (ACE_HAS_WINCE)
|
|
ACE_HANDLE h = ::CreateFileW (ACE_Ascii_To_Wide (filename).wchar_rep (),
|
|
access,
|
|
shared_mode,
|
|
ACE_OS::default_win32_security_attributes_r
|
|
(sa, &sa_buffer, &sd_buffer),
|
|
creation,
|
|
flags,
|
|
0);
|
|
#else /* ACE_HAS_WINCE */
|
|
ACE_HANDLE h = ::CreateFileA (filename,
|
|
access,
|
|
shared_mode,
|
|
ACE_OS::default_win32_security_attributes_r
|
|
(sa, &sa_buffer, &sd_buffer),
|
|
creation,
|
|
flags,
|
|
0);
|
|
#endif /* ACE_HAS_WINCE */
|
|
|
|
if (ACE_BIT_ENABLED (mode, _O_APPEND))
|
|
{
|
|
LONG high_size = 0;
|
|
if (h != ACE_INVALID_HANDLE
|
|
&& ::SetFilePointer (h,
|
|
0,
|
|
&high_size,
|
|
FILE_END) == INVALID_SET_FILE_POINTER
|
|
&& GetLastError () != NO_ERROR)
|
|
{
|
|
ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock);)
|
|
ACE_FAIL_RETURN (ACE_INVALID_HANDLE);
|
|
}
|
|
|
|
ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock);)
|
|
}
|
|
|
|
if (h == ACE_INVALID_HANDLE)
|
|
ACE_FAIL_RETURN (h);
|
|
else
|
|
return h;
|
|
#elif defined (INTEGRITY)
|
|
ACE_UNUSED_ARG (sa);
|
|
if(!strcmp(filename,ACE_DEV_NULL)) {
|
|
ACE_OSCALL_RETURN (::AllocateNullConsoleDescriptor(), ACE_HANDLE, -1);
|
|
}
|
|
else {
|
|
ACE_OSCALL_RETURN (::open (filename, mode, perms), ACE_HANDLE, -1);
|
|
}
|
|
#else
|
|
ACE_UNUSED_ARG (sa);
|
|
ACE_OSCALL_RETURN (::open (filename, mode, perms), ACE_HANDLE, ACE_INVALID_HANDLE);
|
|
#endif /* ACE_WIN32 */
|
|
}
|
|
|
|
#if defined (ACE_HAS_WCHAR)
|
|
ACE_HANDLE
|
|
ACE_OS::open (const wchar_t *filename,
|
|
int mode,
|
|
mode_t perms,
|
|
LPSECURITY_ATTRIBUTES sa)
|
|
{
|
|
#if defined (ACE_WIN32)
|
|
// @@ (brunsch) Yuck, maybe there is a way to combine the code
|
|
// here with the char version
|
|
|
|
DWORD access = GENERIC_READ;
|
|
if (ACE_BIT_ENABLED (mode, O_WRONLY))
|
|
access = GENERIC_WRITE;
|
|
else if (ACE_BIT_ENABLED (mode, O_RDWR))
|
|
access = GENERIC_READ | GENERIC_WRITE;
|
|
|
|
DWORD creation = OPEN_EXISTING;
|
|
|
|
if ((mode & (_O_CREAT | _O_EXCL)) == (_O_CREAT | _O_EXCL))
|
|
creation = CREATE_NEW;
|
|
else if ((mode & (_O_CREAT | _O_TRUNC)) == (_O_CREAT | _O_TRUNC))
|
|
creation = CREATE_ALWAYS;
|
|
else if (ACE_BIT_ENABLED (mode, _O_CREAT))
|
|
creation = OPEN_ALWAYS;
|
|
else if (ACE_BIT_ENABLED (mode, _O_TRUNC))
|
|
creation = TRUNCATE_EXISTING;
|
|
|
|
DWORD flags = 0;
|
|
|
|
if (ACE_BIT_ENABLED (mode, _O_TEMPORARY))
|
|
flags |= FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY;
|
|
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_WRITE_THROUGH))
|
|
flags |= FILE_FLAG_WRITE_THROUGH;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_OVERLAPPED))
|
|
flags |= FILE_FLAG_OVERLAPPED;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_NO_BUFFERING))
|
|
flags |= FILE_FLAG_NO_BUFFERING;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_RANDOM_ACCESS))
|
|
flags |= FILE_FLAG_RANDOM_ACCESS;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_SEQUENTIAL_SCAN))
|
|
flags |= FILE_FLAG_SEQUENTIAL_SCAN;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_DELETE_ON_CLOSE))
|
|
flags |= FILE_FLAG_DELETE_ON_CLOSE;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_BACKUP_SEMANTICS))
|
|
flags |= FILE_FLAG_BACKUP_SEMANTICS;
|
|
if (ACE_BIT_ENABLED (mode, FILE_FLAG_POSIX_SEMANTICS))
|
|
flags |= FILE_FLAG_POSIX_SEMANTICS;
|
|
|
|
ACE_MT (ACE_thread_mutex_t *ace_os_monitor_lock = 0;)
|
|
|
|
if (ACE_BIT_ENABLED (mode, _O_APPEND))
|
|
{
|
|
ACE_MT
|
|
(
|
|
ace_os_monitor_lock = static_cast <ACE_thread_mutex_t *> (
|
|
ACE_OS_Object_Manager::preallocated_object[
|
|
ACE_OS_Object_Manager::ACE_OS_MONITOR_LOCK]);
|
|
ACE_OS::thread_mutex_lock (ace_os_monitor_lock);
|
|
)
|
|
}
|
|
|
|
DWORD shared_mode = perms;
|
|
SECURITY_ATTRIBUTES sa_buffer;
|
|
SECURITY_DESCRIPTOR sd_buffer;
|
|
|
|
ACE_HANDLE h = ::CreateFileW (filename,
|
|
access,
|
|
shared_mode,
|
|
ACE_OS::default_win32_security_attributes_r
|
|
(sa, &sa_buffer, &sd_buffer),
|
|
creation,
|
|
flags,
|
|
0);
|
|
|
|
if (ACE_BIT_ENABLED (mode, _O_APPEND))
|
|
{
|
|
LONG high_size = 0;
|
|
if (h != ACE_INVALID_HANDLE
|
|
&& ::SetFilePointer (h,
|
|
0,
|
|
&high_size,
|
|
FILE_END) == INVALID_SET_FILE_POINTER
|
|
&& GetLastError () != NO_ERROR)
|
|
{
|
|
ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock);)
|
|
ACE_FAIL_RETURN (ACE_INVALID_HANDLE);
|
|
}
|
|
|
|
ACE_MT (ACE_OS::thread_mutex_unlock (ace_os_monitor_lock);)
|
|
}
|
|
|
|
if (h == ACE_INVALID_HANDLE)
|
|
ACE_FAIL_RETURN (h);
|
|
else
|
|
return h;
|
|
#else /* ACE_WIN32 */
|
|
// Just emulate with ascii version
|
|
return ACE_OS::open (ACE_Wide_To_Ascii (filename).char_rep (),
|
|
mode,
|
|
perms,
|
|
sa);
|
|
#endif /* ACE_WIN32 */
|
|
}
|
|
#endif /* ACE_HAS_WCHAR */
|
|
|
|
ACE_END_VERSIONED_NAMESPACE_DECL
|