Home | History | Annotate | Download | only in vms
      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