Add in the files needed to build libcurl shared images on VMS.

Update the packages/vms/readme file to be current.

Also some files for the GNV based build were either missing or needed an
update.

curl_crtl_init.c is a special file that is run before main() to
set up the proper C runtime behavior.

generate_vax_transfer.com generates the VAX transfer vector modules from
the gnv_libcurl_symbols.opt file.

gnv_conftest.c_first is a helper file needed for configure scripts to
come up with the expected answers on VMS.

gnv_libcurl_symbols.opt is the public symbols for the libcurl shared
image.

gnv_link_curl.com builds the shared libcurl image and rebuilds other
programs to use it.

macro32_exactcase.patch is a hack to make a local copy of the VMS Macro32
assembler case sensitive, which is needed to build the VAX transfer modules.

report_openssl_version.c is a tool for help verify that the libcurl
shared image is being built for a minium version of openssl.
This commit is contained in:
John Malmberg 2013-07-31 22:35:19 -05:00 committed by Yang Tse
parent ca786233d2
commit 2ad688ed7c
7 changed files with 1783 additions and 0 deletions

View File

@ -0,0 +1,311 @@
/* File: curl_crtl_init.c
*
* This file makes sure that the DECC Unix settings are correct for
* the mode the the program is run in.
*
* The CRTL has not been initialized at the time that these routines
* are called, so many routines can not be called.
*
* This is a module that provides a LIB$INITIALIZE routine that
* will turn on some CRTL features that are not enabled by default.
*
* The CRTL features can also be turned on via logical names, but that
* impacts all programs and some aren't ready, willing, or able to handle
* those settings.
*
* On VMS versions that are too old to use the feature setting API, this
* module falls back to using logical names.
*
* 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.
*
*/
/* Unix headers */
#include <stdio.h>
#include <string.h>
/* VMS specific headers */
#include <descrip.h>
#include <lnmdef.h>
#include <stsdef.h>
#pragma member_alignment save
#pragma nomember_alignment longword
#pragma message save
#pragma message disable misalgndmem
struct itmlst_3 {
unsigned short int buflen;
unsigned short int itmcode;
void *bufadr;
unsigned short int *retlen;
};
#pragma message restore
#pragma member_alignment restore
#ifdef __VAX
#define ENABLE "ENABLE"
#define DISABLE "DISABLE"
#else
#define ENABLE TRUE
#define DISABLE 0
int decc$feature_get_index (const char *name);
int decc$feature_set_value (int index, int mode, int value);
#endif
int SYS$TRNLNM(
const unsigned long * attr,
const struct dsc$descriptor_s * table_dsc,
struct dsc$descriptor_s * name_dsc,
const unsigned char * acmode,
const struct itmlst_3 * item_list);
int SYS$CRELNM(
const unsigned long * attr,
const struct dsc$descriptor_s * table_dsc,
const struct dsc$descriptor_s * name_dsc,
const unsigned char * acmode,
const struct itmlst_3 * item_list);
/* Take all the fun out of simply looking up a logical name */
static int sys_trnlnm
(const char * logname,
char * value,
int value_len)
{
const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV");
const unsigned long attr = LNM$M_CASE_BLIND;
struct dsc$descriptor_s name_dsc;
int status;
unsigned short result;
struct itmlst_3 itlst[2];
itlst[0].buflen = value_len;
itlst[0].itmcode = LNM$_STRING;
itlst[0].bufadr = value;
itlst[0].retlen = &result;
itlst[1].buflen = 0;
itlst[1].itmcode = 0;
name_dsc.dsc$w_length = strlen(logname);
name_dsc.dsc$a_pointer = (char *)logname;
name_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
name_dsc.dsc$b_class = DSC$K_CLASS_S;
status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst);
if ($VMS_STATUS_SUCCESS(status)) {
/* Null terminate and return the string */
/*--------------------------------------*/
value[result] = '\0';
}
return status;
}
/* How to simply create a logical name */
static int sys_crelnm
(const char * logname,
const char * value)
{
int ret_val;
const char * proc_table = "LNM$PROCESS_TABLE";
struct dsc$descriptor_s proc_table_dsc;
struct dsc$descriptor_s logname_dsc;
struct itmlst_3 item_list[2];
proc_table_dsc.dsc$a_pointer = (char *) proc_table;
proc_table_dsc.dsc$w_length = strlen(proc_table);
proc_table_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
proc_table_dsc.dsc$b_class = DSC$K_CLASS_S;
logname_dsc.dsc$a_pointer = (char *) logname;
logname_dsc.dsc$w_length = strlen(logname);
logname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
logname_dsc.dsc$b_class = DSC$K_CLASS_S;
item_list[0].buflen = strlen(value);
item_list[0].itmcode = LNM$_STRING;
item_list[0].bufadr = (char *)value;
item_list[0].retlen = NULL;
item_list[1].buflen = 0;
item_list[1].itmcode = 0;
ret_val = SYS$CRELNM(NULL, &proc_table_dsc, &logname_dsc, NULL, item_list);
return ret_val;
}
/* Start of DECC RTL Feature handling */
/*
** Sets default value for a feature
*/
#ifdef __VAX
static void set_feature_default(const char *name, const char *value)
{
sys_crelnm(name, value);
}
#else
static void set_feature_default(const char *name, int value)
{
int index;
index = decc$feature_get_index(name);
if (index > 0)
decc$feature_set_value (index, 0, value);
}
#endif
static void set_features(void)
{
int status;
char unix_shell_name[255];
int use_unix_settings = 1;
status = sys_trnlnm("GNV$UNIX_SHELL",
unix_shell_name, sizeof unix_shell_name -1);
if (!$VMS_STATUS_SUCCESS(status)) {
unix_shell_name[0] = 0;
use_unix_settings = 0;
}
/* ACCESS should check ACLs or it is lying. */
set_feature_default("DECC$ACL_ACCESS_CHECK", ENABLE);
/* We always want the new parse style */
set_feature_default ("DECC$ARGV_PARSE_STYLE" , ENABLE);
/* Unless we are in POSIX compliant mode, we want the old POSIX root
* enabled.
*/
set_feature_default("DECC$DISABLE_POSIX_ROOT", DISABLE);
/* EFS charset, means UTF-8 support */
/* VTF-7 support is controlled by a feature setting called UTF8 */
set_feature_default ("DECC$EFS_CHARSET", ENABLE);
set_feature_default ("DECC$EFS_CASE_PRESERVE", ENABLE);
/* Support timestamps when available */
set_feature_default ("DECC$EFS_FILE_TIMESTAMPS", ENABLE);
/* Cache environment variables - performance improvements */
set_feature_default ("DECC$ENABLE_GETENV_CACHE", ENABLE);
/* Start out with new file attribute inheritance */
#ifdef __VAX
set_feature_default ("DECC$EXEC_FILEATTR_INHERITANCE", "2");
#else
set_feature_default ("DECC$EXEC_FILEATTR_INHERITANCE", 2);
#endif
/* Don't display trailing dot after files without type */
set_feature_default ("DECC$READDIR_DROPDOTNOTYPE", ENABLE);
/* For standard output channels buffer output until terminator */
/* Gets rid of output logs with single character lines in them. */
set_feature_default ("DECC$STDIO_CTX_EOL", ENABLE);
/* Fix mv aa.bb aa */
set_feature_default ("DECC$RENAME_NO_INHERIT", ENABLE);
if (use_unix_settings) {
/* POSIX requires that open files be able to be removed */
set_feature_default ("DECC$ALLOW_REMOVE_OPEN_FILES", ENABLE);
/* Default to outputting UNIX filesnames in VMS routines */
set_feature_default ("DECC$FILENAME_UNIX_ONLY", ENABLE);
/* FILENAME_UNIX_ONLY Implicitly sets */
/* decc$disable_to_vms_logname_translation */
set_feature_default ("DECC$FILE_PERMISSION_UNIX", ENABLE);
set_feature_default ("DECC$FILE_SHARING", ENABLE);
set_feature_default ("DECC$FILE_OWNER_UNIX", ENABLE);
set_feature_default ("DECC$POSIX_SEEK_STREAM_FILE", ENABLE);
} else {
set_feature_default("DECC$FILENAME_UNIX_REPORT", ENABLE);
}
/* When reporting UNIX filenames, glob the same way */
set_feature_default ("DECC$GLOB_UNIX_STYLE", ENABLE);
/* The VMS version numbers on Unix filenames is incompatible with most */
/* ported packages. */
set_feature_default("DECC$FILENAME_UNIX_NO_VERSION", ENABLE);
/* The VMS version numbers on Unix filenames is incompatible with most */
/* ported packages. */
set_feature_default("DECC$UNIX_PATH_BEFORE_LOGNAME", ENABLE);
/* Set strtol to proper behavior */
set_feature_default("DECC$STRTOL_ERANGE", ENABLE);
/* Commented here to prevent future bugs: A program or user should */
/* never ever enable DECC$POSIX_STYLE_UID. */
/* It will probably break all code that accesses UIDs */
/* do_not_set_default ("DECC$POSIX_STYLE_UID", TRUE); */
}
/* Some boilerplate to force this to be a proper LIB$INITIALIZE section */
#pragma nostandard
#pragma extern_model save
#ifdef __VAX
#pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long, nopic
#else
#pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long
# if __INITIAL_POINTER_SIZE
# pragma __pointer_size __save
# pragma __pointer_size 32
# else
# pragma __required_pointer_size __save
# pragma __required_pointer_size 32
# endif
#endif
/* Set our contribution to the LIB$INITIALIZE array */
void (* const iniarray[])(void) = {set_features, } ;
#ifndef __VAX
# if __INITIAL_POINTER_SIZE
# pragma __pointer_size __restore
# else
# pragma __required_pointer_size __restore
# endif
#endif
/*
** Force a reference to LIB$INITIALIZE to ensure it
** exists in the image.
*/
int LIB$INITIALIZE(void);
#ifdef __DECC
#pragma extern_model strict_refdef
#endif
int lib_init_ref = (int) LIB$INITIALIZE;
#ifdef __DECC
#pragma extern_model restore
#pragma standard
#endif

