Force argv to be an array of long pointers on VMS
authorRichard Levitte <levitte@openssl.org>
Fri, 1 Apr 2016 10:36:51 +0000 (12:36 +0200)
committerRichard Levitte <levitte@openssl.org>
Fri, 1 Apr 2016 14:23:35 +0000 (16:23 +0200)
Reverts commit 087ca80ad83071dde0bb6bc1c28c743caa00eaf8

Instead of battling the odd format of argv given to main() in default
P64 mode, tell the compiler to make it an array of 64-bit pointers
when compiling in P64 mode.

A note is added in NOTES.VMS regarding minimum DEC C version.

Reviewed-by: Andy Polyakov <appro@openssl.org>
Configurations/10-main.conf
NOTES.VMS
apps/apps.h
apps/openssl.c
apps/vms_decc_init.c

index 11ff13e348f9d4b38543cb1ad5791d6e6ca931f7..1b32b10f3c0890b2f42b5ea4b1a1114d6af5ac62 100644 (file)
@@ -1763,7 +1763,7 @@ sub vms_info {
     "vms-alpha-p64" => {
         inherit_from     => [ "vms-alpha" ],
         cflags           =>
-            add("/POINTER_SIZE=64",
+            add("/POINTER_SIZE=64=ARGV",
                 sub { my @warnings =
                           @{vms_info()->{disable_warns_p64}};
                       @warnings
@@ -1796,7 +1796,7 @@ sub vms_info {
     "vms-ia64-p64" => {
         inherit_from     => [ "vms-ia64" ],
         cflags           =>
-            add("/POINTER_SIZE=64",
+            add("/POINTER_SIZE=64=ARGV",
                 sub { my @warnings =
                           @{vms_info()->{disable_warns_p64}};
                       @warnings
index ba1dbb475daf7c71821eeaa8f5535c0177016db5..6aeda11c77fe5e21b9f8acfa11710c5e6033cc8b 100644 (file)
--- a/NOTES.VMS
+++ b/NOTES.VMS
@@ -18,8 +18,9 @@
  An ANSI C compiled is needed among other things.  This means that
  VAX C is not and will not be supported.
 
- We have only tested with DEC C (a.k.a HP VMS C / VSI C), compiling
- with a different ANSI C compiler may require some work.
+ We have only tested with DEC C (a.k.a HP VMS C / VSI C) and require
+ version 7.1 or later.  Compiling with a different ANSI C compiler may
+ require some work.
 
  Please avoid using C RTL feature logical names DECC$* when building
  and testing OpenSSL.  Most of all, they can be disruptive when
index 7cf0dc4b6a662816d77dd13b41dcab681499bae9..434ca54b7daf7f544d4653dcb859d52cc6a3e0d9 100644 (file)
@@ -445,15 +445,12 @@ typedef struct args_st {
     char **argv;
 } ARGS;
 
-#if defined(OPENSSL_SYS_VMS) && defined(__DECC)
-# pragma pointer_size save
-# pragma pointer_size 32
-typedef char **argv_t;
-# pragma pointer_size restore
-char **copy_argv(int *argc, argv_t argv);
-#else
-typedef char **argv_t;
-#endif
+/*
+ * VMS C only for now, implemented in vms_decc_init.c
+ * If other C compilers forget to terminate argv with NULL, this function
+ * can be re-used.
+ */
+char **copy_argv(int *argc, char *argv[]);
 
 
 # define PW_MIN_LENGTH 4
index b810ecf8b8944d9feedaa5c33e1f798f58352ef4..26ea449dceeddbcc40448d44256c4176abb2dcfc 100644 (file)
@@ -216,7 +216,6 @@ int main(int argc, char *argv[])
     FUNCTION f, *fp;
     LHASH_OF(FUNCTION) *prog = NULL;
     char **copied_argv = NULL;
-    char **argv_alias  = NULL;
     char *p, *pname;
     char buf[1024];
     const char *prompt;
@@ -232,10 +231,8 @@ int main(int argc, char *argv[])
     bio_out = dup_bio_out(FORMAT_TEXT);
     bio_err = dup_bio_err(FORMAT_TEXT);
 
-#if defined( OPENSSL_SYS_VMS) && defined(__DECC)
-    copied_argv = argv_alias = copy_argv(&argc, argv);
-#else
-    argv_alias = argv;
+#if defined(OPENSSL_SYS_VMS) && defined(__DECC)
+    copied_argv = argv = copy_argv(&argc, argv);
 #endif
 
     p = getenv("OPENSSL_DEBUG_MEMORY");
@@ -259,22 +256,22 @@ int main(int argc, char *argv[])
         goto end;
 
     prog = prog_init();
-    pname = opt_progname(argv_alias[0]);
+    pname = opt_progname(argv[0]);
 
     /* first check the program name */
     f.name = pname;
     fp = lh_FUNCTION_retrieve(prog, &f);
     if (fp != NULL) {
-        argv_alias[0] = pname;
-        ret = fp->func(argc, argv_alias);
+        argv[0] = pname;
+        ret = fp->func(argc, argv);
         goto end;
     }
 
     /* If there is stuff on the command line, run with that. */
     if (argc != 1) {
         argc--;
-        argv_alias++;
-        ret = do_cmd(prog, argc, argv_alias);
+        argv++;
+        ret = do_cmd(prog, argc, argv);
         if (ret < 0)
             ret = 0;
         goto end;
index 8f8ffc6753214e66fc5fd48d363e308e549c3961..ecf21afb6ea69201bb2c55b9d5c628a45ffc1969 100644 (file)
@@ -106,7 +106,7 @@ decc_feat_t decc_feat_array[] = {
 };
 
 
-char **copy_argv(int *argc, argv_t argv)
+char **copy_argv(int *argc, char *argv[])
 {
     /*-
      * The note below is for historical purpose.  On VMS now we always