git-svn-id: svn://10.65.10.50/branches/R_10_00@23289 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* File: report_openssl_version.c
 | 
						|
 *
 | 
						|
 * $Id$
 | 
						|
 *
 | 
						|
 * This file dynamically loads the openssl shared image to report the
 | 
						|
 * version string.
 | 
						|
 *
 | 
						|
 * It will optionally place that version string in a DCL symbol.
 | 
						|
 *
 | 
						|
 * Usage:  report_openssl_version <shared_image> [<dcl_symbol>]
 | 
						|
 *
 | 
						|
 * Copyright 2013, John Malmberg
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, and/or distribute this software for any
 | 
						|
 * purpose with or without fee is hereby granted, provided that the above
 | 
						|
 * copyright notice and this permission notice appear in all copies.
 | 
						|
 *
 | 
						|
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
						|
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
						|
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
						|
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
						|
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
						|
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 | 
						|
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <dlfcn.h>
 | 
						|
#include <openssl/opensslv.h>
 | 
						|
#include <openssl/crypto.h>
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
#include <descrip.h>
 | 
						|
#include <libclidef.h>
 | 
						|
#include <stsdef.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
unsigned long LIB$SET_SYMBOL(
 | 
						|
    const struct dsc$descriptor_s * symbol,
 | 
						|
    const struct dsc$descriptor_s * value,
 | 
						|
    const unsigned long * table_type);
 | 
						|
 | 
						|
int main(int argc, char ** argv) {
 | 
						|
 | 
						|
 | 
						|
void * libptr;
 | 
						|
const char * (*ssl_version)(int t);
 | 
						|
const char * version;
 | 
						|
 | 
						|
   if (argc < 1) {
 | 
						|
       puts("report_openssl_version filename");
 | 
						|
       exit(1);
 | 
						|
   }
 | 
						|
 | 
						|
   libptr = dlopen(argv[1], 0);
 | 
						|
 | 
						|
   ssl_version = (const char * (*)(int))dlsym(libptr, "SSLeay_version");
 | 
						|
   if ((void *)ssl_version == NULL) {
 | 
						|
      ssl_version = (const char * (*)(int))dlsym(libptr, "ssleay_version");
 | 
						|
      if ((void *)ssl_version == NULL) {
 | 
						|
         ssl_version = (const char * (*)(int))dlsym(libptr, "SSLEAY_VERSION");
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   dlclose(libptr);
 | 
						|
 | 
						|
   if ((void *)ssl_version == NULL) {
 | 
						|
      puts("Unable to lookup version of OpenSSL");
 | 
						|
      exit(1);
 | 
						|
   }
 | 
						|
 | 
						|
   version = ssl_version(SSLEAY_VERSION);
 | 
						|
 | 
						|
   puts(version);
 | 
						|
 | 
						|
   /* Was a symbol argument given? */
 | 
						|
   if (argc > 1) {
 | 
						|
      int status;
 | 
						|
      struct dsc$descriptor_s symbol_dsc;
 | 
						|
      struct dsc$descriptor_s value_dsc;
 | 
						|
      const unsigned long table_type = LIB$K_CLI_LOCAL_SYM;
 | 
						|
 | 
						|
      symbol_dsc.dsc$a_pointer = argv[2];
 | 
						|
      symbol_dsc.dsc$w_length = strlen(argv[2]);
 | 
						|
      symbol_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
 | 
						|
      symbol_dsc.dsc$b_class = DSC$K_CLASS_S;
 | 
						|
 | 
						|
      value_dsc.dsc$a_pointer = (char *)version; /* Cast ok */
 | 
						|
      value_dsc.dsc$w_length = strlen(version);
 | 
						|
      value_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
 | 
						|
      value_dsc.dsc$b_class = DSC$K_CLASS_S;
 | 
						|
 | 
						|
      status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type);
 | 
						|
      if (!$VMS_STATUS_SUCCESS(status)) {
 | 
						|
         exit(status);
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   exit(0);
 | 
						|
}
 |