mirror of https://gitee.com/bigwinds/arangodb
fixed memleak
This commit is contained in:
parent
94b3b1b0db
commit
52b200e870
|
@ -556,9 +556,10 @@ int TRI_CreateRecursiveDirectory (char const* path,
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief creates a directory
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int TRI_CreateDirectory (char const* path,
|
||||
long &systemError,
|
||||
std::string &systemErrorStr) {
|
||||
long& systemError,
|
||||
std::string& systemErrorStr) {
|
||||
TRI_ERRORBUF;
|
||||
int res;
|
||||
|
||||
|
@ -567,36 +568,29 @@ int TRI_CreateDirectory (char const* path,
|
|||
|
||||
res = TRI_MKDIR(path, 0777);
|
||||
|
||||
if (res != TRI_ERROR_NO_ERROR) {
|
||||
// check errno
|
||||
TRI_SYSTEM_ERROR();
|
||||
res = errno;
|
||||
if (res != TRI_ERROR_NO_ERROR) {
|
||||
systemErrorStr = std::string("Failed to create directory [") + path + "] " + TRI_GET_ERRORBUF;
|
||||
|
||||
if (res == ENOENT) {
|
||||
res = TRI_ERROR_FILE_NOT_FOUND;
|
||||
}
|
||||
else if (res == EEXIST) {
|
||||
res = TRI_ERROR_FILE_EXISTS;
|
||||
}
|
||||
else if (res == EPERM) {
|
||||
res = TRI_ERROR_FORBIDDEN;
|
||||
}
|
||||
else {
|
||||
res = TRI_ERROR_INTERNAL;
|
||||
}
|
||||
systemError = errno;
|
||||
// an unknown error type. will be translated into system error below
|
||||
}
|
||||
|
||||
// if errno doesn't indicate an error, return a system error
|
||||
if (res == TRI_ERROR_NO_ERROR) {
|
||||
res = TRI_ERROR_SYS_ERROR;
|
||||
}
|
||||
if (res == TRI_ERROR_NO_ERROR) {
|
||||
return res;
|
||||
}
|
||||
|
||||
return res;
|
||||
// check errno
|
||||
TRI_SYSTEM_ERROR();
|
||||
res = errno;
|
||||
if (res != TRI_ERROR_NO_ERROR) {
|
||||
systemErrorStr = std::string("Failed to create directory [") + path + "] " + TRI_GET_ERRORBUF;
|
||||
systemError = res;
|
||||
|
||||
if (res == ENOENT) {
|
||||
return TRI_ERROR_FILE_NOT_FOUND;
|
||||
}
|
||||
if (res == EEXIST) {
|
||||
return TRI_ERROR_FILE_EXISTS;
|
||||
}
|
||||
if (res == EPERM) {
|
||||
return TRI_ERROR_FORBIDDEN;
|
||||
}
|
||||
}
|
||||
|
||||
return TRI_ERROR_SYS_ERROR;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -604,9 +598,7 @@ int TRI_CreateDirectory (char const* path,
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int TRI_RemoveEmptyDirectory (char const* filename) {
|
||||
int res;
|
||||
|
||||
res = TRI_RMDIR(filename);
|
||||
int res = TRI_RMDIR(filename);
|
||||
|
||||
if (res != 0) {
|
||||
LOG_TRACE("cannot remove directory '%s': %s", filename, TRI_LAST_ERROR_STR);
|
||||
|
@ -2029,6 +2021,7 @@ int TRI_GetTempName (char const* directory,
|
|||
res = TRI_CreateRecursiveDirectory(dir, systemError, errorMessage);
|
||||
if ((res != TRI_ERROR_FILE_EXISTS) &&
|
||||
(res != TRI_ERROR_NO_ERROR)) {
|
||||
TRI_Free(TRI_CORE_MEM_ZONE, dir);
|
||||
return res;
|
||||
}
|
||||
if (! TRI_IsDirectory(dir)) {
|
||||
|
|
|
@ -187,7 +187,7 @@
|
|||
#define TRI_stat_t struct stat
|
||||
|
||||
#define TRI_LAST_ERROR_STR strerror(errno)
|
||||
#define TRI_SYSTEM_ERROR() strerror(errno)
|
||||
#define TRI_SYSTEM_ERROR() {}
|
||||
#define TRI_ERRORBUF {}
|
||||
#define TRI_GET_ERRORBUF strerror(errno)
|
||||
|
||||
|
@ -341,7 +341,7 @@
|
|||
#define TRI_stat_t struct stat
|
||||
|
||||
#define TRI_LAST_ERROR_STR strerror(errno)
|
||||
#define TRI_SYSTEM_ERROR() strerror(errno)
|
||||
#define TRI_SYSTEM_ERROR() {}
|
||||
#define TRI_ERRORBUF {}
|
||||
#define TRI_GET_ERRORBUF strerror(errno)
|
||||
|
||||
|
@ -508,7 +508,7 @@
|
|||
#define TRI_stat_t struct stat
|
||||
|
||||
#define TRI_LAST_ERROR_STR strerror(errno)
|
||||
#define TRI_SYSTEM_ERROR() strerror(errno)
|
||||
#define TRI_SYSTEM_ERROR() {}
|
||||
#define TRI_ERRORBUF {}
|
||||
#define TRI_GET_ERRORBUF strerror(errno)
|
||||
|
||||
|
@ -732,21 +732,20 @@ typedef unsigned char bool;
|
|||
|
||||
#define TRI_ERRORBUF char windowsErrorBuf[256]
|
||||
#define TRI_GET_ERRORBUF windowsErrorBuf
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief Return system error string
|
||||
/// macro requires ERRORBUF to instanciate its buffer before.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
long mapGetlastErrorToErrno(DWORD error);
|
||||
|
||||
#define TRI_SYSTEM_ERROR() \
|
||||
windowsErrorBuf; \
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, \
|
||||
NULL, \
|
||||
GetLastError(), \
|
||||
0, \
|
||||
windowsErrorBuf, \
|
||||
sizeof(windowsErrorBuf), NULL); \
|
||||
errno = mapGetlastErrorToErrno(GetLastError())
|
||||
errno = TRI_MapSystemError(GetLastError())
|
||||
|
||||
|
||||
#define STDIN_FILENO 0
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
/// @author Copyright 2014, ArangoDB GmbH, Cologne, Germany
|
||||
/// @author Copyright 2011-2013, triAGENS GmbH, Cologne, Germany
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <io.h>
|
||||
|
@ -391,89 +392,92 @@ void TRI_FixIcuDataEnv () {
|
|||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief converts a Windows error to a *nix system error
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
long mapGetlastErrorToErrno(DWORD error) {
|
||||
int TRI_MapSystemError (DWORD error) {
|
||||
switch (error) {
|
||||
case ERROR_INVALID_FUNCTION: return EINVAL;
|
||||
case ERROR_FILE_NOT_FOUND: return ENOENT;
|
||||
case ERROR_PATH_NOT_FOUND: return ENOENT;
|
||||
case ERROR_TOO_MANY_OPEN_FILES: return EMFILE;
|
||||
case ERROR_ACCESS_DENIED: return EACCES;
|
||||
case ERROR_INVALID_HANDLE: return EBADF;
|
||||
case ERROR_NOT_ENOUGH_MEMORY: return ENOMEM;
|
||||
case ERROR_INVALID_DATA: return EINVAL;
|
||||
case ERROR_OUTOFMEMORY: return ENOMEM;
|
||||
case ERROR_INVALID_DRIVE: return ENODEV;
|
||||
case ERROR_NOT_SAME_DEVICE: return EXDEV;
|
||||
case ERROR_NO_MORE_FILES: return ENFILE;
|
||||
case ERROR_WRITE_PROTECT: return EROFS;
|
||||
case ERROR_BAD_UNIT: return ENODEV;
|
||||
case ERROR_SHARING_VIOLATION: return EACCES;
|
||||
case ERROR_LOCK_VIOLATION: return EACCES;
|
||||
case ERROR_SHARING_BUFFER_EXCEEDED: return ENOLCK;
|
||||
case ERROR_HANDLE_EOF: return ENODATA;
|
||||
case ERROR_HANDLE_DISK_FULL: return ENOSPC;
|
||||
case ERROR_NOT_SUPPORTED: return ENOSYS;
|
||||
case ERROR_REM_NOT_LIST: return ENFILE;
|
||||
case ERROR_DUP_NAME: return EEXIST;
|
||||
case ERROR_BAD_NETPATH: return EBADF;
|
||||
case ERROR_BAD_NET_NAME: return EBADF;
|
||||
case ERROR_FILE_EXISTS: return EEXIST;
|
||||
case ERROR_CANNOT_MAKE: return EPERM;
|
||||
case ERROR_INVALID_PARAMETER: return EINVAL;
|
||||
case ERROR_NO_PROC_SLOTS: return EAGAIN;
|
||||
case ERROR_BROKEN_PIPE: return EPIPE;
|
||||
case ERROR_OPEN_FAILED: return EIO;
|
||||
case ERROR_NO_MORE_SEARCH_HANDLES: return ENFILE;
|
||||
case ERROR_CALL_NOT_IMPLEMENTED: return ENOSYS;
|
||||
case ERROR_INVALID_NAME: return ENOENT;
|
||||
case ERROR_WAIT_NO_CHILDREN: return ECHILD;
|
||||
case ERROR_CHILD_NOT_COMPLETE: return EBUSY;
|
||||
case ERROR_DIR_NOT_EMPTY: return ENOTEMPTY;
|
||||
case ERROR_SIGNAL_REFUSED: return EIO;
|
||||
case ERROR_BAD_PATHNAME: return ENOENT;
|
||||
case ERROR_SIGNAL_PENDING: return EBUSY;
|
||||
case ERROR_MAX_THRDS_REACHED: return EAGAIN;
|
||||
case ERROR_BUSY: return EBUSY;
|
||||
case ERROR_ALREADY_EXISTS: return EEXIST;
|
||||
case ERROR_NO_SIGNAL_SENT: return EIO;
|
||||
case ERROR_FILENAME_EXCED_RANGE: return ENAMETOOLONG;
|
||||
case ERROR_META_EXPANSION_TOO_LONG: return EINVAL;
|
||||
case ERROR_INVALID_SIGNAL_NUMBER: return EINVAL;
|
||||
case ERROR_THREAD_1_INACTIVE: return EINVAL;
|
||||
case ERROR_BAD_PIPE: return EINVAL;
|
||||
case ERROR_PIPE_BUSY: return EBUSY;
|
||||
case ERROR_NO_DATA: return EPIPE;
|
||||
case ERROR_PIPE_NOT_CONNECTED: return EPIPE;
|
||||
case ERROR_MORE_DATA: return EAGAIN;
|
||||
case ERROR_DIRECTORY: return ENOTDIR;
|
||||
case ERROR_PIPE_CONNECTED: return EBUSY;
|
||||
case ERROR_PIPE_LISTENING: return EPIPE;
|
||||
case ERROR_NO_TOKEN: return EINVAL;
|
||||
case ERROR_PROCESS_ABORTED: return EFAULT;
|
||||
case ERROR_BAD_DEVICE: return ENODEV;
|
||||
case ERROR_BAD_USERNAME: return EINVAL;
|
||||
case ERROR_NOT_CONNECTED: return ENOLINK;
|
||||
case ERROR_OPEN_FILES: return EAGAIN;
|
||||
case ERROR_ACTIVE_CONNECTIONS: return EAGAIN;
|
||||
case ERROR_DEVICE_IN_USE: return EAGAIN;
|
||||
case ERROR_INVALID_AT_INTERRUPT_TIME: return EINTR;
|
||||
case ERROR_IO_DEVICE: return EIO;
|
||||
case ERROR_NOT_OWNER: return EPERM;
|
||||
case ERROR_END_OF_MEDIA: return ENOSPC;
|
||||
case ERROR_EOM_OVERFLOW: return ENOSPC;
|
||||
case ERROR_BEGINNING_OF_MEDIA: return ESPIPE;
|
||||
case ERROR_SETMARK_DETECTED: return ESPIPE;
|
||||
case ERROR_NO_DATA_DETECTED: return ENOSPC;
|
||||
case ERROR_POSSIBLE_DEADLOCK: return EDEADLOCK;
|
||||
case ERROR_CRC: return EIO;
|
||||
case ERROR_NEGATIVE_SEEK: return EINVAL;
|
||||
case ERROR_NOT_READY: return EBADF;
|
||||
case ERROR_DISK_FULL: return ENOSPC;
|
||||
case ERROR_NOACCESS: return EFAULT;
|
||||
case ERROR_FILE_INVALID: return ENXIO;
|
||||
default: return EINVAL;
|
||||
}
|
||||
case ERROR_INVALID_FUNCTION: return EINVAL;
|
||||
case ERROR_FILE_NOT_FOUND: return ENOENT;
|
||||
case ERROR_PATH_NOT_FOUND: return ENOENT;
|
||||
case ERROR_TOO_MANY_OPEN_FILES: return EMFILE;
|
||||
case ERROR_ACCESS_DENIED: return EACCES;
|
||||
case ERROR_INVALID_HANDLE: return EBADF;
|
||||
case ERROR_NOT_ENOUGH_MEMORY: return ENOMEM;
|
||||
case ERROR_INVALID_DATA: return EINVAL;
|
||||
case ERROR_OUTOFMEMORY: return ENOMEM;
|
||||
case ERROR_INVALID_DRIVE: return ENODEV;
|
||||
case ERROR_NOT_SAME_DEVICE: return EXDEV;
|
||||
case ERROR_NO_MORE_FILES: return ENFILE;
|
||||
case ERROR_WRITE_PROTECT: return EROFS;
|
||||
case ERROR_BAD_UNIT: return ENODEV;
|
||||
case ERROR_SHARING_VIOLATION: return EACCES;
|
||||
case ERROR_LOCK_VIOLATION: return EACCES;
|
||||
case ERROR_SHARING_BUFFER_EXCEEDED: return ENOLCK;
|
||||
case ERROR_HANDLE_EOF: return ENODATA;
|
||||
case ERROR_HANDLE_DISK_FULL: return ENOSPC;
|
||||
case ERROR_NOT_SUPPORTED: return ENOSYS;
|
||||
case ERROR_REM_NOT_LIST: return ENFILE;
|
||||
case ERROR_DUP_NAME: return EEXIST;
|
||||
case ERROR_BAD_NETPATH: return EBADF;
|
||||
case ERROR_BAD_NET_NAME: return EBADF;
|
||||
case ERROR_FILE_EXISTS: return EEXIST;
|
||||
case ERROR_CANNOT_MAKE: return EPERM;
|
||||
case ERROR_INVALID_PARAMETER: return EINVAL;
|
||||
case ERROR_NO_PROC_SLOTS: return EAGAIN;
|
||||
case ERROR_BROKEN_PIPE: return EPIPE;
|
||||
case ERROR_OPEN_FAILED: return EIO;
|
||||
case ERROR_NO_MORE_SEARCH_HANDLES: return ENFILE;
|
||||
case ERROR_CALL_NOT_IMPLEMENTED: return ENOSYS;
|
||||
case ERROR_INVALID_NAME: return ENOENT;
|
||||
case ERROR_WAIT_NO_CHILDREN: return ECHILD;
|
||||
case ERROR_CHILD_NOT_COMPLETE: return EBUSY;
|
||||
case ERROR_DIR_NOT_EMPTY: return ENOTEMPTY;
|
||||
case ERROR_SIGNAL_REFUSED: return EIO;
|
||||
case ERROR_BAD_PATHNAME: return ENOENT;
|
||||
case ERROR_SIGNAL_PENDING: return EBUSY;
|
||||
case ERROR_MAX_THRDS_REACHED: return EAGAIN;
|
||||
case ERROR_BUSY: return EBUSY;
|
||||
case ERROR_ALREADY_EXISTS: return EEXIST;
|
||||
case ERROR_NO_SIGNAL_SENT: return EIO;
|
||||
case ERROR_FILENAME_EXCED_RANGE: return ENAMETOOLONG;
|
||||
case ERROR_META_EXPANSION_TOO_LONG: return EINVAL;
|
||||
case ERROR_INVALID_SIGNAL_NUMBER: return EINVAL;
|
||||
case ERROR_THREAD_1_INACTIVE: return EINVAL;
|
||||
case ERROR_BAD_PIPE: return EINVAL;
|
||||
case ERROR_PIPE_BUSY: return EBUSY;
|
||||
case ERROR_NO_DATA: return EPIPE;
|
||||
case ERROR_PIPE_NOT_CONNECTED: return EPIPE;
|
||||
case ERROR_MORE_DATA: return EAGAIN;
|
||||
case ERROR_DIRECTORY: return ENOTDIR;
|
||||
case ERROR_PIPE_CONNECTED: return EBUSY;
|
||||
case ERROR_PIPE_LISTENING: return EPIPE;
|
||||
case ERROR_NO_TOKEN: return EINVAL;
|
||||
case ERROR_PROCESS_ABORTED: return EFAULT;
|
||||
case ERROR_BAD_DEVICE: return ENODEV;
|
||||
case ERROR_BAD_USERNAME: return EINVAL;
|
||||
case ERROR_NOT_CONNECTED: return ENOLINK;
|
||||
case ERROR_OPEN_FILES: return EAGAIN;
|
||||
case ERROR_ACTIVE_CONNECTIONS: return EAGAIN;
|
||||
case ERROR_DEVICE_IN_USE: return EAGAIN;
|
||||
case ERROR_INVALID_AT_INTERRUPT_TIME: return EINTR;
|
||||
case ERROR_IO_DEVICE: return EIO;
|
||||
case ERROR_NOT_OWNER: return EPERM;
|
||||
case ERROR_END_OF_MEDIA: return ENOSPC;
|
||||
case ERROR_EOM_OVERFLOW: return ENOSPC;
|
||||
case ERROR_BEGINNING_OF_MEDIA: return ESPIPE;
|
||||
case ERROR_SETMARK_DETECTED: return ESPIPE;
|
||||
case ERROR_NO_DATA_DETECTED: return ENOSPC;
|
||||
case ERROR_POSSIBLE_DEADLOCK: return EDEADLOCK;
|
||||
case ERROR_CRC: return EIO;
|
||||
case ERROR_NEGATIVE_SEEK: return EINVAL;
|
||||
case ERROR_NOT_READY: return EBADF;
|
||||
case ERROR_DISK_FULL: return ENOSPC;
|
||||
case ERROR_NOACCESS: return EFAULT;
|
||||
case ERROR_FILE_INVALID: return ENXIO;
|
||||
default: return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
|
@ -88,7 +88,6 @@ int TRI_OPEN_WIN32 (const char* filename, int openFlags);
|
|||
|
||||
void TRI_sleep (unsigned long);
|
||||
|
||||
|
||||
// .............................................................................
|
||||
// there is no usleep (micro sleep) in windows, so we create one here
|
||||
// .............................................................................
|
||||
|
@ -101,6 +100,12 @@ void TRI_usleep (unsigned long);
|
|||
|
||||
void TRI_FixIcuDataEnv ();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief converts a Windows error to a *nix system error
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int TRI_MapSystemError (DWORD);
|
||||
|
||||
#endif
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue