#include "cryptlib.h"
#include <openssl/dso.h>
-#ifndef OPENSSL_SYS_WIN32
+#if !defined(DSO_WIN32)
DSO_METHOD *DSO_METHOD_win32(void)
{
return NULL;
}
#else
+#ifdef _WIN32_WCE
+# if _WIN32_WCE < 300
+static FARPROC GetProcAddressA(HMODULE hModule,LPCSTR lpProcName)
+ {
+ WCHAR lpProcNameW[64];
+ int i;
+
+ for (i=0;lpProcName[i] && i<64;i++)
+ lpProcNameW[i] = (WCHAR)lpProcName[i];
+ if (i==64) return NULL;
+ lpProcNameW[i] = 0;
+
+ return GetProcAddressW(hModule,lpProcNameW);
+ }
+# endif
+# undef GetProcAddress
+# define GetProcAddress GetProcAddressA
+
+static HINSTANCE LoadLibraryA(LPCSTR lpLibFileName)
+ {
+ WCHAR *fnamw;
+ size_t len_0=strlen(lpLibFileName)+1,i;
+
+#ifdef _MSC_VER
+ fnamw = (WCHAR *)_alloca (len_0*sizeof(WCHAR));
+#else
+ fnamw = (WCHAR *)alloca (len_0*sizeof(WCHAR));
+#endif
+ if (fnamw == NULL) return NULL;
+
+#if defined(_WIN32_WCE) && _WIN32_WCE>=101
+ if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0))
+#endif
+ for (i=0;i<len_0;i++) fnamw[i]=(WCHAR)lpLibFileName[i];
+
+ return LoadLibraryW(fnamw);
+ }
+#endif
+
/* Part of the hack in "win32_load" ... */
#define DSO_MAX_TRANSLATED_SIZE 256
static char *win32_merger(DSO *dso, const char *filespec1,
const char *filespec2);
+static const char *openssl_strnchr(const char *string, int c, size_t len);
+
static DSO_METHOD dso_meth_win32 = {
"OpenSSL 'win32' shared library method",
win32_load,
DSOerr(DSO_F_WIN32_LOAD,DSO_R_NO_FILENAME);
goto err;
}
- h = LoadLibrary(filename);
+ h = LoadLibraryA(filename);
if(h == NULL)
{
DSOerr(DSO_F_WIN32_LOAD,DSO_R_LOAD_FAILED);
const char *predir; int predirlen;
const char *dir; int dirlen;
const char *file; int filelen;
- }
+ };
static struct file_st *win32_splitter(DSO *dso, const char *filename,
int assume_last_is_dir)
struct file_st *result = NULL;
enum { IN_NODE, IN_DEVICE, IN_FILE } position;
const char *start = filename;
+ char last;
if (!filename)
{
- DSOerr(DSO_F_WIN32_MERGER,DSO_R_NO_FILENAME);
- goto err;
+ DSOerr(DSO_F_WIN32_SPLITTER,DSO_R_NO_FILENAME);
+ /*goto err;*/
+ return(NULL);
}
result = OPENSSL_malloc(sizeof(struct file_st));
if(result == NULL)
{
- DSOerr(DSO_F_WIN32_MERGER,
+ DSOerr(DSO_F_WIN32_SPLITTER,
ERR_R_MALLOC_FAILURE);
return(NULL);
}
do
{
- switch(filename[0])
+ last = filename[0];
+ switch(last)
{
case ':':
if(position != IN_DEVICE)
{
- DSOerr(DSO_F_WIN32_MERGER,
+ DSOerr(DSO_F_WIN32_SPLITTER,
DSO_R_INCORRECT_FILE_SYNTAX);
- goto err;
+ /*goto err;*/
+ return(NULL);
}
result->device = start;
result->devicelen = filename - start;
start = ++filename;
result->dir = start;
}
+ else if(position == IN_DEVICE)
+ {
+ position = IN_FILE;
+ filename++;
+ result->dir = start;
+ result->dirlen = filename - start;
+ start = filename;
+ }
else
{
filename++;
result->dirlen += filename - start;
+ start = filename;
}
break;
case '\0':
{
if (assume_last_is_dir)
{
- result->devicelen += filename - start;
+ if (position == IN_DEVICE)
+ {
+ result->dir = start;
+ result->dirlen = 0;
+ }
+ result->dirlen +=
+ filename - start;
}
else
{
result->file = start;
- result->filelen = filename - start;
+ result->filelen =
+ filename - start;
}
}
}
break;
}
}
- while(*filename);
+ while(last);
if(!result->nodelen) result->node = NULL;
- if(!result->devicelen) result->devicce = NULL;
+ if(!result->devicelen) result->device = NULL;
if(!result->dirlen) result->dir = NULL;
if(!result->filelen) result->file = NULL;
return(result);
}
-static char *win32_joiner(DSO *dso, const file_st *file_split)
+static char *win32_joiner(DSO *dso, const struct file_st *file_split)
{
int len = 0, offset = 0;
char *result = NULL;
if(!file_split)
{
- DSOerr(DSO_F_WIN32_MERGER,
+ DSOerr(DSO_F_WIN32_JOINER,
ERR_R_PASSED_NULL_PARAMETER);
return(NULL);
}
if(!len)
{
- DSOerr(DSO_F_WIN32_MERGER, DSO_R_EMPTY_FILE_STRUCTURE);
+ DSOerr(DSO_F_WIN32_JOINER, DSO_R_EMPTY_FILE_STRUCTURE);
return(NULL);
}
result = OPENSSL_malloc(len + 1);
if (!result)
{
- DSOerr(DSO_F_WIN32_MERGER,
+ DSOerr(DSO_F_WIN32_JOINER,
ERR_R_MALLOC_FAILURE);
return(NULL);
}
start = file_split->predir;
while(file_split->predirlen > (start - file_split->predir))
{
- const char *end = strnchr(start, '/',
+ const char *end = openssl_strnchr(start, '/',
file_split->predirlen - (start - file_split->predir));
if(!end)
end = start
result[offset] = '\\'; offset++;
start = end + 1;
}
+#if 0 /* Not needed, since the directory converter above already appeneded
+ a backslash */
if(file_split->predir && (file_split->dir || file_split->file))
{
result[offset] = '\\'; offset++;
}
+#endif
start = file_split->dir;
while(file_split->dirlen > (start - file_split->dir))
{
- const char *end = strnchr(start, '/',
+ const char *end = openssl_strnchr(start, '/',
file_split->dirlen - (start - file_split->dir));
if(!end)
end = start
result[offset] = '\\'; offset++;
start = end + 1;
}
+#if 0 /* Not needed, since the directory converter above already appeneded
+ a backslash */
if(file_split->dir && file_split->file)
{
result[offset] = '\\'; offset++;
}
+#endif
strncpy(&result[offset], file_split->file,
file_split->filelen); offset += file_split->filelen;
result[offset] = '\0';
}
else
{
- filespec1_split = win32_splitter(dso, filespec1, 1);
+ filespec1_split = win32_splitter(dso, filespec1, 0);
if (!filespec1_split)
{
DSOerr(DSO_F_WIN32_MERGER,
ERR_R_MALLOC_FAILURE);
return(NULL);
}
- filespec2_split = win32_splitter(dso, filespec2, 0);
- if (!filespec1_split)
+ filespec2_split = win32_splitter(dso, filespec2, 1);
+ if (!filespec2_split)
{
DSOerr(DSO_F_WIN32_MERGER,
ERR_R_MALLOC_FAILURE);
return(translated);
}
+static const char *openssl_strnchr(const char *string, int c, size_t len)
+ {
+ size_t i;
+ const char *p;
+ for (i = 0, p = string; i < len && *p; i++, p++)
+ {
+ if (*p == c)
+ return p;
+ }
+ return NULL;
+ }
+
+
#endif /* OPENSSL_SYS_WIN32 */