diff options
author | Richard Levitte <levitte@openssl.org> | 2016-09-21 01:47:06 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2016-09-21 02:40:46 +0200 |
commit | f3ff481f318b10a223d6157bde9645e1797487c5 (patch) | |
tree | 23db54083808bc2d5098e18454c279390591621d /util/shareable_image_wrap.c.in | |
parent | 47852e6ae763a40ddc3538c76a02be06fd0595a5 (diff) | |
download | openssl-f3ff481f318b10a223d6157bde9645e1797487c5.tar.gz |
VMS: add [.util]shlib_wrap.exe and its build instructions
This is a program for VMS that corresponds to util/shlib_wrap.sh.
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'util/shareable_image_wrap.c.in')
-rw-r--r-- | util/shareable_image_wrap.c.in | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/util/shareable_image_wrap.c.in b/util/shareable_image_wrap.c.in new file mode 100644 index 0000000000..567e408b14 --- /dev/null +++ b/util/shareable_image_wrap.c.in @@ -0,0 +1,113 @@ +/* + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This program allows for easy execution of programs in the OpenSSL build + * directory, in a manner that's similar to how util/shlib_wrap.sh. Simply + * take the command you want to execute and prefix that with + * 'mcr [.util]shlib_wrap', for example: + * + * $ mcr [.util]shlib_wrap mcr [.apps]openssl s_client -connect www.openssl.org:443 + */ + +#ifndef __VMS +# error "VMS ONLY!" +#endif + +#include <stdio.h> +#include <descrip.h> +#include <ssdef.h> +#include <lib$routines.h> +{- + use File::Spec::Functions qw(rel2abs); + our $sv = sprintf "%02d%02d", $config{shlib_major}, $config{shlib_minor}; + our $pz = $config{pointer_size}; + our $bldd = rel2abs($config{builddir}); + "" +-} +/* The logical name table we check and affect */ +$DESCRIPTOR(lnm_process_table, "LNM$PROCESS_TABLE"); + +/* The first logical name we deal with, the buffer for its old value, + * and its temporary new value + */ +const $DESCRIPTOR(lnm1, "OSSL$LIBCRYPTO{- $sv -}_SHR{- $pz -}"); +char lnm1oldbuf[256]; short lnm1oldlen = 0; +$DESCRIPTOR(lnm1old, lnm1oldbuf); +const $DESCRIPTOR(lnm1new, "{- $bldd -}OSSL$LIBCRYPTO{- $sv -}_SHR{- $pz -}.EXE"); + +/* The second logical name we deal with, the buffer for its old value, + * and its temporary new value + */ +const $DESCRIPTOR(lnm2, "OSSL$LIBSSL{- $sv -}_SHR{- $pz -}"); +char lnm2oldbuf[256]; short lnm2oldlen = 0; +$DESCRIPTOR(lnm2old, lnm2oldbuf); +const $DESCRIPTOR(lnm2new, "{- $bldd -}OSSL$LIBSSL{- $sv -}_SHR{- $pz -}.EXE"); + +/* The foreign command we want to run with the logical names above set + * to their temporary values + */ +char foreign_cmd_buf[4096]; short foreign_cmd_len = 0; +$DESCRIPTOR(foreign_cmd, foreign_cmd_buf); + +int main() +{ + int status = 0; + int lnm1status = 0, lnm2status = 0; + + /* Fetch the command line. lib$get_foreign() is nice enough to + * strip away the program name, thus only returning the arguments, + * which is exactly what we need. + */ + lib$get_foreign(&foreign_cmd, 0, &foreign_cmd_len); + foreign_cmd.dsc$w_length = foreign_cmd_len; + +#ifdef DEBUG + foreign_cmd_buf[foreign_cmd_len] = '\0'; + printf("[%d] %s\n\n", foreign_cmd_len, foreign_cmd_buf); +#endif + + /* Fetch the first logical name value and save the status */ + lnm1status = lib$get_logical(&lnm1, &lnm1old, &lnm1oldlen, + &lnm_process_table); + if (lnm1status == SS$_NORMAL) + lnm1old.dsc$w_length = lnm1oldlen; + else if (lnm1status != SS$_NOLOGNAM) + return lnm1status; + + /* Fetch the first logical name value and save the status */ + lnm2status = lib$get_logical(&lnm2, &lnm2old, &lnm2oldlen, + &lnm_process_table); + if (lnm2status == SS$_NORMAL) + lnm2old.dsc$w_length = lnm2oldlen; + else if (lnm2status != SS$_NOLOGNAM) + return lnm2status; + + /* Set the temporary new values for both logical names */ + lib$set_logical(&lnm1, &lnm1new, &lnm_process_table); + lib$set_logical(&lnm2, &lnm2new, &lnm_process_table); + + /* Execute the arguments as a command. The better be a command! */ + status = lib$spawn(&foreign_cmd); + + /* If the logical names we set had old values, restore them. + * Otherwise, simply delete their current values. + */ + if (lnm1status == SS$_NORMAL) + lib$set_logical(&lnm1, &lnm1old, &lnm_process_table); + else + lib$delete_logical(&lnm1, &lnm_process_table); + if (lnm2status == SS$_NORMAL) + lib$set_logical(&lnm2, &lnm2old, &lnm_process_table); + else + lib$delete_logical(&lnm2, &lnm_process_table); + + /* Return the status from the execution of the foreign command */ + return status; +} |