diff options
Diffstat (limited to 'src/lib/libcrypto/dso/dso_vms.c')
-rw-r--r-- | src/lib/libcrypto/dso/dso_vms.c | 179 |
1 files changed, 79 insertions, 100 deletions
diff --git a/src/lib/libcrypto/dso/dso_vms.c b/src/lib/libcrypto/dso/dso_vms.c index eee20d14f1..321512772a 100644 --- a/src/lib/libcrypto/dso/dso_vms.c +++ b/src/lib/libcrypto/dso/dso_vms.c | |||
@@ -68,20 +68,8 @@ | |||
68 | #include <stsdef.h> | 68 | #include <stsdef.h> |
69 | #include <descrip.h> | 69 | #include <descrip.h> |
70 | #include <starlet.h> | 70 | #include <starlet.h> |
71 | #include "vms_rms.h" | ||
72 | #endif | 71 | #endif |
73 | 72 | ||
74 | /* Some compiler options may mask the declaration of "_malloc32". */ | ||
75 | #if __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE | ||
76 | # if __INITIAL_POINTER_SIZE == 64 | ||
77 | # pragma pointer_size save | ||
78 | # pragma pointer_size 32 | ||
79 | void * _malloc32 (__size_t); | ||
80 | # pragma pointer_size restore | ||
81 | # endif /* __INITIAL_POINTER_SIZE == 64 */ | ||
82 | #endif /* __INITIAL_POINTER_SIZE && defined _ANSI_C_SOURCE */ | ||
83 | |||
84 | |||
85 | #ifndef OPENSSL_SYS_VMS | 73 | #ifndef OPENSSL_SYS_VMS |
86 | DSO_METHOD *DSO_METHOD_vms(void) | 74 | DSO_METHOD *DSO_METHOD_vms(void) |
87 | { | 75 | { |
@@ -133,13 +121,14 @@ typedef struct dso_internal_st | |||
133 | /* This should contain the name only, no directory, | 121 | /* This should contain the name only, no directory, |
134 | * no extension, nothing but a name. */ | 122 | * no extension, nothing but a name. */ |
135 | struct dsc$descriptor_s filename_dsc; | 123 | struct dsc$descriptor_s filename_dsc; |
136 | char filename[ NAMX_MAXRSS+ 1]; | 124 | char filename[FILENAME_MAX+1]; |
137 | /* This contains whatever is not in filename, if needed. | 125 | /* This contains whatever is not in filename, if needed. |
138 | * Normally not defined. */ | 126 | * Normally not defined. */ |
139 | struct dsc$descriptor_s imagename_dsc; | 127 | struct dsc$descriptor_s imagename_dsc; |
140 | char imagename[ NAMX_MAXRSS+ 1]; | 128 | char imagename[FILENAME_MAX+1]; |
141 | } DSO_VMS_INTERNAL; | 129 | } DSO_VMS_INTERNAL; |
142 | 130 | ||
131 | |||
143 | DSO_METHOD *DSO_METHOD_vms(void) | 132 | DSO_METHOD *DSO_METHOD_vms(void) |
144 | { | 133 | { |
145 | return(&dso_meth_vms); | 134 | return(&dso_meth_vms); |
@@ -150,22 +139,7 @@ static int vms_load(DSO *dso) | |||
150 | void *ptr = NULL; | 139 | void *ptr = NULL; |
151 | /* See applicable comments in dso_dl.c */ | 140 | /* See applicable comments in dso_dl.c */ |
152 | char *filename = DSO_convert_filename(dso, NULL); | 141 | char *filename = DSO_convert_filename(dso, NULL); |
153 | 142 | DSO_VMS_INTERNAL *p; | |
154 | /* Ensure 32-bit pointer for "p", and appropriate malloc() function. */ | ||
155 | #if __INITIAL_POINTER_SIZE == 64 | ||
156 | # define DSO_MALLOC _malloc32 | ||
157 | # pragma pointer_size save | ||
158 | # pragma pointer_size 32 | ||
159 | #else /* __INITIAL_POINTER_SIZE == 64 */ | ||
160 | # define DSO_MALLOC OPENSSL_malloc | ||
161 | #endif /* __INITIAL_POINTER_SIZE == 64 [else] */ | ||
162 | |||
163 | DSO_VMS_INTERNAL *p = NULL; | ||
164 | |||
165 | #if __INITIAL_POINTER_SIZE == 64 | ||
166 | # pragma pointer_size restore | ||
167 | #endif /* __INITIAL_POINTER_SIZE == 64 */ | ||
168 | |||
169 | const char *sp1, *sp2; /* Search result */ | 143 | const char *sp1, *sp2; /* Search result */ |
170 | 144 | ||
171 | if(filename == NULL) | 145 | if(filename == NULL) |
@@ -218,7 +192,7 @@ static int vms_load(DSO *dso) | |||
218 | goto err; | 192 | goto err; |
219 | } | 193 | } |
220 | 194 | ||
221 | p = DSO_MALLOC(sizeof(DSO_VMS_INTERNAL)); | 195 | p = (DSO_VMS_INTERNAL *)OPENSSL_malloc(sizeof(DSO_VMS_INTERNAL)); |
222 | if(p == NULL) | 196 | if(p == NULL) |
223 | { | 197 | { |
224 | DSOerr(DSO_F_VMS_LOAD,ERR_R_MALLOC_FAILURE); | 198 | DSOerr(DSO_F_VMS_LOAD,ERR_R_MALLOC_FAILURE); |
@@ -316,38 +290,18 @@ void vms_bind_sym(DSO *dso, const char *symname, void **sym) | |||
316 | int flags = 0; | 290 | int flags = 0; |
317 | #endif | 291 | #endif |
318 | struct dsc$descriptor_s symname_dsc; | 292 | struct dsc$descriptor_s symname_dsc; |
319 | |||
320 | /* Arrange 32-bit pointer to (copied) string storage, if needed. */ | ||
321 | #if __INITIAL_POINTER_SIZE == 64 | ||
322 | # define SYMNAME symname_32p | ||
323 | # pragma pointer_size save | ||
324 | # pragma pointer_size 32 | ||
325 | char *symname_32p; | ||
326 | # pragma pointer_size restore | ||
327 | char symname_32[ NAMX_MAXRSS+ 1]; | ||
328 | #else /* __INITIAL_POINTER_SIZE == 64 */ | ||
329 | # define SYMNAME ((char *) symname) | ||
330 | #endif /* __INITIAL_POINTER_SIZE == 64 [else] */ | ||
331 | |||
332 | *sym = NULL; | 293 | *sym = NULL; |
333 | 294 | ||
295 | symname_dsc.dsc$w_length = strlen(symname); | ||
296 | symname_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
297 | symname_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
298 | symname_dsc.dsc$a_pointer = (char *)symname; /* The cast is needed */ | ||
299 | |||
334 | if((dso == NULL) || (symname == NULL)) | 300 | if((dso == NULL) || (symname == NULL)) |
335 | { | 301 | { |
336 | DSOerr(DSO_F_VMS_BIND_SYM,ERR_R_PASSED_NULL_PARAMETER); | 302 | DSOerr(DSO_F_VMS_BIND_SYM,ERR_R_PASSED_NULL_PARAMETER); |
337 | return; | 303 | return; |
338 | } | 304 | } |
339 | |||
340 | #if __INITIAL_POINTER_SIZE == 64 | ||
341 | /* Copy the symbol name to storage with a 32-bit pointer. */ | ||
342 | symname_32p = symname_32; | ||
343 | strcpy( symname_32p, symname); | ||
344 | #endif /* __INITIAL_POINTER_SIZE == 64 [else] */ | ||
345 | |||
346 | symname_dsc.dsc$w_length = strlen(SYMNAME); | ||
347 | symname_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
348 | symname_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
349 | symname_dsc.dsc$a_pointer = SYMNAME; | ||
350 | |||
351 | if(sk_void_num(dso->meth_data) < 1) | 305 | if(sk_void_num(dso->meth_data) < 1) |
352 | { | 306 | { |
353 | DSOerr(DSO_F_VMS_BIND_SYM,DSO_R_STACK_ERROR); | 307 | DSOerr(DSO_F_VMS_BIND_SYM,DSO_R_STACK_ERROR); |
@@ -418,60 +372,64 @@ static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname) | |||
418 | return sym; | 372 | return sym; |
419 | } | 373 | } |
420 | 374 | ||
421 | |||
422 | static char *vms_merger(DSO *dso, const char *filespec1, const char *filespec2) | 375 | static char *vms_merger(DSO *dso, const char *filespec1, const char *filespec2) |
423 | { | 376 | { |
424 | int status; | 377 | int status; |
425 | int filespec1len, filespec2len; | 378 | int filespec1len, filespec2len; |
426 | struct FAB fab; | 379 | struct FAB fab; |
427 | struct NAMX_STRUCT nam; | 380 | #ifdef NAML$C_MAXRSS |
428 | char esa[ NAMX_MAXRSS+ 1]; | 381 | struct NAML nam; |
382 | char esa[NAML$C_MAXRSS]; | ||
383 | #else | ||
384 | struct NAM nam; | ||
385 | char esa[NAM$C_MAXRSS]; | ||
386 | #endif | ||
429 | char *merged; | 387 | char *merged; |
430 | 388 | ||
431 | /* Arrange 32-bit pointer to (copied) string storage, if needed. */ | ||
432 | #if __INITIAL_POINTER_SIZE == 64 | ||
433 | # define FILESPEC1 filespec1_32p; | ||
434 | # define FILESPEC2 filespec2_32p; | ||
435 | # pragma pointer_size save | ||
436 | # pragma pointer_size 32 | ||
437 | char *filespec1_32p; | ||
438 | char *filespec2_32p; | ||
439 | # pragma pointer_size restore | ||
440 | char filespec1_32[ NAMX_MAXRSS+ 1]; | ||
441 | char filespec2_32[ NAMX_MAXRSS+ 1]; | ||
442 | #else /* __INITIAL_POINTER_SIZE == 64 */ | ||
443 | # define FILESPEC1 ((char *) filespec1) | ||
444 | # define FILESPEC2 ((char *) filespec2) | ||
445 | #endif /* __INITIAL_POINTER_SIZE == 64 [else] */ | ||
446 | |||
447 | if (!filespec1) filespec1 = ""; | 389 | if (!filespec1) filespec1 = ""; |
448 | if (!filespec2) filespec2 = ""; | 390 | if (!filespec2) filespec2 = ""; |
449 | filespec1len = strlen(filespec1); | 391 | filespec1len = strlen(filespec1); |
450 | filespec2len = strlen(filespec2); | 392 | filespec2len = strlen(filespec2); |
451 | 393 | ||
452 | #if __INITIAL_POINTER_SIZE == 64 | ||
453 | /* Copy the file names to storage with a 32-bit pointer. */ | ||
454 | filespec1_32p = filespec1_32; | ||
455 | filespec2_32p = filespec2_32; | ||
456 | strcpy( filespec1_32p, filespec1); | ||
457 | strcpy( filespec2_32p, filespec2); | ||
458 | #endif /* __INITIAL_POINTER_SIZE == 64 [else] */ | ||
459 | |||
460 | fab = cc$rms_fab; | 394 | fab = cc$rms_fab; |
461 | nam = CC_RMS_NAMX; | 395 | #ifdef NAML$C_MAXRSS |
462 | 396 | nam = cc$rms_naml; | |
463 | FAB_OR_NAML( fab, nam).FAB_OR_NAML_FNA = FILESPEC1; | 397 | #else |
464 | FAB_OR_NAML( fab, nam).FAB_OR_NAML_FNS = filespec1len; | 398 | nam = cc$rms_nam; |
465 | FAB_OR_NAML( fab, nam).FAB_OR_NAML_DNA = FILESPEC2; | 399 | #endif |
466 | FAB_OR_NAML( fab, nam).FAB_OR_NAML_DNS = filespec2len; | ||
467 | NAMX_DNA_FNA_SET( fab) | ||
468 | |||
469 | nam.NAMX_ESA = esa; | ||
470 | nam.NAMX_ESS = NAMX_MAXRSS; | ||
471 | nam.NAMX_NOP = NAM$M_SYNCHK | NAM$M_PWD; | ||
472 | SET_NAMX_NO_SHORT_UPCASE( nam); | ||
473 | 400 | ||
474 | fab.FAB_NAMX = &nam; | 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 | ||
475 | 433 | ||
476 | status = sys$parse(&fab, 0, 0); | 434 | status = sys$parse(&fab, 0, 0); |
477 | 435 | ||
@@ -502,12 +460,33 @@ static char *vms_merger(DSO *dso, const char *filespec1, const char *filespec2) | |||
502 | } | 460 | } |
503 | return(NULL); | 461 | return(NULL); |
504 | } | 462 | } |
505 | 463 | #ifdef NAML$C_MAXRSS | |
506 | merged = OPENSSL_malloc( nam.NAMX_ESL+ 1); | 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); | ||
507 | if(!merged) | 484 | if(!merged) |
508 | goto malloc_err; | 485 | goto malloc_err; |
509 | strncpy( merged, nam.NAMX_ESA, nam.NAMX_ESL); | 486 | strncpy(merged, nam.nam$l_esa, |
510 | merged[ nam.NAMX_ESL] = '\0'; | 487 | nam.nam$b_esl); |
488 | merged[nam.nam$b_esl] = '\0'; | ||
489 | #endif | ||
511 | return(merged); | 490 | return(merged); |
512 | malloc_err: | 491 | malloc_err: |
513 | DSOerr(DSO_F_VMS_MERGER, | 492 | DSOerr(DSO_F_VMS_MERGER, |