View File

@ -0,0 +1,274 @@
$! File: generate_vax_transfer.com
$!
$! $Id$
$!
$! File to generate and compile the VAX transfer vectors from reading in the
$! Alpha/Itanium gnv_libcurl_symbols.opt file.
$!
$! This procedure patches the VAX Macro32 assembler to be case sensitive
$! and then compiles the generated
$!
$! The output of this procedure is:
$! gnv_libcurl_xfer.mar_exact
$! gnv_libcurl_xfer.obj
$! gnv_libcurl_xfer.opt
$! macro32_exactcase.exe
$!
$! 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.
$!
$! 20-Jul-2013 J. Malmberg
$!============================================================================
$!
$! Save this so we can get back.
$ default_dir = f$environment("default")
$!
$ on warning then goto all_exit
$!
$! Want hard tabs in the generated file.
$ tab[0,8] = 9
$!
$! This procedure is used on VAX only
$ if (f$getsyi("HW_MODEL") .ge. 1024)
$ then
$ write sys$output "This procedure is only used on VAX."
$ goto all_exit
$ endif
$!
$!
$! Get the libcurl version to generate the ident string.
$! ident string is max of 31 characters.
$!
$ ident_string = "unknown"
$ open/read cver [-.-.include.curl]curlver.h
$cver_loop:
$ read/end=cver_loop_end cver line_in
$ line_in = f$edit(line_in, "COMPRESS,TRIM")
$ if line_in .eqs. "" then goto cver_loop
$ code = f$extract(0, 1, line_in)
$ if code .nes. "#" then goto cver_loop
$ directive = f$element(0, " ", line_in)
$ if directive .nes. "#define" then goto cver_loop
$ name = f$element(1, " ", line_in)
$ if name .nes. "LIBCURL_VERSION" then goto cver_loop
$ ident_string = f$element(2, " ", line_in) - "" - ""
$cver_loop_end:
$ close cver
$!
$ open/read aopt gnv_libcurl_symbols.opt
$!
$! Write out the header
$ gosub do_header
$!
$ open/append vopt gnv_libcurl_xfer.mar_exact
$ write vopt tab,".IDENT /", ident_string, "/"
$!
$ write vopt tab, ".PSECT LIBCURL_XFERVECTORS -"
$ write vopt tab,tab,tab, "PIC,USR,CON,REL,GBL,SHR,EXE,RD,NOWRT,QUAD"
$ write vopt ""
$ write vopt tab, "SPARE", tab, "; never delete this spare"
$ write vopt ";"
$ write vopt ";", tab, "Exact case and upper case transfer vectors"
$!
$ alias_count = 0
$vector_loop:
$!
$! Read in symbol_vector
$!
$ read/end=vector_loop_end aopt line_in
$ line = f$edit(line_in, "UNCOMMENT,COMPRESS,TRIM")
$ if line .eqs. "" then goto vector_loop
$!
$ line_u = f$edit(line, "UPCASE")
$ key = f$element(0, "=", line_u)
$ if (key .eqs. "SYMBOL_VECTOR")
$ then
$ symbol_string = f$element(1, "=", line) - "("
$ symbol_type = f$element(2, "=", line_u) - ")"
$ symbol_name = f$element(1, "/", symbol_string)
$ if symbol_type .nes. "PROCEDURE"
$ then
$ write sys$output "%CURLBUILD-W-NOTPROC, " + -
$ "This procedure can only handle procedure vectors"
$ write sys$output -
"Data vectors require manual construction for which this procedure or"
$ write sys$output -
"the shared library needs to be updated to resolve."
$ write sys$output -
"the preferred solution is to have a procedure return the address of the "
$ write sys$output -
"the variable instead of having a variable, as if the size of the variable "
write sys$output -
"changes, the symbol vector is no longer backwards compatible."
$ endif
$ if (symbol_name .eqs. "/")
$ then
$ symbol_name = symbol_string
$ write vopt tab, symbol_type, tab, symbol_name
$ else
$ alias_count = alias_count + 1
$ symbol_alias = f$element(0, "/", symbol_string)
$ write vopt -
tab, "''symbol_type_U", tab, symbol_name, tab, symbol_alias
$ endif
$ endif
$ goto vector_loop
$vector_loop_end:
$!
$! End of pass one, second pass needed if aliases exist
$ close aopt
$!
$ if alias_count .eq. 0 then goto finish_file
$!
$! Start pass 2, write stub routine header
$!
$ open/read aopt gnv_libcurl_symbols.opt
$!
$alias_loop:
$!
$! Read in symbol_vector
$!
$ read/end=alias_loop_end aopt line_in
$ line = f$edit(line_in, "UNCOMMENT,COMPRESS,TRIM")
$ if line .eqs. "" then goto alias_loop
$!
$ line_u = f$edit(line, "UPCASE")
$ key = f$element(0, "=", line_u)
$ if (key .eqs. "SYMBOL_VECTOR")
$ then
$ symbol_string = f$element(1, "=", line) - "("
$ symbol_type = f$element(2, "=", line_u) - ")"
$ symbol_name = f$element(1, "/", symbol_string)
$ if (symbol_name .eqs. "/")
$ then
$ symbol_name = symbol_string
$ else
$ alias_count = alias_count + 1
$ symbol_alias = f$element(0, "/", symbol_string)
$ write vopt tab, ".ENTRY", tab, symbol_alias, ", ^M<>"
$ endif
$ endif
$ goto alias_loop
$! read in symbol_vector
$! if not alias, then loop
$! write out subroutine name
$!
$alias_loop_end:
$!
$ write vopt tab, "MOVL #1, R0"
$ write vopt tab, "RET"
$!
$finish_file:
$!
$ write vopt ""
$ write vopt tab, ".END"
$!
$ close aopt
$ close vopt
$!
$! Patch the Macro32 compiler
$!----------------------------
$ patched_macro = "sys$disk:[]macro32_exactcase.exe"
$ if f$search(patched_macro) .eqs. ""
$ then
$ copy sys$system:macro32.exe 'patched_macro'
$ patch @macro32_exactcase.patch
$ endif
$ define/user macro32 'patched_macro'
$ macro/object=gnv_libcurl_xfer.obj gnv_libcurl_xfer.mar_exact
$!
$! Create the option file for linking the shared image.
$ create gnv_libcurl_xfer.opt
$ open/append lco gnv_libcurl_xfer.opt
$ write lco "gsmatch=lequal,1,1"
$ write lco "cluster=transfer_vector,,,''default_dir'gnv_libcurl_xfer"
$ write lco "collect=libcurl_global, libcurl_xfervectors"
$ close lco
$!
$!
$ goto all_exit
$!
$! Process the header
$do_header:
$!
$! Force the mode of the file to same as text editor generated.
$ create gnv_libcurl_xfer.mar_exact
$deck
; File: gnv_libcurl_xfer.mar_exact
;
; VAX transfer vectors
;
; This needs to be compiled with a specialized patch on Macro32 to make it
; preserve the case of symbols instead of converting it to uppercase.
;
; This patched Macro32 requires all directives to be in upper case.
;
; There are three sets of symbols for transfer vectors here.
;
; The first for upper case which matches the tradition method of generating
; VAX transfer vectors.
;
; The second is the exact case for compatibilty with open source C programs
; that expect exact case symbols in images. These are separated because a
; previous kit had only upper case symbols.
;
; The third is the routine stub that is used to resolve part of the upper
; case transfer vectors, with exact case entry symbols.
;
; When you add routines, you need to add them after the second set of transfer
; vectors for both upper and exact case, and then additional entry points
; in upper case added to stub routines.
;
;*************************************************************************
.TITLE libcurl_xfer - Transfer vector for libcurl
.DISABLE GLOBAL
;
; Macro to generate a transfer vector entry
;
.MACRO PROCEDURE NAME
.EXTRN 'NAME
.ALIGN QUAD
.TRANSFER 'NAME
.MASK 'NAME
JMP 'NAME+2
.ENDM
.MACRO PROCEDUREU NAME NAMEU
.EXTRN 'NAME
.ALIGN QUAD
.TRANSFER 'NAMEU
.MASK 'NAME
JMP 'NAME+2
.ENDM
;
;
; Macro to reserve a spare entry.
;
.MACRO SPARE
.ALIGN QUAD
.ALIGN QUAD
.QUAD 0
.ENDM
$EOD
$!
$!
$ return
$!
$all_exit:
$set def 'default_dir'
$exit '$status'

