X-Git-Url: https://git.openssl.org/?a=blobdiff_plain;f=crypto%2FLPdir_win.c;h=3bcc11982d4ce910224bf6cb66389fe0362f3f2e;hb=4aa5889e1a1f21ecc1d5861d6d8b1b34a2fb712c;hp=1a2663cf1e4444488489b73db51572f277aef703;hpb=210a4f78ae78799f7dc8f4b115c3727eb2d24bd8;p=openssl.git diff --git a/crypto/LPdir_win.c b/crypto/LPdir_win.c index 1a2663cf1e..3bcc11982d 100644 --- a/crypto/LPdir_win.c +++ b/crypto/LPdir_win.c @@ -1,4 +1,4 @@ -/* $LP: LPlib/source/LPdir_win.c,v 1.3 2004/07/19 16:34:54 _cvs_levitte Exp $ */ +/* $LP: LPlib/source/LPdir_win.c,v 1.6 2004/07/21 21:16:23 _cvs_levitte Exp $ */ /* * Copyright (c) 2004, Richard Levitte * All rights reserved. @@ -25,10 +25,22 @@ * SUCH DAMAGE. */ #include +#include #ifndef LPDIR_H #include "LPdir.h" #endif +/* We're most likely overcautious here, but let's reserve for + broken WinCE headers and explicitly opt for UNICODE call. + Keep in mind that our WinCE builds are compiled with -DUNICODE + [as well as -D_UNICODE]. */ +#if defined(LP_SYS_WINCE) && !defined(FindFirstFile) +# define FindFirstFile FindFirstFileW +#endif +#if defined(LP_SYS_WINCE) && !defined(FindFirstFile) +# define FindNextFile FindNextFileW +#endif + struct LP_dir_context_st { WIN32_FIND_DATA ctx; @@ -57,29 +69,33 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory) } memset(*ctx, '\0', sizeof(LP_DIR_CTX)); -#ifdef LP_SYS_WINCE - { - WCHAR *wdir = NULL; - size_t index = 0; + if (sizeof(TCHAR) != sizeof(char)) + { + TCHAR *wdir = NULL; + /* len_0 denotes string length *with* trailing 0 */ + size_t index = 0,len_0 = strlen(direcory) + 1; - wdir = (WCHAR *)malloc((strlen(directory) + 1) * 2); - if (wdir == NULL) - { - errno = ENOMEM; - free(*ctx); - return 0; - } + wdir = (TCHAR *)malloc(len_0 * sizeof(TCHAR)); + if (wdir == NULL) + { + free(*ctx); + *ctx = NULL; + errno = ENOMEM; + return 0; + } - for (index = 0; index < strlen(directory) + 1; index++) - wdir[index] = (short)directory[index]; +#ifdef LP_MULTIBYTE_AVAILABLE + if (!MultiByteToWideChar(CP_ACP, 0, directory, len_0, wdir, len_0)) +#endif + for (index = 0; index < len_0; index++) + wdir[index] = (TCHAR)directory[index]; - (*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx); + (*ctx)->handle = FindFirstFile(wdir, &(*ctx)->ctx); - free(wdir); - } -#else - (*ctx)->handle = FindFirstFile(directory, &(*ctx)->ctx); -#endif + free(wdir); + } + else + (*ctx)->handle = FindFirstFile(directory, &(*ctx)->ctx); if ((*ctx)->handle == INVALID_HANDLE_VALUE) { @@ -97,8 +113,27 @@ const char *LP_find_file(LP_DIR_CTX **ctx, const char *directory) } } - strncpy((*ctx)->entry_name, (*ctx)->ctx.cFileName, - sizeof((*ctx)->entry_name)); + if (sizeof(TCHAR) != sizeof(char)) + { + TCHAR *wdir = (*ctx)->ctx.cFileName; + size_t index, len_0 = 0; + + while (wdir[len] && len < (sizeof((*ctx)->entry_name) - 1)) len_0++; + len_0++; + +#ifdef LP_MULTIBYTE_AVAILABLE + if (!WideCharToMultiByte(CP_ACP, 0, wdir, len_0, (*ctx)->entry_name, + sizeof((*ctx)->entry_name), NULL, 0)) +#endif + for (index = 0; index < len_0; index++) + (*ctx)->entry_name[index] = (char)wdir[index]; + } + else + strncpy((*ctx)->entry_name, (*ctx)->ctx.cFileName, + sizeof((*ctx)->entry_name)-1); + + (*ctx)->entry_name[sizeof((*ctx)->entry_name)-1] = '\0'; + return (*ctx)->entry_name; } @@ -108,6 +143,7 @@ int LP_find_file_end(LP_DIR_CTX **ctx) { FindClose((*ctx)->handle); free(*ctx); + *ctx = NULL; return 1; } errno = EINVAL;