123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* 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);
- }
|