| 
									
										
											  
											
												Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master.  The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt.  Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that.  There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
        For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
        RT3515: Use 3DES in pkcs12 if built with no-rc2
        RT1766: s_client -reconnect and -starttls broke
        RT2932: Catch write errors
        RT2604: port should be 'unsigned short'
        RT2983: total_bytes undeclared #ifdef RENEG
        RT1523: Add -nocert to fix output in x509 app
        RT3508: Remove unused variable introduced by b09eb24
        RT3511: doc fix; req default serial is random
        RT1325,2973: Add more extensions to c_rehash
        RT2119,3407: Updated to dgst.pod
        RT2379: Additional typo fix
        RT2693: Extra include of string.h
        RT2880: HFS is case-insensitive filenames
        RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
        Add SCSV support
        Add -misalign to speed command
        Make dhparam, dsaparam, ecparam, x509 output C in proper style
        Make some internal ocsp.c functions void
        Only display cert usages with -help in verify
        Use global bio_err, remove "BIO*err" parameter from functions
        For filenames, - always means stdin (or stdout as appropriate)
        Add aliases for -des/aes "wrap" ciphers.
        *Remove support for IISSGC (server gated crypto)
        *The undocumented OCSP -header flag is now "-header name=value"
        *Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
											
										 
											2015-04-25 03:26:15 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Written by sms and contributed to the OpenSSL project. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | /* ====================================================================
 | 
					
						
							|  |  |  |  * Copyright (c) 2010 The OpenSSL Project.  All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |  * are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer in | 
					
						
							|  |  |  |  *    the documentation and/or other materials provided with the | 
					
						
							|  |  |  |  *    distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 3. All advertising materials mentioning features or use of this | 
					
						
							|  |  |  |  *    software must display the following acknowledgment: | 
					
						
							|  |  |  |  *    "This product includes software developed by the OpenSSL Project | 
					
						
							|  |  |  |  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | 
					
						
							|  |  |  |  *    endorse or promote products derived from this software without | 
					
						
							|  |  |  |  *    prior written permission. For written permission, please contact | 
					
						
							|  |  |  |  *    licensing@OpenSSL.org. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 5. Products derived from this software may not be called "OpenSSL" | 
					
						
							|  |  |  |  *    nor may "OpenSSL" appear in their names without prior written | 
					
						
							|  |  |  |  *    permission of the OpenSSL Project. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 6. Redistributions of any form whatsoever must retain the following | 
					
						
							|  |  |  |  *    acknowledgment: | 
					
						
							|  |  |  |  *    "This product includes software developed by the OpenSSL Project | 
					
						
							|  |  |  |  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | 
					
						
							|  |  |  |  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
					
						
							|  |  |  |  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR | 
					
						
							|  |  |  |  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
					
						
							|  |  |  |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
					
						
							|  |  |  |  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
					
						
							|  |  |  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
					
						
							|  |  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 
					
						
							|  |  |  |  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
					
						
							|  |  |  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 
					
						
							|  |  |  |  * OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  * ==================================================================== | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | #if defined( __VMS) && !defined( OPENSSL_NO_DECC_INIT) && \
 | 
					
						
							|  |  |  |  defined( __DECC) && !defined( __VAX) && (__CRTL_VER >= 70301000) | 
					
						
							|  |  |  | # define USE_DECC_INIT 1
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef USE_DECC_INIT
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master.  The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt.  Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that.  There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
        For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
        RT3515: Use 3DES in pkcs12 if built with no-rc2
        RT1766: s_client -reconnect and -starttls broke
        RT2932: Catch write errors
        RT2604: port should be 'unsigned short'
        RT2983: total_bytes undeclared #ifdef RENEG
        RT1523: Add -nocert to fix output in x509 app
        RT3508: Remove unused variable introduced by b09eb24
        RT3511: doc fix; req default serial is random
        RT1325,2973: Add more extensions to c_rehash
        RT2119,3407: Updated to dgst.pod
        RT2379: Additional typo fix
        RT2693: Extra include of string.h
        RT2880: HFS is case-insensitive filenames
        RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
        Add SCSV support
        Add -misalign to speed command
        Make dhparam, dsaparam, ecparam, x509 output C in proper style
        Make some internal ocsp.c functions void
        Only display cert usages with -help in verify
        Use global bio_err, remove "BIO*err" parameter from functions
        For filenames, - always means stdin (or stdout as appropriate)
        Add aliases for -des/aes "wrap" ciphers.
        *Remove support for IISSGC (server gated crypto)
        *The undocumented OCSP -header flag is now "-header name=value"
        *Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
											
										 
											2015-04-25 03:26:15 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * ---------------------------------------------------------------------- | 
					
						
							|  |  |  |  * decc_init() On non-VAX systems, uses LIB$INITIALIZE to set a collection | 
					
						
							|  |  |  |  * of C RTL features without using the DECC$* logical name method. | 
					
						
							|  |  |  |  * ---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # include <stdio.h>
 | 
					
						
							|  |  |  | # include <stdlib.h>
 | 
					
						
							|  |  |  | # include <unixlib.h>
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-30 21:54:29 +08:00
										 |  |  | # include "apps.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | /* Global storage. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Flag to sense if decc_init() was called. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int decc_init_done = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Structure to hold a DECC$* feature name and its desired value. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |     char *name; | 
					
						
							|  |  |  |     int value; | 
					
						
							|  |  |  | } decc_feat_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Array of DECC$* feature names and their desired values. Note: | 
					
						
							|  |  |  |  * DECC$ARGV_PARSE_STYLE is the urgent one. | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | decc_feat_t decc_feat_array[] = { | 
					
						
							|  |  |  |     /* Preserve command-line case with SET PROCESS/PARSE_STYLE=EXTENDED */ | 
					
						
							|  |  |  |     {"DECC$ARGV_PARSE_STYLE", 1}, | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     /* Preserve case for file names on ODS5 disks. */ | 
					
						
							|  |  |  |     {"DECC$EFS_CASE_PRESERVE", 1}, | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * Enable multiple dots (and most characters) in ODS5 file names, while | 
					
						
							|  |  |  |      * preserving VMS-ness of ";version". | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     {"DECC$EFS_CHARSET", 1}, | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     /* List terminator. */ | 
					
						
							|  |  |  |     {(char *)NULL, 0} | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master.  The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt.  Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that.  There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
        For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
        RT3515: Use 3DES in pkcs12 if built with no-rc2
        RT1766: s_client -reconnect and -starttls broke
        RT2932: Catch write errors
        RT2604: port should be 'unsigned short'
        RT2983: total_bytes undeclared #ifdef RENEG
        RT1523: Add -nocert to fix output in x509 app
        RT3508: Remove unused variable introduced by b09eb24
        RT3511: doc fix; req default serial is random
        RT1325,2973: Add more extensions to c_rehash
        RT2119,3407: Updated to dgst.pod
        RT2379: Additional typo fix
        RT2693: Extra include of string.h
        RT2880: HFS is case-insensitive filenames
        RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
        Add SCSV support
        Add -misalign to speed command
        Make dhparam, dsaparam, ecparam, x509 output C in proper style
        Make some internal ocsp.c functions void
        Only display cert usages with -help in verify
        Use global bio_err, remove "BIO*err" parameter from functions
        For filenames, - always means stdin (or stdout as appropriate)
        Add aliases for -des/aes "wrap" ciphers.
        *Remove support for IISSGC (server gated crypto)
        *The undocumented OCSP -header flag is now "-header name=value"
        *Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
											
										 
											2015-04-25 03:26:15 +08:00
										 |  |  | char **copy_argv(int *argc, char *argv[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /*-
 | 
					
						
							|  |  |  |      * The note below is for historical purpose.  On VMS now we always | 
					
						
							|  |  |  |      * copy argv "safely." | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * 2011-03-22 SMS. | 
					
						
							|  |  |  |      * If we have 32-bit pointers everywhere, then we're safe, and | 
					
						
							|  |  |  |      * we bypass this mess, as on non-VMS systems. | 
					
						
							|  |  |  |      * Problem 1: Compaq/HP C before V7.3 always used 32-bit | 
					
						
							|  |  |  |      * pointers for argv[]. | 
					
						
							|  |  |  |      * Fix 1: For a 32-bit argv[], when we're using 64-bit pointers | 
					
						
							|  |  |  |      * everywhere else, we always allocate and use a 64-bit | 
					
						
							|  |  |  |      * duplicate of argv[]. | 
					
						
							|  |  |  |      * Problem 2: Compaq/HP C V7.3 (Alpha, IA64) before ECO1 failed | 
					
						
							|  |  |  |      * to NULL-terminate a 64-bit argv[].  (As this was written, the | 
					
						
							|  |  |  |      * compiler ECO was available only on IA64.) | 
					
						
							|  |  |  |      * Fix 2: Unless advised not to (VMS_TRUST_ARGV), we test a | 
					
						
							|  |  |  |      * 64-bit argv[argc] for NULL, and, if necessary, use a | 
					
						
							|  |  |  |      * (properly) NULL-terminated (64-bit) duplicate of argv[]. | 
					
						
							|  |  |  |      * The same code is used in either case to duplicate argv[]. | 
					
						
							|  |  |  |      * Some of these decisions could be handled in preprocessing, | 
					
						
							|  |  |  |      * but the code tends to get even uglier, and the penalty for | 
					
						
							|  |  |  |      * deciding at compile- or run-time is tiny. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int i, count = *argc; | 
					
						
							| 
									
										
										
										
											2015-05-02 11:10:31 +08:00
										 |  |  |     char **newargv = app_malloc(sizeof(*newargv) * (count + 1), "argv copy"); | 
					
						
							| 
									
										
											  
											
												Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master.  The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt.  Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that.  There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
        For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
        RT3515: Use 3DES in pkcs12 if built with no-rc2
        RT1766: s_client -reconnect and -starttls broke
        RT2932: Catch write errors
        RT2604: port should be 'unsigned short'
        RT2983: total_bytes undeclared #ifdef RENEG
        RT1523: Add -nocert to fix output in x509 app
        RT3508: Remove unused variable introduced by b09eb24
        RT3511: doc fix; req default serial is random
        RT1325,2973: Add more extensions to c_rehash
        RT2119,3407: Updated to dgst.pod
        RT2379: Additional typo fix
        RT2693: Extra include of string.h
        RT2880: HFS is case-insensitive filenames
        RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
        Add SCSV support
        Add -misalign to speed command
        Make dhparam, dsaparam, ecparam, x509 output C in proper style
        Make some internal ocsp.c functions void
        Only display cert usages with -help in verify
        Use global bio_err, remove "BIO*err" parameter from functions
        For filenames, - always means stdin (or stdout as appropriate)
        Add aliases for -des/aes "wrap" ciphers.
        *Remove support for IISSGC (server gated crypto)
        *The undocumented OCSP -header flag is now "-header name=value"
        *Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
											
										 
											2015-04-25 03:26:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < count; i++) | 
					
						
							|  |  |  |         newargv[i] = argv[i]; | 
					
						
							|  |  |  |     newargv[i] = NULL; | 
					
						
							|  |  |  |     *argc = i; | 
					
						
							|  |  |  |     return newargv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | /* LIB$INITIALIZE initialization function. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | static void decc_init(void) | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     char *openssl_debug_decc_init; | 
					
						
							|  |  |  |     int verbose = 0; | 
					
						
							|  |  |  |     int feat_index; | 
					
						
							|  |  |  |     int feat_value; | 
					
						
							|  |  |  |     int feat_value_max; | 
					
						
							|  |  |  |     int feat_value_min; | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     int sts; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Get debug option. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     openssl_debug_decc_init = getenv("OPENSSL_DEBUG_DECC_INIT"); | 
					
						
							|  |  |  |     if (openssl_debug_decc_init != NULL) { | 
					
						
							|  |  |  |         verbose = strtol(openssl_debug_decc_init, NULL, 10); | 
					
						
							|  |  |  |         if (verbose <= 0) { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |             verbose = 1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Set the global flag to indicate that LIB$INITIALIZE worked. */ | 
					
						
							|  |  |  |     decc_init_done = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Loop through all items in the decc_feat_array[]. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     for (i = 0; decc_feat_array[i].name != NULL; i++) { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |         /* Get the feature index. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         feat_index = decc$feature_get_index(decc_feat_array[i].name); | 
					
						
							|  |  |  |         if (feat_index >= 0) { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |             /* Valid item.  Collect its properties. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             feat_value = decc$feature_get_value(feat_index, 1); | 
					
						
							|  |  |  |             feat_value_min = decc$feature_get_value(feat_index, 2); | 
					
						
							|  |  |  |             feat_value_max = decc$feature_get_value(feat_index, 3); | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             /* Check the validity of our desired value. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             if ((decc_feat_array[i].value >= feat_value_min) && | 
					
						
							|  |  |  |                 (decc_feat_array[i].value <= feat_value_max)) { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |                 /* Valid value.  Set it if necessary. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                 if (feat_value != decc_feat_array[i].value) { | 
					
						
							|  |  |  |                     sts = decc$feature_set_value(feat_index, | 
					
						
							|  |  |  |                                                  1, decc_feat_array[i].value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (verbose > 1) { | 
					
						
							|  |  |  |                         fprintf(stderr, " %s = %d, sts = %d.\n", | 
					
						
							|  |  |  |                                 decc_feat_array[i].name, | 
					
						
							|  |  |  |                                 decc_feat_array[i].value, sts); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |                 /* Invalid DECC feature value. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                 fprintf(stderr, | 
					
						
							|  |  |  |                         " INVALID DECC$FEATURE VALUE, %d: %d <= %s <= %d.\n", | 
					
						
							|  |  |  |                         feat_value, | 
					
						
							|  |  |  |                         feat_value_min, decc_feat_array[i].name, | 
					
						
							|  |  |  |                         feat_value_max); | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |             /* Invalid DECC feature name. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             fprintf(stderr, | 
					
						
							|  |  |  |                     " UNKNOWN DECC$FEATURE: %s.\n", decc_feat_array[i].name); | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     if (verbose > 0) { | 
					
						
							|  |  |  |         fprintf(stderr, " DECC_INIT complete.\n"); | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get "decc_init()" into a valid, loaded LIB$INITIALIZE PSECT. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma nostandard
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Establish the LIB$INITIALIZE PSECTs, with proper alignment and other | 
					
						
							|  |  |  |  * attributes.  Note that "nopic" is significant only on VAX. | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model save
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # if __INITIAL_POINTER_SIZE == 64
 | 
					
						
							|  |  |  | #  define PSECT_ALIGN 3
 | 
					
						
							|  |  |  | # else
 | 
					
						
							|  |  |  | #  define PSECT_ALIGN 2
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model strict_refdef "LIB$INITIALIZ" PSECT_ALIGN, nopic, nowrt
 | 
					
						
							|  |  |  | const int spare[8] = { 0 }; | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model strict_refdef "LIB$INITIALIZE" PSECT_ALIGN, nopic, nowrt
 | 
					
						
							|  |  |  | void (*const x_decc_init) () = decc_init; | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model restore
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Fake reference to ensure loading the LIB$INITIALIZE PSECT. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model save
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | int LIB$INITIALIZE(void); | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model strict_refdef
 | 
					
						
							|  |  |  | int dmy_lib$initialize = (int)LIB$INITIALIZE; | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma extern_model restore
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # pragma standard
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | #else                           /* def USE_DECC_INIT */
 | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Dummy code to avoid a %CC-W-EMPTYFILE complaint. */ | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | int decc_init_dummy(void); | 
					
						
							| 
									
										
										
										
											2011-03-19 18:58:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | #endif                          /* def USE_DECC_INIT */
 |