From: Quanah Gibson-Mount Date: Wed, 29 Apr 2009 03:48:30 +0000 (+0000) Subject: ITS#6041 X-Git-Tag: OPENLDAP_REL_ENG_2_4_17~123 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=30a9b1d724fcf90dc8b0acd2d6b4e82855c0de24;p=openldap ITS#6041 --- diff --git a/CHANGES b/CHANGES index def7686cc4..a8d48a59cc 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ OpenLDAP 2.4 Change Log OpenLDAP 2.4.17 Engineering Fixed libldap gnutls private key init (ITS#6053) + Fixed liblutil opendir/closedir on windows (ITS#6041) Fixed slapd errno handling (ITS#6037) Fixed slapd global alloc handling (ITS#6054) Fixed slapd moduleload with static backends and modules (ITS#6016) diff --git a/include/ac/dirent.h b/include/ac/dirent.h index cdc21994d5..1cb16bcab1 100644 --- a/include/ac/dirent.h +++ b/include/ac/dirent.h @@ -34,6 +34,9 @@ typedef struct DIR { int first; char buf[MAX_PATH+1]; } DIR; +DIR *opendir(const char *name); +struct dirent *readdir(DIR *dir); +int closedir(DIR *dir); #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen diff --git a/libraries/liblutil/utils.c b/libraries/liblutil/utils.c index 0be045a361..cccb2d1099 100644 --- a/libraries/liblutil/utils.c +++ b/libraries/liblutil/utils.c @@ -466,6 +466,40 @@ int mkstemp( char * template ) #endif #ifdef _MSC_VER +/* Equivalent of MS CRT's _dosmaperr(). + * @param lastError[in] Result of GetLastError(). + */ +static errno_t win2errno(DWORD lastError) +{ + const struct { + DWORD windows_code; + errno_t errno_code; + } WIN2ERRNO_TABLE[] = { + { ERROR_SUCCESS, 0 }, + { ERROR_FILE_NOT_FOUND, ENOENT }, + { ERROR_PATH_NOT_FOUND, ENOENT }, + { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, + { ERROR_ACCESS_DENIED, EACCES }, + { ERROR_INVALID_HANDLE, EBADF }, + { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, + { ERROR_LOCK_VIOLATION, EACCES }, + { ERROR_FILE_EXISTS, EEXIST }, + { ERROR_INVALID_PARAMETER, EINVAL }, + { ERROR_FILENAME_EXCED_RANGE, ENAMETOOLONG }, + }; + const unsigned int WIN2ERRNO_TABLE_SIZE = sizeof(WIN2ERRNO_TABLE) / +sizeof(WIN2ERRNO_TABLE[0]); + const errno_t DEFAULT_ERRNO_ERROR = -1; + unsigned int i; + + for (i = 0; i < WIN2ERRNO_TABLE_SIZE; ++i) { + if (WIN2ERRNO_TABLE[i].windows_code == lastError) { + return WIN2ERRNO_TABLE[i].errno_code; + } + } + return DEFAULT_ERRNO_ERROR; +} + struct dirent { char *d_name; }; @@ -483,8 +517,10 @@ DIR *opendir( char *path ) HANDLE h; WIN32_FIND_DATA data; - if (len+3 >= sizeof(tmp)) + if (len+3 >= sizeof(tmp)) { + errno = ENAMETOOLONG; return NULL; + } strcpy(tmp, path); tmp[len++] = '\\'; @@ -492,9 +528,11 @@ DIR *opendir( char *path ) tmp[len] = '\0'; h = FindFirstFile( tmp, &data ); - - if ( h == INVALID_HANDLE_VALUE ) + + if ( h == INVALID_HANDLE_VALUE ) { + errno = win2errno( GetLastError()); return NULL; + } d = ber_memalloc( sizeof(DIR) ); if ( !d ) @@ -518,7 +556,7 @@ struct dirent *readdir(DIR *dir) } return &dir->data; } -void closedir(DIR *dir) +int closedir(DIR *dir) { FindClose(dir->dir); ber_memfree(dir);