View File

@ -0,0 +1,61 @@
/* File: GNV$CONFTEST.C_FIRST
*
* $Id$
*
* Copyright 2009, 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.
*
*/
/* This is needed for Configure tests to get the correct exit status */
void __posix_exit(int __status);
#define exit(__p1) __posix_exit(__p1)
/* Fake pass the test to find a standard ldap routine that we know is */
/* present on VMS, but with the wrong case for the symbol */
char ldap_url_parse(void) {return 0;}
/* These are to pass the test that does not use headers */
/* Because configure does an #undef which keeps us from using #define */
/* char CRYPTO_add_lock(void) {return 0;} */
char SSL_connnect(void) {return 0;}
char ENGINE_init(void) {return 0;}
char RAND_status(void) {return 0;}
/* char RAND_screen(void) {return 0;} In headers, but not present */
char RAND_egd(void) {return 0;}
char CRYPTO_cleanup_all_ex_data(void) {return 0;}
char SSL_get_shutdown(void) {return 0;}
char ENGINE_load_builtin_engines (void) {return 0;}
/* And these are to pass the test that uses headers. */
/* Because the HP OpenSSL transfer vectors are currently in Upper case only */
#pragma message disable macroredef
#define CRYPTO_add_lock CRYPTO_ADD_LOCK
#define SSL_connect SSL_CONNECT
#define ENGINE_init ENGINE_INIT
#define RAND_status RAND_STATUS
/* #define RAND_screen RAND_SCREEN */
#define RAND_egd RAND_EGD
#define CRYPTO_cleanup_all_ex_data CRYPTO_CLEANUP_ALL_EX_DATA
#define SSL_get_shutdown SSL_GET_SHUTDOWN
#define ENGINE_load_builtin_engines ENGINE_LOAD_BUILTIN_ENGINES
/* Can not use the #define macro to fix the case on CRYPTO_lock because */
/* there is a macro CRYPTO_LOCK that is a number */
/* After all the work to get configure to pass the CRYPTO_LOCK tests,
* it turns out that VMS does not have the CRYPTO_LOCK symbol in the
* transfer vector, even though it is in the header file.
*/

