report_openssl_version.c (2803B)
1 /* File: report_openssl_version.c 2 * 3 * This file dynamically loads the OpenSSL shared image to report the 4 * version string. 5 * 6 * It will optionally place that version string in a DCL symbol. 7 * 8 * Usage: report_openssl_version <shared_image> [<dcl_symbol>] 9 * 10 * Copyright (C) John Malmberg 11 * 12 * Permission to use, copy, modify, and/or distribute this software for any 13 * purpose with or without fee is hereby granted, provided that the above 14 * copyright notice and this permission notice appear in all copies. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 17 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 19 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 21 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 22 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 23 * 24 * SPDX-License-Identifier: ISC 25 * 26 */ 27 28 #include <dlfcn.h> 29 #include <openssl/opensslv.h> 30 #include <openssl/crypto.h> 31 32 #include <string.h> 33 #include <descrip.h> 34 #include <libclidef.h> 35 #include <stsdef.h> 36 #include <errno.h> 37 38 unsigned long LIB$SET_SYMBOL( 39 const struct dsc$descriptor_s * symbol, 40 const struct dsc$descriptor_s * value, 41 const unsigned long *table_type); 42 43 int main(int argc, char **argv) 44 { 45 void *libptr; 46 const char * (*ssl_version)(int t); 47 const char *version; 48 49 if(argc < 1) { 50 puts("report_openssl_version filename"); 51 return 1; 52 } 53 54 libptr = dlopen(argv[1], 0); 55 56 ssl_version = (const char * (*)(int))dlsym(libptr, "SSLeay_version"); 57 if(!ssl_version) { 58 ssl_version = (const char * (*)(int))dlsym(libptr, "ssleay_version"); 59 if(!ssl_version) { 60 ssl_version = (const char * (*)(int))dlsym(libptr, "SSLEAY_VERSION"); 61 } 62 } 63 64 dlclose(libptr); 65 66 if(!ssl_version) { 67 puts("Unable to lookup version of OpenSSL"); 68 return 1; 69 } 70 71 version = ssl_version(SSLEAY_VERSION); 72 73 puts(version); 74 75 /* Was a symbol argument given? */ 76 if(argc > 1) { 77 int status; 78 struct dsc$descriptor_s symbol_dsc; 79 struct dsc$descriptor_s value_dsc; 80 const unsigned long table_type = LIB$K_CLI_LOCAL_SYM; 81 82 symbol_dsc.dsc$a_pointer = argv[2]; 83 symbol_dsc.dsc$w_length = strlen(argv[2]); 84 symbol_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 85 symbol_dsc.dsc$b_class = DSC$K_CLASS_S; 86 87 value_dsc.dsc$a_pointer = (char *)version; /* Cast ok */ 88 value_dsc.dsc$w_length = strlen(version); 89 value_dsc.dsc$b_dtype = DSC$K_DTYPE_T; 90 value_dsc.dsc$b_class = DSC$K_CLASS_S; 91 92 status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type); 93 if(!$VMS_STATUS_SUCCESS(status)) { 94 return status; 95 } 96 } 97 98 return 0; 99 }