diff options
author | djm <> | 2008-09-06 12:17:54 +0000 |
---|---|---|
committer | djm <> | 2008-09-06 12:17:54 +0000 |
commit | 38ce604e3cc97706b876b0525ddff0121115456d (patch) | |
tree | 7ccc28afe1789ea3dbedf72365f955d5b8e105b5 /src/lib/libcrypto/dso/dso_win32.c | |
parent | 12867252827c8efaa8ddd1fa3b3d6e321e2bcdef (diff) | |
download | openbsd-38ce604e3cc97706b876b0525ddff0121115456d.tar.gz openbsd-38ce604e3cc97706b876b0525ddff0121115456d.tar.bz2 openbsd-38ce604e3cc97706b876b0525ddff0121115456d.zip |
resolve conflicts
Diffstat (limited to 'src/lib/libcrypto/dso/dso_win32.c')
-rw-r--r-- | src/lib/libcrypto/dso/dso_win32.c | 364 |
1 files changed, 363 insertions, 1 deletions
diff --git a/src/lib/libcrypto/dso/dso_win32.c b/src/lib/libcrypto/dso/dso_win32.c index cc4ac68696..fd3dd6a7fe 100644 --- a/src/lib/libcrypto/dso/dso_win32.c +++ b/src/lib/libcrypto/dso/dso_win32.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* dso_win32.c */ | 1 | /* dso_win32.c -*- mode:C; c-file-style: "eay" -*- */ |
2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | 2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -85,6 +85,26 @@ static FARPROC GetProcAddressA(HMODULE hModule,LPCSTR lpProcName) | |||
85 | # endif | 85 | # endif |
86 | # undef GetProcAddress | 86 | # undef GetProcAddress |
87 | # define GetProcAddress GetProcAddressA | 87 | # define GetProcAddress GetProcAddressA |
88 | |||
89 | static HINSTANCE LoadLibraryA(LPCSTR lpLibFileName) | ||
90 | { | ||
91 | WCHAR *fnamw; | ||
92 | size_t len_0=strlen(lpLibFileName)+1,i; | ||
93 | |||
94 | #ifdef _MSC_VER | ||
95 | fnamw = (WCHAR *)_alloca (len_0*sizeof(WCHAR)); | ||
96 | #else | ||
97 | fnamw = (WCHAR *)alloca (len_0*sizeof(WCHAR)); | ||
98 | #endif | ||
99 | if (fnamw == NULL) return NULL; | ||
100 | |||
101 | #if defined(_WIN32_WCE) && _WIN32_WCE>=101 | ||
102 | if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0)) | ||
103 | #endif | ||
104 | for (i=0;i<len_0;i++) fnamw[i]=(WCHAR)lpLibFileName[i]; | ||
105 | |||
106 | return LoadLibraryW(fnamw); | ||
107 | } | ||
88 | #endif | 108 | #endif |
89 | 109 | ||
90 | /* Part of the hack in "win32_load" ... */ | 110 | /* Part of the hack in "win32_load" ... */ |
@@ -102,6 +122,10 @@ static int win32_finish(DSO *dso); | |||
102 | static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg); | 122 | static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg); |
103 | #endif | 123 | #endif |
104 | static char *win32_name_converter(DSO *dso, const char *filename); | 124 | static char *win32_name_converter(DSO *dso, const char *filename); |
125 | static char *win32_merger(DSO *dso, const char *filespec1, | ||
126 | const char *filespec2); | ||
127 | |||
128 | static const char *openssl_strnchr(const char *string, int c, size_t len); | ||
105 | 129 | ||
106 | static DSO_METHOD dso_meth_win32 = { | 130 | static DSO_METHOD dso_meth_win32 = { |
107 | "OpenSSL 'win32' shared library method", | 131 | "OpenSSL 'win32' shared library method", |
@@ -116,6 +140,7 @@ static DSO_METHOD dso_meth_win32 = { | |||
116 | #endif | 140 | #endif |
117 | NULL, /* ctrl */ | 141 | NULL, /* ctrl */ |
118 | win32_name_converter, | 142 | win32_name_converter, |
143 | win32_merger, | ||
119 | NULL, /* init */ | 144 | NULL, /* init */ |
120 | NULL /* finish */ | 145 | NULL /* finish */ |
121 | }; | 146 | }; |
@@ -267,6 +292,330 @@ static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname) | |||
267 | return((DSO_FUNC_TYPE)sym); | 292 | return((DSO_FUNC_TYPE)sym); |
268 | } | 293 | } |
269 | 294 | ||
295 | struct file_st | ||
296 | { | ||
297 | const char *node; int nodelen; | ||
298 | const char *device; int devicelen; | ||
299 | const char *predir; int predirlen; | ||
300 | const char *dir; int dirlen; | ||
301 | const char *file; int filelen; | ||
302 | }; | ||
303 | |||
304 | static struct file_st *win32_splitter(DSO *dso, const char *filename, | ||
305 | int assume_last_is_dir) | ||
306 | { | ||
307 | struct file_st *result = NULL; | ||
308 | enum { IN_NODE, IN_DEVICE, IN_FILE } position; | ||
309 | const char *start = filename; | ||
310 | char last; | ||
311 | |||
312 | if (!filename) | ||
313 | { | ||
314 | DSOerr(DSO_F_WIN32_SPLITTER,DSO_R_NO_FILENAME); | ||
315 | /*goto err;*/ | ||
316 | return(NULL); | ||
317 | } | ||
318 | |||
319 | result = OPENSSL_malloc(sizeof(struct file_st)); | ||
320 | if(result == NULL) | ||
321 | { | ||
322 | DSOerr(DSO_F_WIN32_SPLITTER, | ||
323 | ERR_R_MALLOC_FAILURE); | ||
324 | return(NULL); | ||
325 | } | ||
326 | |||
327 | memset(result, 0, sizeof(struct file_st)); | ||
328 | position = IN_DEVICE; | ||
329 | |||
330 | if(filename[0] == '\\' && filename[1] == '\\' | ||
331 | || filename[0] == '/' && filename[1] == '/') | ||
332 | { | ||
333 | position = IN_NODE; | ||
334 | filename += 2; | ||
335 | start = filename; | ||
336 | result->node = start; | ||
337 | } | ||
338 | |||
339 | do | ||
340 | { | ||
341 | last = filename[0]; | ||
342 | switch(last) | ||
343 | { | ||
344 | case ':': | ||
345 | if(position != IN_DEVICE) | ||
346 | { | ||
347 | DSOerr(DSO_F_WIN32_SPLITTER, | ||
348 | DSO_R_INCORRECT_FILE_SYNTAX); | ||
349 | /*goto err;*/ | ||
350 | return(NULL); | ||
351 | } | ||
352 | result->device = start; | ||
353 | result->devicelen = filename - start; | ||
354 | position = IN_FILE; | ||
355 | start = ++filename; | ||
356 | result->dir = start; | ||
357 | break; | ||
358 | case '\\': | ||
359 | case '/': | ||
360 | if(position == IN_NODE) | ||
361 | { | ||
362 | result->nodelen = filename - start; | ||
363 | position = IN_FILE; | ||
364 | start = ++filename; | ||
365 | result->dir = start; | ||
366 | } | ||
367 | else if(position == IN_DEVICE) | ||
368 | { | ||
369 | position = IN_FILE; | ||
370 | filename++; | ||
371 | result->dir = start; | ||
372 | result->dirlen = filename - start; | ||
373 | start = filename; | ||
374 | } | ||
375 | else | ||
376 | { | ||
377 | filename++; | ||
378 | result->dirlen += filename - start; | ||
379 | start = filename; | ||
380 | } | ||
381 | break; | ||
382 | case '\0': | ||
383 | if(position == IN_NODE) | ||
384 | { | ||
385 | result->nodelen = filename - start; | ||
386 | } | ||
387 | else | ||
388 | { | ||
389 | if(filename - start > 0) | ||
390 | { | ||
391 | if (assume_last_is_dir) | ||
392 | { | ||
393 | if (position == IN_DEVICE) | ||
394 | { | ||
395 | result->dir = start; | ||
396 | result->dirlen = 0; | ||
397 | } | ||
398 | result->dirlen += | ||
399 | filename - start; | ||
400 | } | ||
401 | else | ||
402 | { | ||
403 | result->file = start; | ||
404 | result->filelen = | ||
405 | filename - start; | ||
406 | } | ||
407 | } | ||
408 | } | ||
409 | break; | ||
410 | default: | ||
411 | filename++; | ||
412 | break; | ||
413 | } | ||
414 | } | ||
415 | while(last); | ||
416 | |||
417 | if(!result->nodelen) result->node = NULL; | ||
418 | if(!result->devicelen) result->device = NULL; | ||
419 | if(!result->dirlen) result->dir = NULL; | ||
420 | if(!result->filelen) result->file = NULL; | ||
421 | |||
422 | return(result); | ||
423 | } | ||
424 | |||
425 | static char *win32_joiner(DSO *dso, const struct file_st *file_split) | ||
426 | { | ||
427 | int len = 0, offset = 0; | ||
428 | char *result = NULL; | ||
429 | const char *start; | ||
430 | |||
431 | if(!file_split) | ||
432 | { | ||
433 | DSOerr(DSO_F_WIN32_JOINER, | ||
434 | ERR_R_PASSED_NULL_PARAMETER); | ||
435 | return(NULL); | ||
436 | } | ||
437 | if(file_split->node) | ||
438 | { | ||
439 | len += 2 + file_split->nodelen; /* 2 for starting \\ */ | ||
440 | if(file_split->predir || file_split->dir || file_split->file) | ||
441 | len++; /* 1 for ending \ */ | ||
442 | } | ||
443 | else if(file_split->device) | ||
444 | { | ||
445 | len += file_split->devicelen + 1; /* 1 for ending : */ | ||
446 | } | ||
447 | len += file_split->predirlen; | ||
448 | if(file_split->predir && (file_split->dir || file_split->file)) | ||
449 | { | ||
450 | len++; /* 1 for ending \ */ | ||
451 | } | ||
452 | len += file_split->dirlen; | ||
453 | if(file_split->dir && file_split->file) | ||
454 | { | ||
455 | len++; /* 1 for ending \ */ | ||
456 | } | ||
457 | len += file_split->filelen; | ||
458 | |||
459 | if(!len) | ||
460 | { | ||
461 | DSOerr(DSO_F_WIN32_JOINER, DSO_R_EMPTY_FILE_STRUCTURE); | ||
462 | return(NULL); | ||
463 | } | ||
464 | |||
465 | result = OPENSSL_malloc(len + 1); | ||
466 | if (!result) | ||
467 | { | ||
468 | DSOerr(DSO_F_WIN32_JOINER, | ||
469 | ERR_R_MALLOC_FAILURE); | ||
470 | return(NULL); | ||
471 | } | ||
472 | |||
473 | if(file_split->node) | ||
474 | { | ||
475 | strcpy(&result[offset], "\\\\"); offset += 2; | ||
476 | strncpy(&result[offset], file_split->node, | ||
477 | file_split->nodelen); offset += file_split->nodelen; | ||
478 | if(file_split->predir || file_split->dir || file_split->file) | ||
479 | { | ||
480 | result[offset] = '\\'; offset++; | ||
481 | } | ||
482 | } | ||
483 | else if(file_split->device) | ||
484 | { | ||
485 | strncpy(&result[offset], file_split->device, | ||
486 | file_split->devicelen); offset += file_split->devicelen; | ||
487 | result[offset] = ':'; offset++; | ||
488 | } | ||
489 | start = file_split->predir; | ||
490 | while(file_split->predirlen > (start - file_split->predir)) | ||
491 | { | ||
492 | const char *end = openssl_strnchr(start, '/', | ||
493 | file_split->predirlen - (start - file_split->predir)); | ||
494 | if(!end) | ||
495 | end = start | ||
496 | + file_split->predirlen | ||
497 | - (start - file_split->predir); | ||
498 | strncpy(&result[offset], start, | ||
499 | end - start); offset += end - start; | ||
500 | result[offset] = '\\'; offset++; | ||
501 | start = end + 1; | ||
502 | } | ||
503 | #if 0 /* Not needed, since the directory converter above already appeneded | ||
504 | a backslash */ | ||
505 | if(file_split->predir && (file_split->dir || file_split->file)) | ||
506 | { | ||
507 | result[offset] = '\\'; offset++; | ||
508 | } | ||
509 | #endif | ||
510 | start = file_split->dir; | ||
511 | while(file_split->dirlen > (start - file_split->dir)) | ||
512 | { | ||
513 | const char *end = openssl_strnchr(start, '/', | ||
514 | file_split->dirlen - (start - file_split->dir)); | ||
515 | if(!end) | ||
516 | end = start | ||
517 | + file_split->dirlen | ||
518 | - (start - file_split->dir); | ||
519 | strncpy(&result[offset], start, | ||
520 | end - start); offset += end - start; | ||
521 | result[offset] = '\\'; offset++; | ||
522 | start = end + 1; | ||
523 | } | ||
524 | #if 0 /* Not needed, since the directory converter above already appeneded | ||
525 | a backslash */ | ||
526 | if(file_split->dir && file_split->file) | ||
527 | { | ||
528 | result[offset] = '\\'; offset++; | ||
529 | } | ||
530 | #endif | ||
531 | strncpy(&result[offset], file_split->file, | ||
532 | file_split->filelen); offset += file_split->filelen; | ||
533 | result[offset] = '\0'; | ||
534 | return(result); | ||
535 | } | ||
536 | |||
537 | static char *win32_merger(DSO *dso, const char *filespec1, const char *filespec2) | ||
538 | { | ||
539 | char *merged = NULL; | ||
540 | struct file_st *filespec1_split = NULL; | ||
541 | struct file_st *filespec2_split = NULL; | ||
542 | |||
543 | if(!filespec1 && !filespec2) | ||
544 | { | ||
545 | DSOerr(DSO_F_WIN32_MERGER, | ||
546 | ERR_R_PASSED_NULL_PARAMETER); | ||
547 | return(NULL); | ||
548 | } | ||
549 | if (!filespec2) | ||
550 | { | ||
551 | merged = OPENSSL_malloc(strlen(filespec1) + 1); | ||
552 | if(!merged) | ||
553 | { | ||
554 | DSOerr(DSO_F_WIN32_MERGER, | ||
555 | ERR_R_MALLOC_FAILURE); | ||
556 | return(NULL); | ||
557 | } | ||
558 | strcpy(merged, filespec1); | ||
559 | } | ||
560 | else if (!filespec1) | ||
561 | { | ||
562 | merged = OPENSSL_malloc(strlen(filespec2) + 1); | ||
563 | if(!merged) | ||
564 | { | ||
565 | DSOerr(DSO_F_WIN32_MERGER, | ||
566 | ERR_R_MALLOC_FAILURE); | ||
567 | return(NULL); | ||
568 | } | ||
569 | strcpy(merged, filespec2); | ||
570 | } | ||
571 | else | ||
572 | { | ||
573 | filespec1_split = win32_splitter(dso, filespec1, 0); | ||
574 | if (!filespec1_split) | ||
575 | { | ||
576 | DSOerr(DSO_F_WIN32_MERGER, | ||
577 | ERR_R_MALLOC_FAILURE); | ||
578 | return(NULL); | ||
579 | } | ||
580 | filespec2_split = win32_splitter(dso, filespec2, 1); | ||
581 | if (!filespec2_split) | ||
582 | { | ||
583 | DSOerr(DSO_F_WIN32_MERGER, | ||
584 | ERR_R_MALLOC_FAILURE); | ||
585 | OPENSSL_free(filespec1_split); | ||
586 | return(NULL); | ||
587 | } | ||
588 | |||
589 | /* Fill in into filespec1_split */ | ||
590 | if (!filespec1_split->node && !filespec1_split->device) | ||
591 | { | ||
592 | filespec1_split->node = filespec2_split->node; | ||
593 | filespec1_split->nodelen = filespec2_split->nodelen; | ||
594 | filespec1_split->device = filespec2_split->device; | ||
595 | filespec1_split->devicelen = filespec2_split->devicelen; | ||
596 | } | ||
597 | if (!filespec1_split->dir) | ||
598 | { | ||
599 | filespec1_split->dir = filespec2_split->dir; | ||
600 | filespec1_split->dirlen = filespec2_split->dirlen; | ||
601 | } | ||
602 | else if (filespec1_split->dir[0] != '\\' | ||
603 | && filespec1_split->dir[0] != '/') | ||
604 | { | ||
605 | filespec1_split->predir = filespec2_split->dir; | ||
606 | filespec1_split->predirlen = filespec2_split->dirlen; | ||
607 | } | ||
608 | if (!filespec1_split->file) | ||
609 | { | ||
610 | filespec1_split->file = filespec2_split->file; | ||
611 | filespec1_split->filelen = filespec2_split->filelen; | ||
612 | } | ||
613 | |||
614 | merged = win32_joiner(dso, filespec1_split); | ||
615 | } | ||
616 | return(merged); | ||
617 | } | ||
618 | |||
270 | static char *win32_name_converter(DSO *dso, const char *filename) | 619 | static char *win32_name_converter(DSO *dso, const char *filename) |
271 | { | 620 | { |
272 | char *translated; | 621 | char *translated; |
@@ -295,4 +644,17 @@ static char *win32_name_converter(DSO *dso, const char *filename) | |||
295 | return(translated); | 644 | return(translated); |
296 | } | 645 | } |
297 | 646 | ||
647 | static const char *openssl_strnchr(const char *string, int c, size_t len) | ||
648 | { | ||
649 | size_t i; | ||
650 | const char *p; | ||
651 | for (i = 0, p = string; i < len && *p; i++, p++) | ||
652 | { | ||
653 | if (*p == c) | ||
654 | return p; | ||
655 | } | ||
656 | return NULL; | ||
657 | } | ||
658 | |||
659 | |||
298 | #endif /* OPENSSL_SYS_WIN32 */ | 660 | #endif /* OPENSSL_SYS_WIN32 */ |