View File

@ -0,0 +1,181 @@
! File GNV$LIBCURL_SYMBOLS.OPT
!
! $Id$
!
! This file must be manually maintained to allow upward compatibility
! The SYMBOL_VECTORs are set up so that applications can be compiled
! with either case sensitive symbol names or the default of uppercase.
! This is because many of the Open Source applications that would call
! the LIBCURL library need to be built with case sensitive names.
!
! Automatic generation is currently not practical because the order of
! the entries are important for upward compatibility.
!
! The GSMATCH is manually set to the major version of 1, with the minor
! version being the next two sections multiplied by a power of 10 to
! become the minor version.
! So LIBCURL 7.18.1 becomes 1,718010.
! And a future LIBCURL of 7.18.2 would be 1,718020 if new routines were added.
!
! This leaves some spare digits for minor patches.
!
! Note that the GSMATCH does not need to have any real relationship to the
! actual package version number.
!
! New SYMBOL_VECTORs must be added to the end of this list, and added
! in pairs for both exact and with an uppercase alias.
! If the public symbol is more than 31 characters long, then a special
! shortened symbol will be exported, and three aliases should be created,
! The aliases will be the special shortened uppercase alias, and both
! upper and lowercase versions of a truncated name (preferred) or a
! modified manually shortened name if a truncated name will not be
! unique.
!
! Routines can not be removed, the functionality must be maintained.
! If a new routine is supplied where the arguments are incompatible with
! the older version, both versions are needed to be maintained.
! The old version can be given a different name, but must be in the same
! SYMBOL_VECTOR positions in this file.
!
! Changing the number of parameters for an existing routine does not require
! maintaining multiple versions as long as the routine can be called with
! the old number of parameters.
!
! Copyright 2009, 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.
!============================================================================
GSMATCH=LEQUAL,1,719050
CASE_SENSITIVE=YES
SYMBOL_VECTOR=(curl_strequal=PROCEDURE)
SYMBOL_VECTOR=(CURL_STREQUAL/curl_strequal=PROCEDURE)
SYMBOL_VECTOR=(curl_strnequal=PROCEDURE)
SYMBOL_VECTOR=(CURL_STRNEQUAL/curl_strnequal=PROCEDURE)
SYMBOL_VECTOR=(curl_formadd=PROCEDURE)
SYMBOL_VECTOR=(CURL_FORMADD/curl_formadd=PROCEDURE)
SYMBOL_VECTOR=(curl_formget=PROCEDURE)
SYMBOL_VECTOR=(CURL_FORMGET/curl_formget=PROCEDURE)
SYMBOL_VECTOR=(curl_formfree=PROCEDURE)
SYMBOL_VECTOR=(CURL_FORMFREE/curl_formfree=PROCEDURE)
SYMBOL_VECTOR=(curl_getenv=PROCEDURE)
SYMBOL_VECTOR=(CURL_GETENV/curl_getenv=PROCEDURE)
SYMBOL_VECTOR=(curl_version=PROCEDURE)
SYMBOL_VECTOR=(CURL_VERSION/curl_version=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_escape=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_ESCAPE/curl_easy_escape=PROCEDURE)
SYMBOL_VECTOR=(curl_escape=PROCEDURE)
SYMBOL_VECTOR=(CURL_ESCAPE/curl_escape=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_unescape=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_UNESCAPE/curl_easy_unescape=PROCEDURE)
SYMBOL_VECTOR=(curl_unescape=PROCEDURE)
SYMBOL_VECTOR=(CURL_UNESCAPE/curl_unescape=PROCEDURE)
SYMBOL_VECTOR=(curl_free=PROCEDURE)
SYMBOL_VECTOR=(CURL_FREE/curl_free=PROCEDURE)
SYMBOL_VECTOR=(curl_global_init=PROCEDURE)
SYMBOL_VECTOR=(CURL_GLOBAL_INIT/curl_global_init=PROCEDURE)
SYMBOL_VECTOR=(curl_global_init_mem=PROCEDURE)
SYMBOL_VECTOR=(CURL_GLOBAL_INIT_MEM/curl_global_init_mem=PROCEDURE)
SYMBOL_VECTOR=(curl_global_cleanup=PROCEDURE)
SYMBOL_VECTOR=(CURL_GLOBAL_CLEANUP/curl_global_cleanup=PROCEDURE)
SYMBOL_VECTOR=(curl_slist_append=PROCEDURE)
SYMBOL_VECTOR=(CURL_SLIST_APPEND/curl_slist_append=PROCEDURE)
SYMBOL_VECTOR=(curl_slist_free_all=PROCEDURE)
SYMBOL_VECTOR=(CURL_SLIST_FREE_ALL/curl_slist_free_all=PROCEDURE)
SYMBOL_VECTOR=(curl_getdate=PROCEDURE)
SYMBOL_VECTOR=(CURL_GETDATE/curl_getdate=PROCEDURE)
SYMBOL_VECTOR=(curl_share_init=PROCEDURE)
SYMBOL_VECTOR=(CURL_SHARE_INIT/curl_share_init=PROCEDURE)
SYMBOL_VECTOR=(curl_share_setopt=PROCEDURE)
SYMBOL_VECTOR=(CURL_SHARE_SETOPT/curl_share_setopt=PROCEDURE)
SYMBOL_VECTOR=(curl_share_cleanup=PROCEDURE)
SYMBOL_VECTOR=(CURL_SHARE_CLEANUP/curl_share_cleanup=PROCEDURE)
SYMBOL_VECTOR=(curl_version_info=PROCEDURE)
SYMBOL_VECTOR=(CURL_VERSION_INFO/curl_version_info=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_strerror=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_STRERROR/curl_easy_strerror=PROCEDURE)
SYMBOL_VECTOR=(curl_share_strerror=PROCEDURE)
SYMBOL_VECTOR=(CURL_SHARE_STRERROR/curl_share_strerror=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_pause=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_PAUSE/curl_easy_pause=PROCEDURE)
!
! easy.h
SYMBOL_VECTOR=(curl_easy_init=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_INIT/curl_easy_init=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_setopt=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_SETOPT/curl_easy_setopt=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_perform=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_PERFORM/curl_easy_perform=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_cleanup=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_CLEANUP/curl_easy_cleanup=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_getinfo=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_GETINFO/curl_easy_getinfo=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_duphandle=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_DUPHANDLE/curl_easy_duphandle=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_reset=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_RESET/curl_easy_reset=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_recv=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_RECV/curl_easy_recv=PROCEDURE)
SYMBOL_VECTOR=(curl_easy_send=PROCEDURE)
SYMBOL_VECTOR=(CURL_EASY_SEND/curl_easy_send=PROCEDURE)
!
! multi.h
SYMBOL_VECTOR=(curl_multi_init=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_INIT/curl_multi_init=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_add_handle=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_ADD_HANDLE/curl_multi_add_handle=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_remove_handle=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_REMOVE_HANDLE/curl_multi_remove_handle=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_fdset=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_FDSET/curl_multi_fdset=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_perform=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_PERFORM/curl_multi_perform=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_cleanup=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_CLEANUP/curl_multi_cleanup=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_info_read=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_INFO_READ/curl_multi_info_read=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_strerror=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_STRERROR/curl_multi_strerror=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_socket=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_SOCKET/curl_multi_socket=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_socket_action=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_SOCKET_ACTION/curl_multi_socket_action=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_socket_all=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_SOCKET_ALL/curl_multi_socket_all=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_timeout=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_TIMEOUT/curl_multi_timeout=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_setopt=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_SETOPT/curl_multi_setopt=PROCEDURE)
SYMBOL_VECTOR=(curl_multi_assign=PROCEDURE)
SYMBOL_VECTOR=(CURL_MULTI_ASSIGN/curl_multi_assign=PROCEDURE)
!
! mprintf.h
SYMBOL_VECTOR=(curl_mprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MPRINTF/curl_mprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_mfprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MFPRINTF/curl_mfprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_msprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MSPRINTF/curl_msprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_msnprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MSNPRINTF/curl_msnprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_mvprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MVPRINTF/curl_mvprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_mvfprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MVFPRINTF/curl_mvfprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_mvsprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MVSPRINTF/curl_mvsprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_mvsnprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MVSNPRINTF/curl_mvsnprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_maprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MAPRINTF/curl_maprintf=PROCEDURE)
SYMBOL_VECTOR=(curl_mvaprintf=PROCEDURE)
SYMBOL_VECTOR=(CURL_MVAPRINTF/curl_mvaprintf=PROCEDURE)

