}
-int main(int Argc, char *Argv[])
+int main(int Argc, char *_Argv[])
{
ARGS arg;
#define PROG_NAME_SIZE 39
char **argv,*p;
LHASH_OF(FUNCTION) *prog=NULL;
long errline;
-
+
+#if defined( OPENSSL_SYS_VMS) && !defined( VMS_TRUST_ARGV)
+ /* 2011-03-08 SMS.
+ * "HP C V7.3-009 on OpenVMS Alpha V8.3" with 64-bit
+ * pointers (at least) may not NULL-terminate argv[]
+ * as expected. If necessary, use a (properly)
+ * NULL-terminated duplicate of argv[].
+ */
+ /* 2011-03-20 RL.
+ * Additionally, when the argument vector is full of
+ * 32-bit pointers and we have a 64-bit pointer size
+ * everywhere else, we need to make a copy of it using
+ * 64-bit pointers. Hence the odd conditinal.
+ */
+ char **Argv = NULL;
+ int free_Argv = 0;
+
+ if (_Argv[ Argc] != NULL
+# if defined(__INITIAL_POINTER_SIZE)
+ || sizeof(_Argv) < (__INITIAL_POINTER_SIZE / 8)
+# endif
+ )
+ {
+ int i;
+ Argv = OPENSSL_malloc( (Argc+ 1)* sizeof( char *));
+ if (Argv == NULL)
+ { ret = -1; goto end; }
+ for(i = 0; i < Argc; i++)
+ Argv[i] = _Argv[i];
+ Argv[ Argc] = NULL;
+ free_Argv = 1;
+ }
+ else
+ {
+ /* 2011-03-20 RL.
+ * If we didn't copy the argument vector, then simply
+ * assign our variable. This will never happen when
+ * the argument vector pointer size was smaller than
+ * the initial pointer size, so even if the case might
+ * look unsafe, it isn't, it's just there to shut the
+ * compiler up.
+ */
+ Argv = (char **)_Argv;
+ }
+#else
+ char **Argv = _Argv;
+#endif
+
arg.data=NULL;
arg.count=0;
i=NCONF_load(config,p,&errline);
if (i == 0)
{
- NCONF_free(config);
- config = NULL;
- ERR_clear_error();
+ if (ERR_GET_REASON(ERR_peek_last_error())
+ == CONF_R_NO_SUCH_FILE)
+ {
+ BIO_printf(bio_err,
+ "WARNING: can't open config file: %s\n",p);
+ ERR_clear_error();
+ NCONF_free(config);
+ config = NULL;
+ }
+ else
+ {
+ ERR_print_errors(bio_err);
+ NCONF_free(config);
+ exit(1);
+ }
}
prog=prog_init();
else prompt="OpenSSL> ";
fputs(prompt,stdout);
fflush(stdout);
- fgets(p,n,stdin);
+ if (!fgets(p,n,stdin))
+ goto end;
if (p[0] == '\0') goto end;
i=strlen(p);
if (i <= 1) break;
BIO_free(bio_err);
bio_err=NULL;
}
+#if defined( OPENSSL_SYS_VMS) && !defined( VMS_TRUST_ARGV)
+ /* Free any duplicate Argv[] storage. */
+ if (free_Argv)
+ {
+ OPENSSL_free(Argv);
+ }
+#endif
OPENSSL_EXIT(ret);
}
{ ret=0; goto end; }
f.name=argv[0];
fp=lh_FUNCTION_retrieve(prog,&f);
+ if (fp == NULL)
+ {
+ if (EVP_get_digestbyname(argv[0]))
+ {
+ f.type = FUNC_TYPE_MD;
+ f.func = dgst_main;
+ fp = &f;
+ }
+ else if (EVP_get_cipherbyname(argv[0]))
+ {
+ f.type = FUNC_TYPE_CIPHER;
+ f.func = enc_main;
+ fp = &f;
+ }
+ }
if (fp != NULL)
{
ret=fp->func(argc,argv);
return(NULL);
for (f=functions; f->name != NULL; f++)
- lh_FUNCTION_insert(ret,f);
+ (void)lh_FUNCTION_insert(ret,f);
return(ret);
}