X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fdso%2Fdso_vms.c;h=1674619d17b4f7c963a846cc369e6af538be3ba5;hp=d2c06ddafae51bb3386444e66463830506b73bcb;hb=9d93ce246cad0fcc66f5cdaa822b2926ffa256b5;hpb=3aa477f6ec8f184ea72eca19826c92abc488ad12 diff --git a/crypto/dso/dso_vms.c b/crypto/dso/dso_vms.c index d2c06ddafa..1674619d17 100644 --- a/crypto/dso/dso_vms.c +++ b/crypto/dso/dso_vms.c @@ -59,18 +59,17 @@ #include #include #include -#ifdef VMS +#include "cryptlib.h" +#include +#ifdef OPENSSL_SYS_VMS #pragma message disable DOLLARID #include -#include #include #include #include #endif -#include "cryptlib.h" -#include -#ifndef VMS +#ifndef OPENSSL_SYS_VMS DSO_METHOD *DSO_METHOD_vms(void) { return NULL; @@ -78,7 +77,7 @@ DSO_METHOD *DSO_METHOD_vms(void) #else #pragma message disable DOLLARID -static int vms_load(DSO *dso, const char *filename); +static int vms_load(DSO *dso); static int vms_unload(DSO *dso); static void *vms_bind_var(DSO *dso, const char *symname); static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname); @@ -87,8 +86,9 @@ static int vms_unbind_var(DSO *dso, char *symname, void *symptr); static int vms_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); static int vms_init(DSO *dso); static int vms_finish(DSO *dso); -#endif static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg); +#endif +static char *vms_name_converter(DSO *dso, const char *filename); static DSO_METHOD dso_meth_vms = { "OpenSSL 'VMS' shared library method", @@ -101,7 +101,8 @@ static DSO_METHOD dso_meth_vms = { NULL, /* unbind_var */ NULL, /* unbind_func */ #endif - vms_ctrl, + NULL, /* ctrl */ + vms_name_converter, NULL, /* init */ NULL /* finish */ }; @@ -129,11 +130,20 @@ DSO_METHOD *DSO_METHOD_vms(void) return(&dso_meth_vms); } -static int vms_load(DSO *dso, const char *filename) +static int vms_load(DSO *dso) { + void *ptr = NULL; + /* See applicable comments in dso_dl.c */ + char *filename = DSO_convert_filename(dso, NULL); DSO_VMS_INTERNAL *p; const char *sp1, *sp2; /* Search result */ + if(filename == NULL) + { + DSOerr(DSO_F_DLFCN_LOAD,DSO_R_NO_FILENAME); + goto err; + } + /* A file specification may look like this: * * node::dev:[dir-spec]name.type;ver @@ -175,14 +185,14 @@ static int vms_load(DSO *dso, const char *filename) || (sp1 - filename) + strlen(sp2) > FILENAME_MAX) { DSOerr(DSO_F_VMS_LOAD,DSO_R_FILENAME_TOO_BIG); - return(0); + goto err; } p = (DSO_VMS_INTERNAL *)OPENSSL_malloc(sizeof(DSO_VMS_INTERNAL)); if(p == NULL) { DSOerr(DSO_F_VMS_LOAD,ERR_R_MALLOC_FAILURE); - return(0); + goto err; } strncpy(p->filename, sp1, sp2-sp1); @@ -204,10 +214,19 @@ static int vms_load(DSO *dso, const char *filename) if(!sk_push(dso->meth_data, (char *)p)) { DSOerr(DSO_F_VMS_LOAD,DSO_R_STACK_ERROR); - OPENSSL_free(p); - return(0); + goto err; } + + /* Success (for now, we lie. We actually do not know...) */ + dso->loaded_filename = filename; return(1); +err: + /* Cleanup! */ + if(p != NULL) + OPENSSL_free(p); + if(filename != NULL) + OPENSSL_free(filename); + return(0); } /* Note that this doesn't actually unload the shared image, as there is no @@ -260,7 +279,12 @@ void vms_bind_sym(DSO *dso, const char *symname, void **sym) { DSO_VMS_INTERNAL *ptr; int status; - int flags = LIB$M_FIS_MIXEDCASE; +#if 0 + int flags = (1<<4); /* LIB$M_FIS_MIXEDCASE, but this symbol isn't + defined in VMS older than 7.0 or so */ +#else + int flags = 0; +#endif struct dsc$descriptor_s symname_dsc; *sym = NULL; @@ -340,32 +364,16 @@ static void *vms_bind_var(DSO *dso, const char *symname) static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname) { DSO_FUNC_TYPE sym = 0; - vms_bind_sym(dso, symname, &sym); + vms_bind_sym(dso, symname, (void **)&sym); return sym; } -static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg) - { - if(dso == NULL) - { - DSOerr(DSO_F_VMS_CTRL,ERR_R_PASSED_NULL_PARAMETER); - return(-1); - } - switch(cmd) - { - case DSO_CTRL_GET_FLAGS: - return dso->flags; - case DSO_CTRL_SET_FLAGS: - dso->flags = (int)larg; - return(0); - case DSO_CTRL_OR_FLAGS: - dso->flags |= (int)larg; - return(0); - default: - break; - } - DSOerr(DSO_F_VMS_CTRL,DSO_R_UNKNOWN_COMMAND); - return(-1); - } - -#endif /* VMS */ +static char *vms_name_converter(DSO *dso, const char *filename) + { + int len = strlen(filename); + char *not_translated = OPENSSL_malloc(len+1); + strcpy(not_translated,filename); + return(not_translated); + } + +#endif /* OPENSSL_SYS_VMS */