quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

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 }