View File

@ -0,0 +1,845 @@
$! File: gnv_link_curl.com
$!
$! $Id$
$!
$! File to build images using gnv$libcurl.exe
$!
$! Copyright 2009, 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.
$!
$! 10-Jun-2009 J. Malmberg
$!============================================================================
$!
$! Save this so we can get back.
$ default_dir = f$environment("default")
$ define/job gnv_packages_vms 'default_dir'
$!
$ on warning then goto all_exit
$!
$! On VAX, we need to generate a Macro transfer vector.
$ parse_style = "TRADITIONAL"
$ if (f$getsyi("HW_MODEL") .lt. 1024)
$ then
$ @generate_vax_transfer.com
$ arch_name = "VAX"
$ else
$ arch_name = ""
$ arch_name = arch_name + f$edit(f$getsyi("ARCH_NAME"), "UPCASE")
$ if (arch_name .eqs. "") then arch_name = "UNK"
$!
$! Extended parsing option starts with VMS 7.3-1.
$! There is no 7.4, so that simplifies the parse a bit.
$!
$ node_swvers = f$getsyi("node_swvers")
$ version_patch = f$extract(1, f$length(node_swvers), node_swvers)
$ maj_ver = f$element(0, ".", version_patch)
$ min_ver_patch = f$element(1, ".", version_patch)
$ min_ver = f$element(0, "-", min_ver_patch)
$ patch = f$element(1, "-", min_ver_patch)
$ if patch .eqs. "-" then patch = ""
$ parse_x = 0
$ if maj_ver .ges. "8"
$ then
$ parse_x = 1
$ else
$ if maj_ver .eqs. "7" .and. min_ver .ges. "3" .and. patch .nes. ""
$ then
$ parse_x = 1
$ endif
$ endif
$ if parse_x
$ then
$ parse_style = f$getjpi("", "parse_style_perm")
$ endif
$ endif
$!
$!
$! Move to where the base directories.
$ set def [--]
$!
$!
$! Build the Message file.
$!--------------------------
$ if f$search("[.packages.vms]curlmsg.obj") .eqs. ""
$ then
$ message [.packages.vms]curlmsg.msg/object=[.packages.vms]
$ endif
$ if f$search("gnv$curlmsg.exe") .eqs. ""
$ then
$ link/share=gnv$curlmsg.exe [.packages.vms]curlmsg.obj
$ endif
$!
$!
$! Need to build the common init module.
$!-------------------------------------------
$ cflags = "/list/show=(expan,includ)"
$ init_obj = "[.packages.vms]curl_crtl_init.obj"
$ if f$search(init_obj) .eqs. ""
$ then
$ cc'cflags' 'default_dir'curl_crtl_init.c/obj='init_obj'
$ endif
$ purge 'init_obj'
$ rename 'init_obj' ;1
$!
$!
$! Need to build the module to test the HP OpenSSL version
$!--------------------------------------------------------
$ if arch_name .nes. "VAX"
$ then
$ rpt_obj = "[.packages.vms]report_openssl_version.obj
$ if f$search(rpt_obj) .eqs. ""
$ then
$ cc'cflags' 'default_dir'report_openssl_version.c/obj='rpt_obj'
$ endif
$ purge 'rpt_obj'
$ rename 'rpt_obj' ;1
$!
$ link/exe='default_dir'report_openssl_version.exe 'rpt_obj'
$ report_openssl_version := $'default_dir'report_openssl_version.exe
$ endif
$!
$!
$ base_link_opt_file = "[.packages.vms.''arch_name']gnv_libcurl_linker.opt"
$ share_link_opt_file = "[.packages.vms.''arch_name']gnv_ssl_libcurl_linker.opt"
$ if f$search(base_link_opt_file) .eqs. ""
$ then
$ base_link_opt_file = "[.packages.vms]gnv_libcurl_linker.opt"
$ share_link_opt_file = "[.packages.vms]gnv_ssl_libcurl_linker.opt"
$ if f$search(base_link_opt_file) .eqs. ""
$ then
$ write sys$output "Can not find base library option file!"
$ goto all_exit
$ endif
$ endif
$!
$! Create the a new option file with special fixup for HP SSL
$! For a shared image, we always want ZLIB and 32 bit HPSSL
$!
$ if f$search("gnv$libzshr32") .eqs. ""
$ then
$ write sys$output "VMSPORTS/GNV LIBZ Shared image not found!"
$ goto all_exit
$ endif
$!
$!
$! Need to check the version of the HP SSL shared image.
$!
$! VAX platform can not be checked this way, it appears symbol lookup
$! was disabled. VAX has not been updated in a while.
$ if arch_name .eqs. "VAX"
$ then
$ hp_ssl_libcrypto32 = "sys$common:[syslib]ssl$libcrypto_shr32.exe"
$ hp_ssl_libssl32 = "sys$common:[syslib]ssl$libssl_shr32.exe"
$ if f$search(hp_ssl_libcrypto32) .nes. ""
$ then
$ use_hp_ssl = 1
$ curl_ssl_libcrypto32 = hp_ssl_libcrypto32
$ curl_ssl_libssl32 = hp_ssl_libssl32
$ curl_ssl_version = "OpenSSL/0.9.6g"
$ else
$ write sys$output "HP OpenSSL Shared images not found!"
$ goto all_exit
$ endif
$ else
$!
$! Minimum HP version we can use reports:
$! "OpenSSL 0.9.8w 23 Apr 2012"
$!
$ use_hp_ssl = 0
$ hp_ssl_libcrypto32 = "sys$share:ssl$libcrypto_shr32.exe"
$ hp_ssl_libssl32 = "sys$share:ssl$libssl_shr32.exe"
$ if f$search(hp_ssl_libcrypto32) .nes. ""
$ then
$ curl_ssl_libcrypto32 = hp_ssl_libcrypto32
$ curl_ssl_libssl32 = hp_ssl_libssl32
$ report_openssl_version 'hp_ssl_libcrypto32' hp_ssl_version
$ endif
$!
$ if f$type(hp_ssl_version) .eqs. "STRING"
$ then
$ curl_ssl_version = hp_ssl_version
$ full_version = f$element(1, " ", hp_ssl_version)
$ ver_maj = f$element(0, ".", full_version)
$ ver_min = f$element(1, ".", full_version)
$ ver_patch = f$element(2, ".", full_version)
$ ver_patch_len = f$length(ver_patch)
$ ver_patchnum = f$extract(0, ver_patch_len - 1, ver_patch)
$ ver_patchltr = f$extract(ver_patch_len - 1, 1, ver_patch)
$ if 'ver_maj' .ge. 0
$ then
$ if 'ver_min' .ge. 9
$ then
$ if 'ver_patchnum' .ge. 8
$ then
$ if ver_patchltr .ges. "w" then use_hp_ssl = 1
$ endif
$ endif
$ endif
$ if use_hp_ssl .eq. 0
$ then
$ write sys$output -
" HP OpenSSL version of ""''hp_ssl_version'"" is too old for shared libcurl!"
$ endif
$ else
$ write sys$output "Unable to get version of HP OpenSSL"
$ endif
$!
$ gnv_ssl_libcrypto32 = "gnv$gnu:[lib]ssl$libcrypto_shr32.exe"
$ gnv_ssl_libssl32 = "gnv$gnu:[lib]ssl$libssl_shr32.exe"
$ if f$search(gnv_ssl_libcrypto32) .nes. ""
$ then
$ report_openssl_version 'gnv_ssl_libcrypto32' gnv_ssl_version
$ endif
$!
$ use_gnv_ssl = 0
$ if f$type(gnv_ssl_version) .eqs. "STRING"
$ then
$ gnv_full_version = f$element(1, " ", gnv_ssl_version)
$ gnv_ver_maj = f$element(0, ".", gnv_full_version)
$ gnv_ver_min = f$element(1, ".", gnv_full_version)
$ gnv_ver_patch = f$element(2, ".", gnv_full_version)
$ gnv_ver_patch_len = f$length(gnv_ver_patch)
$ gnv_ver_patchnum = f$extract(0, gnv_ver_patch_len - 1, gnv_ver_patch)
$ gnv_ver_patchltr = f$extract(gnv_ver_patch_len - 1, 1, gnv_ver_patch)
$ if 'gnv_ver_maj' .ge. 0
$ then
$ if 'gnv_ver_min' .ge. 9
$ then
$ if 'gnv_ver_patchnum' .ge. 8
$ then
$ if gnv_ver_patchltr .ges. "w" then use_gnv_ssl = 1
$ endif
$ endif
$ endif
$ if use_gnv_ssl .eq. 0
$ then
$ write sys$output -
"GNV OpenSSL version of ""''gnv_ssl_version'" is too old for shared libcurl!"
$ endif
$!
$! Prefer to break the tie with the lowest supported version
$! For simplicity, if the GNV image is present, it will be used.
$! Version tuple is not a simple compare.
$!
$ if use_gnv_ssl .eq. 1 then
$ curl_ssl_libcrypto32 = gnv_ssl_libcrypto32
$ curl_ssl_libssl32 = gnv_ssl_libssl32
$ curl_ssl_version = gnv_ssl_version
$ use_hp_ssl = 0
$ endif
!$!
$ else
$ write sys$output "Unable to get version of GNV OpenSSL"
$ endif
$!
$! Need to write a release note section about HP OpenSSL
$!
$create 'default_dir'hp_ssl_release_info.txt
$deck
This package is built on with the OpenSSL version listed below and requires
the shared images from the HP OpenSSL product that is kitted with that
version or a compatible later version.
For Alpha and IA64 platforms, see the url below to register to get the
download URL. The kit will be HP 1.4-467 or later.
http://h71000.www7.hp.com/openvms/products/ssl/ssl.html
For VAX, use the same registration, but remove the kit name from any of the
download URLs provided and put in CPQ-VAXVMS-SSL-V0101-B-1.PCSI-DCX_VAXEXE
If your system can not be upgraded to a compatible version of OpenSSL, then
you can extract the two shared images from the kit and place them in the
[vms$common.gnv.lib]directory of the volume that you are installing GNV and
or GNV compatible components like Curl.
If GNV is installed, you must run the GNV startup procedure before these steps
and before installing Curl.
1. make sure that [vms$common.gnv.lib] exists by using the following
commands. We want the directory to be in lowercase except on VAX.
$SET PROCESS/PARSE=extend !If not VAX.
$CREATE/DIR device:[vms$common.gnv.lib]/prot=w:re
2. Extract the ssl$crypto_shr32.exe and ssl$libssl_shr32.exe images.
$PRODUCT EXTRACT FILE -
/select=(ssl$libcrypto_shr32.exe,ssl$libssl_shr32.exe)-
/source=device:[dir] -
/destination=device:[vms$common.gnv.lib]
The [vms$common.sys$startup}curl_startup.com procedure will then configure
libcurl to use these shared images instead of the system ones.
When you upgrade SSL on VMS to the newer version of HP SSL, then these copies
should be deleted.
$eod
$!
$ open/append sslr 'default_dir'hp_ssl_release_info.txt
$ write sslr "OpenSSL version used for building this kit: ",curl_ssl_version
$ write sslr ""
$ close sslr
$!
$!
$! LIBZ
$ libzshr_line = ""
$ try_shr = "gnv$libzshr32"
$ if f$search(try_shr) .nes. ""
$ then
$ libzshr_line = "''try_shr'/share"
$ else
$ write sys$output "''try_shr' image not found!"
$ goto all_exit
$ endif
$!
$!
$ gssrtlshr_line = ""
$ if arch_name .nes. "VAX"
$ then
$ try_shr = "sys$share:gss$rtl"
$ if f$search("''try_shr'.exe") .nes. ""
$ then
$ gssrtlshr_line = "''try_shr'/share"
$ else
$ write sys$output "''try_shr' image not found!"
$ goto all_exit
$ endif
$ endif
$!
$!
$!
$ if f$search(share_link_opt_file) .eqs. ""
$ then
$ create 'share_link_opt_file'
$ open/append slopt 'share_link_opt_file'
$ if libzshr_line .nes. "" then write slopt libzshr_line
$ if gssrtlshr_line .nes. "" then write slopt gssrtlshr_line
$ write slopt "gnv$curl_ssl_libcryptoshr32/share"
$ write slopt "gnv$curl_ssl_libsslshr32/share"
$ close slopt
$ endif
$!
$! DCL build puts curllib in architecture directory
$! GNV build uses the makefile.
$ libfile = "[.packages.vms.''arch_name']curllib.olb"
$ if f$search(libfile) .nes. ""
$ then
$ olb_file = libfile
$ else
$ ! GNV based build
$ libfile = "[.lib.^.libs]libcurl.a"
$ if f$search(libfile) .nes. ""
$ then
$ olb_file = libfile
$ else
$ write sys$output -
"Can not build shared image, libcurl object library not found!"
$ goto all_exit
$ endif
$ endif
$!
$gnv_libcurl_share = "''default_dir'gnv$libcurl.exe"
$!
$set ver
$ if f$search(gnv_libcurl_share) .eqs. ""
$ then
$ if arch_name .nes. "VAX"
$ then
$ define/user gnv$curl_ssl_libcryptoshr32 'curl_ssl_libcrypto32'
$ define/user gnv$curl_ssl_libsslshr32 'curl_ssl_libssl32'
$ link/dsf='default_dir'gnv$libcurl.dsf/share='gnv_libcurl_share' -
/map='default_dir'gnv$libcurl.map -
gnv_packages_vms:gnv_libcurl_symbols.opt/opt,-
'olb_file'/lib,-
'share_link_opt_file'/opt
$ else
$! VAX will not allow the logical name hack for the
$! SSL libcryto library, it is pulling it in twice if I try it.
$ link/share='gnv_libcurl_share'/map='default_dir'gnv$libcurl.map -
gnv_packages_vms:gnv_libcurl_xfer.opt/opt,-
'olb_file'/lib,-
'base_link_opt_file'/opt
$ endif
$ endif
$!
$!
$ if f$search("[.src]curl-tool_main.o") .nes. ""
$ then
$! From src/makefile.inc:
$! # libcurl has sources that provide functions named curlx_* that aren't
$! # part of the official API, but we re-use the code here to avoid
$! # duplication.
$!
$!
$ if f$search("[.src]curl.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.src]curl.exe/dsf=[.src]curl.dsf -
[.src]curl-tool_main.o, [.src]curl-tool_binmode.o, -
[.src]curl-tool_bname.o, [.src]curl-tool_cb_dbg.o, -
[.src]curl-tool_cb_hdr.o, [.src]curl-tool_cb_prg.o, -
[.src]curl-tool_cb_rea.o, [.src]curl-tool_cb_see.o, -
[.src]curl-tool_cb_wrt.o, [.src]curl-tool_cfgable.o, -
[.src]curl-tool_convert.o, [.src]curl-tool_dirhie.o, -
[.src]curl-tool_doswin.o, [.src]curl-tool_easysrc.o, -
[.src]curl-tool_formparse.o, [.src]curl-tool_getparam.o, -
[.src]curl-tool_getpass.o, [.src]curl-tool_help.o, -
[.src]curl-tool_helpers.o, [.src]curl-tool_homedir.o, -
[.src]curl-tool_hugehelp.o, [.src]curl-tool_libinfo.o, -
[.src]curl-tool_metalink.o, [.src]curl-tool_mfiles.o, -
[.src]curl-tool_msgs.o, [.src]curl-tool_operate.o, -
[.src]curl-tool_operhlp.o, [.src]curl-tool_panykey.o, -
[.src]curl-tool_paramhlp.o, [.src]curl-tool_parsecfg.o, -
[.src]curl-tool_setopt.o, [.src]curl-tool_sleep.o, -
[.src]curl-tool_urlglob.o, [.src]curl-tool_util.o, -
[.src]curl-tool_vms.o, [.src]curl-tool_writeenv.o, -
[.src]curl-tool_writeout.o, [.src]curl-tool_xattr.o, -
[.src]curl-strtoofft.o, [.src]curl-strdup.o, [.src]curl-rawstr.o, -
[.src]curl-nonblock.o, gnv_packages_vms:curlmsg.obj,-
sys$input:/opt
gnv$libcurl/share
gnv_packages_vms:curl_crtl_init.obj
$ endif
$ else
$ curl_exe = "[.src]curl.exe"
$ curl_dsf = "[.src]curl.dsf"
$ curl_main = "[.packages.vms.''arch_name']tool_main.obj"
$ curl_src = "[.packages.vms.''arch_name']curlsrc.olb"
$ curl_lib = "[.packages.vms.''arch_name']curllib.olb"
$ strtoofft = "strtoofft"
$ strdup = "strdup"
$ rawstr = "rawstr"
$ nonblock = "nonblock"
$!
$! Extended parse style requires special quoting
$!
$ if (arch_name .nes. "VAX") .and. (parse_style .eqs. "EXTENDED")
$ then
$ strtoofft = """strtoofft"""
$ strdup = """strdup"""
$ rawstr = """rawstr"""
$ nonblock = """nonblock"""
$ endif
$ if f$search(curl_exe) .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe='curl_exe'/dsf='curl_dsf' -
'curl_main','curl_src'/lib, -
'curl_lib'/library/include=-
('strtoofft', 'strdup', 'rawstr', 'nonblock'),-
gnv_packages_vms:curlmsg.obj,-
sys$input:/opt
gnv$libcurl/share
gnv_packages_vms:curl_crtl_init.obj
$ endif
$ endif
$!
$set nover
$!
$! in6addr_missing so skip building:
$! [.server]sws.o
$! [.server]sockfilt.o
$! [.server]tftpd.o
$!
$!
$ target = "10-at-a-time"
$ if f$search("[.docs.examples]''target'.o") .eqs. ""
$ then
$ write sys$output "examples not built"
$ goto all_exit
$ endif
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "anyauthput"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "certinfo"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "cookie_interface"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "debug"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "fileupload"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$ target = "fopen"
$ if f$search("[.docs.examples]''target'.exe") .eqs. ""
$ then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$ endif
$!
$!
$target = "ftpget"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "ftpgetresp"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "ftpupload"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "getinfo"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "getinmemory"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "http-post"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "httpcustomheader"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "httpput"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "https"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-app"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-debugcallback"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-double"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-post"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "multi-single"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "persistant"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "post-callback"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "postit2"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "sendrecv"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "sepheaders"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "simple"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "simplepost"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$!
$target = "simplessl"
$if f$search("[.docs.examples]''target'.exe") .eqs. ""
$then
$ define/user gnv$libcurl 'gnv_libcurl_share'
$ link'ldebug'/exe=[.docs.examples]'target'.exe-
/dsf=[.docs.examples]'target'.dsf -
[.docs.examples]'target'.o,-
gnv$'target'.opt/opt,-
sys$input:/opt
gnv$libcurl/share
$endif
$!
$! =============== End of docs/examples =========================
$!
$!
$all_exit:
$set def 'default_dir'
$exit '$status'
$!

View File

@ -0,0 +1,11 @@
macro32_exactcase.exe
SE EC
^X00000001
RE /I
^X00012B1D
'BICB2 #^X00000020,R3'
EXIT
'BICB2 #^X00000000,R3'
EXI
U
EXI

View File

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