VMS: throw away [.util]shareable_image_wrap.c.in and add replacement scripts

[.util]shareable_image_wrap.c.in was never useful because lib$spawn()
insisted on combining stdout and stderr into one.

Instead, we introduce two scripts that create and destroy a temporary
environment where the local shareable images become available,
[.util]local_shlib.com and [.util]unlocal_shlib.com.  They also define
DBG$IMAGE_DSF_PATH, which is require so the debugger can find the Debug
Symbol Files.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/2947)
This commit is contained in:
Richard Levitte 2017-03-14 22:09:57 +01:00
parent 2de2df7fe8
commit a74db02a2e
4 changed files with 61 additions and 116 deletions

View File

@ -1,7 +1,7 @@
IF[{- $target{build_scheme}->[1] eq "VMS" -}]
PROGRAMS_NO_INST=shlib_wrap
SOURCE[shlib_wrap]=shareable_image_wrap.c
GENERATE[shareable_image_wrap.c]=shareable_image_wrap.c.in
SCRIPTS_NO_INST=local_shlib.com unlocal_shlib.com
SOURCE[local_shlib.com]=local_shlib.com.in
SOURCE[unlocal_shlib.com]=unlocal_shlib.com.in
ELSIF[{- $target{build_scheme}->[1] eq "unix" -}]
SCRIPTS_NO_INST=shlib_wrap.sh
SOURCE[shlib_wrap.sh]=shlib_wrap.sh.in

31
util/local_shlib.com.in Normal file
View File

@ -0,0 +1,31 @@
${-
use File::Spec::Functions qw(rel2abs);
my $bldtop = rel2abs($config{builddir});
our %names = ( ( map { $_ => $bldtop.$_.".EXE" }
map { $unified_info{sharednames}->{$_} || () }
@{$unified_info{libraries}} ),
'DBG$IMAGE_DSF_PATH' => $bldtop );
"" -}
$ ! Create a local environment with the shared library logical names
$ ! properly set. Undo this with unlocal_shlib.com
$
$ OPENSSL_NAMES := OPENSSL_NAMES_'F$GETJPI("","PID")'
$ CREATE/NAME_TABLE/PARENT_TABLE=LNM$PROCESS_DIRECTORY 'OPENSSL_NAMES'
$ DEFINE/TABLE='OPENSSL_NAMES' OSSL_FLAG YES
$
$ NAMES := {- join(",", keys %names); -}
{-
join("\n", map { "\$ __$_ = \"".$names{$_}."\"" } keys %names);
-}
$ I = 0
$ LOOP:
$ E = F$ELEMENT(I,",",NAMES)
$ I = I + 1
$ IF E .EQS. "," THEN GOTO ENDLOOP
$ EV = __'E'
$ OLDV = F$TRNLNM(E,"LNM$PROCESS")
$ IF OLDV .NES. "" THEN DEFINE/TABLE='OPENSSL_NAMES' 'E' 'OLDV'
$ DEFINE 'E' 'EV'
$ GOTO LOOP
$ ENDLOOP:

View File

@ -1,113 +0,0 @@
/*
* 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;
}

27
util/unlocal_shlib.com.in Normal file
View File

@ -0,0 +1,27 @@
${-
use File::Spec::Functions qw(rel2abs);
my $bldtop = rel2abs($config{builddir});
our %names = ( ( map { $_ => $bldtop.$_.".EXE" }
map { $unified_info{sharednames}->{$_} || () }
@{$unified_info{libraries}} ),
'DBG$IMAGE_DSF_PATH' => $bldtop );
"" -}
$ ! Remove the local environment created by local_shlib.com
$
$ OPENSSL_NAMES := OPENSSL_NAMES_'F$GETJPI("","PID")'
$ IF F$TRNLNM("OSSL_FLAG",OPENSSL_NAMES) .EQS. "" THEN EXIT 0
$
$ NAMES := {- join(",", keys %names); -}
$ I = 0
$ LOOP:
$ E = F$ELEMENT(I,",",NAMES)
$ I = I + 1
$ IF E .EQS. "," THEN GOTO ENDLOOP
$ OLDV = F$TRNLNM(E,OPENSSL_NAMES)
$ DEASSIGN 'E'
$ IF OLDV .NES. "" THEN DEFINE 'E' 'OLDV'
$ GOTO LOOP
$ ENDLOOP:
$
$ DEASSIGN 'OPENSSL_NAMES' /TABLE=LNM$PROCESS_DIRECTORY