diff options
Diffstat (limited to 'src/lib/libcrypto/dso/dso_vms.c')
-rw-r--r-- | src/lib/libcrypto/dso/dso_vms.c | 137 |
1 files changed, 131 insertions, 6 deletions
diff --git a/src/lib/libcrypto/dso/dso_vms.c b/src/lib/libcrypto/dso/dso_vms.c index 1674619d17..2c434ee8a6 100644 --- a/src/lib/libcrypto/dso/dso_vms.c +++ b/src/lib/libcrypto/dso/dso_vms.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* dso_vms.c */ | 1 | /* dso_vms.c -*- mode:C; c-file-style: "eay" -*- */ |
2 | /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL | 2 | /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -63,6 +63,7 @@ | |||
63 | #include <openssl/dso.h> | 63 | #include <openssl/dso.h> |
64 | #ifdef OPENSSL_SYS_VMS | 64 | #ifdef OPENSSL_SYS_VMS |
65 | #pragma message disable DOLLARID | 65 | #pragma message disable DOLLARID |
66 | #include <rms.h> | ||
66 | #include <lib$routines.h> | 67 | #include <lib$routines.h> |
67 | #include <stsdef.h> | 68 | #include <stsdef.h> |
68 | #include <descrip.h> | 69 | #include <descrip.h> |
@@ -89,6 +90,8 @@ static int vms_finish(DSO *dso); | |||
89 | static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg); | 90 | static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg); |
90 | #endif | 91 | #endif |
91 | static char *vms_name_converter(DSO *dso, const char *filename); | 92 | static char *vms_name_converter(DSO *dso, const char *filename); |
93 | static char *vms_merger(DSO *dso, const char *filespec1, | ||
94 | const char *filespec2); | ||
92 | 95 | ||
93 | static DSO_METHOD dso_meth_vms = { | 96 | static DSO_METHOD dso_meth_vms = { |
94 | "OpenSSL 'VMS' shared library method", | 97 | "OpenSSL 'VMS' shared library method", |
@@ -103,6 +106,7 @@ static DSO_METHOD dso_meth_vms = { | |||
103 | #endif | 106 | #endif |
104 | NULL, /* ctrl */ | 107 | NULL, /* ctrl */ |
105 | vms_name_converter, | 108 | vms_name_converter, |
109 | vms_merger, | ||
106 | NULL, /* init */ | 110 | NULL, /* init */ |
107 | NULL /* finish */ | 111 | NULL /* finish */ |
108 | }; | 112 | }; |
@@ -140,7 +144,7 @@ static int vms_load(DSO *dso) | |||
140 | 144 | ||
141 | if(filename == NULL) | 145 | if(filename == NULL) |
142 | { | 146 | { |
143 | DSOerr(DSO_F_DLFCN_LOAD,DSO_R_NO_FILENAME); | 147 | DSOerr(DSO_F_VMS_LOAD,DSO_R_NO_FILENAME); |
144 | goto err; | 148 | goto err; |
145 | } | 149 | } |
146 | 150 | ||
@@ -295,19 +299,19 @@ void vms_bind_sym(DSO *dso, const char *symname, void **sym) | |||
295 | 299 | ||
296 | if((dso == NULL) || (symname == NULL)) | 300 | if((dso == NULL) || (symname == NULL)) |
297 | { | 301 | { |
298 | DSOerr(DSO_F_VMS_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); | 302 | DSOerr(DSO_F_VMS_BIND_SYM,ERR_R_PASSED_NULL_PARAMETER); |
299 | return; | 303 | return; |
300 | } | 304 | } |
301 | if(sk_num(dso->meth_data) < 1) | 305 | if(sk_num(dso->meth_data) < 1) |
302 | { | 306 | { |
303 | DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_STACK_ERROR); | 307 | DSOerr(DSO_F_VMS_BIND_SYM,DSO_R_STACK_ERROR); |
304 | return; | 308 | return; |
305 | } | 309 | } |
306 | ptr = (DSO_VMS_INTERNAL *)sk_value(dso->meth_data, | 310 | ptr = (DSO_VMS_INTERNAL *)sk_value(dso->meth_data, |
307 | sk_num(dso->meth_data) - 1); | 311 | sk_num(dso->meth_data) - 1); |
308 | if(ptr == NULL) | 312 | if(ptr == NULL) |
309 | { | 313 | { |
310 | DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_NULL_HANDLE); | 314 | DSOerr(DSO_F_VMS_BIND_SYM,DSO_R_NULL_HANDLE); |
311 | return; | 315 | return; |
312 | } | 316 | } |
313 | 317 | ||
@@ -336,7 +340,7 @@ void vms_bind_sym(DSO *dso, const char *symname, void **sym) | |||
336 | { | 340 | { |
337 | errstring[length] = '\0'; | 341 | errstring[length] = '\0'; |
338 | 342 | ||
339 | DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_SYM_FAILURE); | 343 | DSOerr(DSO_F_VMS_BIND_SYM,DSO_R_SYM_FAILURE); |
340 | if (ptr->imagename_dsc.dsc$w_length) | 344 | if (ptr->imagename_dsc.dsc$w_length) |
341 | ERR_add_error_data(9, | 345 | ERR_add_error_data(9, |
342 | "Symbol ", symname, | 346 | "Symbol ", symname, |
@@ -368,6 +372,127 @@ static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname) | |||
368 | return sym; | 372 | return sym; |
369 | } | 373 | } |
370 | 374 | ||
375 | static char *vms_merger(DSO *dso, const char *filespec1, const char *filespec2) | ||
376 | { | ||
377 | int status; | ||
378 | int filespec1len, filespec2len; | ||
379 | struct FAB fab; | ||
380 | #ifdef NAML$C_MAXRSS | ||
381 | struct NAML nam; | ||
382 | char esa[NAML$C_MAXRSS]; | ||
383 | #else | ||
384 | struct NAM nam; | ||
385 | char esa[NAM$C_MAXRSS]; | ||
386 | #endif | ||
387 | char *merged; | ||
388 | |||
389 | if (!filespec1) filespec1 = ""; | ||
390 | if (!filespec2) filespec2 = ""; | ||
391 | filespec1len = strlen(filespec1); | ||
392 | filespec2len = strlen(filespec2); | ||
393 | |||
394 | fab = cc$rms_fab; | ||
395 | #ifdef NAML$C_MAXRSS | ||
396 | nam = cc$rms_naml; | ||
397 | #else | ||
398 | nam = cc$rms_nam; | ||
399 | #endif | ||
400 | |||
401 | fab.fab$l_fna = (char *)filespec1; | ||
402 | fab.fab$b_fns = filespec1len; | ||
403 | fab.fab$l_dna = (char *)filespec2; | ||
404 | fab.fab$b_dns = filespec2len; | ||
405 | #ifdef NAML$C_MAXRSS | ||
406 | if (filespec1len > NAM$C_MAXRSS) | ||
407 | { | ||
408 | fab.fab$l_fna = 0; | ||
409 | fab.fab$b_fns = 0; | ||
410 | nam.naml$l_long_filename = (char *)filespec1; | ||
411 | nam.naml$l_long_filename_size = filespec1len; | ||
412 | } | ||
413 | if (filespec2len > NAM$C_MAXRSS) | ||
414 | { | ||
415 | fab.fab$l_dna = 0; | ||
416 | fab.fab$b_dns = 0; | ||
417 | nam.naml$l_long_defname = (char *)filespec2; | ||
418 | nam.naml$l_long_defname_size = filespec2len; | ||
419 | } | ||
420 | nam.naml$l_esa = esa; | ||
421 | nam.naml$b_ess = NAM$C_MAXRSS; | ||
422 | nam.naml$l_long_expand = esa; | ||
423 | nam.naml$l_long_expand_alloc = sizeof(esa); | ||
424 | nam.naml$b_nop = NAM$M_SYNCHK | NAM$M_PWD; | ||
425 | nam.naml$v_no_short_upcase = 1; | ||
426 | fab.fab$l_naml = &nam; | ||
427 | #else | ||
428 | nam.nam$l_esa = esa; | ||
429 | nam.nam$b_ess = NAM$C_MAXRSS; | ||
430 | nam.nam$b_nop = NAM$M_SYNCHK | NAM$M_PWD; | ||
431 | fab.fab$l_nam = &nam; | ||
432 | #endif | ||
433 | |||
434 | status = sys$parse(&fab, 0, 0); | ||
435 | |||
436 | if(!$VMS_STATUS_SUCCESS(status)) | ||
437 | { | ||
438 | unsigned short length; | ||
439 | char errstring[257]; | ||
440 | struct dsc$descriptor_s errstring_dsc; | ||
441 | |||
442 | errstring_dsc.dsc$w_length = sizeof(errstring); | ||
443 | errstring_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
444 | errstring_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
445 | errstring_dsc.dsc$a_pointer = errstring; | ||
446 | |||
447 | status = sys$getmsg(status, &length, &errstring_dsc, 1, 0); | ||
448 | |||
449 | if (!$VMS_STATUS_SUCCESS(status)) | ||
450 | lib$signal(status); /* This is really bad. Abort! */ | ||
451 | else | ||
452 | { | ||
453 | errstring[length] = '\0'; | ||
454 | |||
455 | DSOerr(DSO_F_VMS_MERGER,DSO_R_FAILURE); | ||
456 | ERR_add_error_data(7, | ||
457 | "filespec \"", filespec1, "\", ", | ||
458 | "defaults \"", filespec2, "\": ", | ||
459 | errstring); | ||
460 | } | ||
461 | return(NULL); | ||
462 | } | ||
463 | #ifdef NAML$C_MAXRSS | ||
464 | if (nam.naml$l_long_expand_size) | ||
465 | { | ||
466 | merged = OPENSSL_malloc(nam.naml$l_long_expand_size + 1); | ||
467 | if(!merged) | ||
468 | goto malloc_err; | ||
469 | strncpy(merged, nam.naml$l_long_expand, | ||
470 | nam.naml$l_long_expand_size); | ||
471 | merged[nam.naml$l_long_expand_size] = '\0'; | ||
472 | } | ||
473 | else | ||
474 | { | ||
475 | merged = OPENSSL_malloc(nam.naml$b_esl + 1); | ||
476 | if(!merged) | ||
477 | goto malloc_err; | ||
478 | strncpy(merged, nam.naml$l_esa, | ||
479 | nam.naml$b_esl); | ||
480 | merged[nam.naml$b_esl] = '\0'; | ||
481 | } | ||
482 | #else | ||
483 | merged = OPENSSL_malloc(nam.nam$b_esl + 1); | ||
484 | if(!merged) | ||
485 | goto malloc_err; | ||
486 | strncpy(merged, nam.nam$l_esa, | ||
487 | nam.nam$b_esl); | ||
488 | merged[nam.nam$b_esl] = '\0'; | ||
489 | #endif | ||
490 | return(merged); | ||
491 | malloc_err: | ||
492 | DSOerr(DSO_F_VMS_MERGER, | ||
493 | ERR_R_MALLOC_FAILURE); | ||
494 | } | ||
495 | |||
371 | static char *vms_name_converter(DSO *dso, const char *filename) | 496 | static char *vms_name_converter(DSO *dso, const char *filename) |
372 | { | 497 | { |
373 | int len = strlen(filename); | 498 | int len = strlen(filename); |