| 
									
										
										
										
											2020-11-25 14:56:08 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-07-29 22:41:35 +08:00
										 |  |  |  * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2020-11-25 14:56:08 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							|  |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-23 15:23:53 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2020-11-25 14:56:08 +08:00
										 |  |  | #include <stdlib.h>              /* For NULL */
 | 
					
						
							|  |  |  | #include <openssl/macros.h>      /* For NON_EMPTY_TRANSLATION_UNIT */
 | 
					
						
							| 
									
										
										
										
											2020-12-01 21:25:01 +08:00
										 |  |  | #include <openssl/e_os2.h>
 | 
					
						
							| 
									
										
										
										
											2020-11-25 14:56:08 +08:00
										 |  |  | #include "simpledynamic.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-23 14:21:04 +08:00
										 |  |  | #if defined(DSO_DLFCN) || defined(DSO_VMS)
 | 
					
						
							| 
									
										
										
										
											2020-11-25 14:56:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | int sd_load(const char *filename, SD *lib, int type) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int dl_flags = type; | 
					
						
							|  |  |  | #ifdef _AIX
 | 
					
						
							|  |  |  |     if (filename[strlen(filename) - 1] == ')') | 
					
						
							|  |  |  |         dl_flags |= RTLD_MEMBER; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     *lib = dlopen(filename, dl_flags); | 
					
						
							|  |  |  |     return *lib == NULL ? 0 : 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int sd_sym(SD lib, const char *symname, SD_SYM *sym) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *sym = dlsym(lib, symname); | 
					
						
							|  |  |  |     return *sym != NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int sd_close(SD lib) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return dlclose(lib) != 0 ? 0 : 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char *sd_error(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return dlerror(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #elif defined(DSO_WIN32)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-01 21:25:01 +08:00
										 |  |  | int sd_load(const char *filename, SD *lib, ossl_unused int type) | 
					
						
							| 
									
										
										
										
											2020-11-25 14:56:08 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     *lib = LoadLibraryA(filename); | 
					
						
							|  |  |  |     return *lib == NULL ? 0 : 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int sd_sym(SD lib, const char *symname, SD_SYM *sym) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *sym = (SD_SYM)GetProcAddress(lib, symname); | 
					
						
							|  |  |  |     return *sym != NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int sd_close(SD lib) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return FreeLibrary(lib) == 0 ? 0 : 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char *sd_error(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static char buffer[255]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     buffer[0] = '\0'; | 
					
						
							|  |  |  |     FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0, | 
					
						
							|  |  |  |                    buffer, sizeof(buffer), NULL); | 
					
						
							|  |  |  |     return buffer; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NON_EMPTY_TRANSLATION_UNIT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |