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