static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname) { void *ptr; union { DSO_FUNC_TYPE sym; void *dlret; } u; if((dso == NULL) || (symname == NULL)) { DSOerr(DSO_F_DLFCN_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); return(NULL); } if(sk_void_num(dso->meth_data) < 1) { DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_STACK_ERROR); return(NULL); } ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); if(ptr == NULL) { DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_NULL_HANDLE); return(NULL); } u.dlret = dlsym(ptr, symname); if(u.dlret == NULL) { DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_SYM_FAILURE); ERR_add_error_data(4, "symname(", symname, "): ", dlerror()); return(NULL); } return u.sym; }
static void *dlfcn_bind_var(DSO *dso, const char *symname) { void *ptr, *sym; if((dso == NULL) || (symname == NULL)) { DSOerr(DSO_F_DLFCN_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); return(NULL); } if(sk_void_num(dso->meth_data) < 1) { DSOerr(DSO_F_DLFCN_BIND_VAR,DSO_R_STACK_ERROR); return(NULL); } ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); if(ptr == NULL) { DSOerr(DSO_F_DLFCN_BIND_VAR,DSO_R_NULL_HANDLE); return(NULL); } sym = dlsym(ptr, symname); if(sym == NULL) { DSOerr(DSO_F_DLFCN_BIND_VAR,DSO_R_SYM_FAILURE); ERR_add_error_data(4, "symname(", symname, "): ", dlerror()); return(NULL); } return(sym); }
static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname) { HINSTANCE *ptr; void *sym; if ((dso == NULL) || (symname == NULL)) { DSOerr(DSO_F_WIN32_BIND_FUNC, ERR_R_PASSED_NULL_PARAMETER); return (NULL); } if (sk_void_num(dso->meth_data) < 1) { DSOerr(DSO_F_WIN32_BIND_FUNC, DSO_R_STACK_ERROR); return (NULL); } ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); if (ptr == NULL) { DSOerr(DSO_F_WIN32_BIND_FUNC, DSO_R_NULL_HANDLE); return (NULL); } sym = GetProcAddress(*ptr, symname); if (sym == NULL) { DSOerr(DSO_F_WIN32_BIND_FUNC, DSO_R_SYM_FAILURE); ERR_add_error_data(3, "symname(", symname, ")"); return (NULL); } return ((DSO_FUNC_TYPE)sym); }
/* * Using GetProcAddress for variables? TODO: Check this out in the Win32 API * docs, there's probably a variant for variables. */ static void *win32_bind_var(DSO *dso, const char *symname) { HINSTANCE *ptr; union { void *p; FARPROC f; } sym; if ((dso == NULL) || (symname == NULL)) { DSOerr(DSO_F_WIN32_BIND_VAR, ERR_R_PASSED_NULL_PARAMETER); return (NULL); } if (sk_void_num(dso->meth_data) < 1) { DSOerr(DSO_F_WIN32_BIND_VAR, DSO_R_STACK_ERROR); return (NULL); } ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); if (ptr == NULL) { DSOerr(DSO_F_WIN32_BIND_VAR, DSO_R_NULL_HANDLE); return (NULL); } sym.f = GetProcAddress(*ptr, symname); if (sym.p == NULL) { DSOerr(DSO_F_WIN32_BIND_VAR, DSO_R_SYM_FAILURE); ERR_add_error_data(3, "symname(", symname, ")"); return (NULL); } return (sym.p); }
void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx) { if (ad->sk == NULL || idx < 0 || (size_t)idx >= sk_void_num(ad->sk)) { return NULL; } return sk_void_value(ad->sk, idx); }
void vms_bind_sym(DSO *dso, const char *symname, void **sym) { DSO_VMS_INTERNAL *ptr; int status; # 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; /* Arrange 32-bit pointer to (copied) string storage, if needed. */ # if __INITIAL_POINTER_SIZE == 64 # define SYMNAME symname_32p # pragma pointer_size save # pragma pointer_size 32 char *symname_32p; # pragma pointer_size restore char symname_32[NAMX_MAXRSS + 1]; # else /* __INITIAL_POINTER_SIZE == 64 */ # define SYMNAME ((char *) symname) # endif /* __INITIAL_POINTER_SIZE == 64 [else] */ *sym = NULL; if ((dso == NULL) || (symname == NULL)) { DSOerr(DSO_F_VMS_BIND_SYM, ERR_R_PASSED_NULL_PARAMETER); return; } # if __INITIAL_POINTER_SIZE == 64 /* Copy the symbol name to storage with a 32-bit pointer. */ symname_32p = symname_32; strcpy(symname_32p, symname); # endif /* __INITIAL_POINTER_SIZE == 64 [else] */ symname_dsc.dsc$w_length = strlen(SYMNAME); symname_dsc.dsc$b_dtype = DSC$K_DTYPE_T; symname_dsc.dsc$b_class = DSC$K_CLASS_S; symname_dsc.dsc$a_pointer = SYMNAME; if (sk_void_num(dso->meth_data) < 1) { DSOerr(DSO_F_VMS_BIND_SYM, DSO_R_STACK_ERROR); return; } ptr = (DSO_VMS_INTERNAL *)sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); if (ptr == NULL) { DSOerr(DSO_F_VMS_BIND_SYM, DSO_R_NULL_HANDLE); return; } if (dso->flags & DSO_FLAG_UPCASE_SYMBOL) flags = 0; status = do_find_symbol(ptr, &symname_dsc, sym, flags); if (!$VMS_STATUS_SUCCESS(status)) { unsigned short length; char errstring[257]; struct dsc$descriptor_s errstring_dsc; errstring_dsc.dsc$w_length = sizeof(errstring); errstring_dsc.dsc$b_dtype = DSC$K_DTYPE_T; errstring_dsc.dsc$b_class = DSC$K_CLASS_S; errstring_dsc.dsc$a_pointer = errstring; *sym = NULL; status = sys$getmsg(status, &length, &errstring_dsc, 1, 0); if (!$VMS_STATUS_SUCCESS(status)) lib$signal(status); /* This is really bad. Abort! */ else { errstring[length] = '\0'; DSOerr(DSO_F_VMS_BIND_SYM, DSO_R_SYM_FAILURE); if (ptr->imagename_dsc.dsc$w_length) ERR_add_error_data(9, "Symbol ", symname, " in ", ptr->filename, " (", ptr->imagename, ")", ": ", errstring); else ERR_add_error_data(6, "Symbol ", symname, " in ", ptr->filename, ": ", errstring); } return; } return; }