Move to beta 3.
[openssl.git] / apps / openssl.c
index f69f14aa2e262e9977caefe5354b0de8e5f83f08..d7d6601b083f3e4d3963736035a5cf150bdd2860 100644 (file)
@@ -1,5 +1,5 @@
-/* apps/ssleay.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* apps/openssl.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
  * [including the GNU Public Licence.]
  */
 
-#define DEBUG
+#ifndef DEBUG
+#undef DEBUG
+#endif
 
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
-#ifdef WIN16
-#define APPS_WIN16
-#endif
-#include "bio.h"
-#include "crypto.h"
-#include "lhash.h"
-#include "conf.h"
-#include "x509.h"
-#include "pem.h"
-#include "ssl.h"
+#include <openssl/bio.h>
+#include <openssl/crypto.h>
+#include <openssl/lhash.h>
+#include <openssl/conf.h>
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+#include <openssl/ssl.h>
 #define SSLEAY /* turn off a few special case MONOLITH macros */
 #define USE_SOCKETS /* needed for the _O_BINARY defs in the MS world */
 #define SSLEAY_SRC
 #include "apps.h"
 #include "s_apps.h"
-#include "err.h"
+#include <openssl/err.h>
 
+/*
+#ifdef WINDOWS
+#include "bss_file.c"
+#endif
+*/
 
-#ifndef NOPROTO
 static unsigned long MS_CALLBACK hash(FUNCTION *a);
 static int MS_CALLBACK cmp(FUNCTION *a,FUNCTION *b);
 static LHASH *prog_init(void );
 static int do_cmd(LHASH *prog,int argc,char *argv[]);
-static void sig_stop(int i);
-#else
-static unsigned long MS_CALLBACK hash();
-static int MS_CALLBACK cmp();
-static LHASH *prog_init();
-static int do_cmd();
-static void sig_stop();
-#endif
-
 LHASH *config=NULL;
 char *default_config_file=NULL;
 
 #ifdef DEBUG
-static void sig_stop(i)
-int i;
+static void sig_stop(int i)
        {
        char *a=NULL;
 
@@ -111,9 +104,7 @@ int i;
 BIO *bio_err=NULL;
 #endif
 
-int main(Argc,Argv)
-int Argc;
-char *Argv[];
+int main(int Argc, char *Argv[])
        {
        ARGS arg;
 #define PROG_NAME_SIZE 16
@@ -143,19 +134,23 @@ char *Argv[];
 
        if (bio_err == NULL)
                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
-                       BIO_set_fp(bio_err,stderr,BIO_NOCLOSE);
+                       BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
 
        CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
 
        ERR_load_crypto_strings();
 
        /* Lets load up our environment a little */
-       p=getenv("SSLEAY_CONF");
+       p=getenv("OPENSSL_CONF");
+       if (p == NULL)
+               p=getenv("SSLEAY_CONF");
        if (p == NULL)
                {
                strcpy(config_name,X509_get_default_cert_area());
-               strcat(config_name,"/lib/");
-               strcat(config_name,SSLEAY_CONF);
+#ifndef VMS
+               strcat(config_name,"/");
+#endif
+               strcat(config_name,OPENSSL_CONF);
                p=config_name;
                }
 
@@ -189,7 +184,7 @@ char *Argv[];
                goto end;
                }
 
-       /* ok, lets enter the old 'SSLeay>' mode */
+       /* ok, lets enter the old 'OpenSSL>' mode */
        
        for (;;)
                {
@@ -202,7 +197,7 @@ char *Argv[];
                        p[0]='\0';
                        if (i++)
                                prompt=">";
-                       else    prompt="SSLeay>";
+                       else    prompt="OpenSSL> ";
                        fputs(prompt,stdout);
                        fflush(stdout);
                        fgets(p,n,stdin);
@@ -224,6 +219,7 @@ char *Argv[];
                        }
                if (ret != 0)
                        BIO_printf(bio_err,"error in %s\n",argv[0]);
+               BIO_flush(bio_err);
                }
        BIO_printf(bio_err,"bad exit\n");
        ret=1;
@@ -238,6 +234,7 @@ end:
        ERR_remove_state(0);
 
        EVP_cleanup();
+       ERR_free_strings();
 
        CRYPTO_mem_leaks(bio_err);
        if (bio_err != NULL)
@@ -248,10 +245,11 @@ end:
        EXIT(ret);
        }
 
-static int do_cmd(prog,argc,argv)
-LHASH *prog;
-int argc;
-char *argv[];
+#define LIST_STANDARD_COMMANDS "list-standard-commands"
+#define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-commands"
+#define LIST_CIPHER_COMMANDS "list-cipher-commands"
+
+static int do_cmd(LHASH *prog, int argc, char *argv[])
        {
        FUNCTION f,*fp;
        int i,ret=1,tp,nl;
@@ -272,12 +270,34 @@ char *argv[];
                ret= -1;
                goto end;
                }
+       else if ((strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0) ||
+               (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0) ||
+               (strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0))
+               {
+               int list_type;
+               BIO *bio_stdout;
+
+               if (strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0)
+                       list_type = FUNC_TYPE_GENERAL;
+               else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0)
+                       list_type = FUNC_TYPE_MD;
+               else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
+                       list_type = FUNC_TYPE_CIPHER;
+               bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
+               
+               for (fp=functions; fp->name != NULL; fp++)
+                       if (fp->type == list_type)
+                               BIO_printf(bio_stdout, "%s\n", fp->name);
+               BIO_free(bio_stdout);
+               ret=0;
+               goto end;
+               }
        else
                {
-               BIO_printf(bio_err,"'%s' is a bad command, valid commands are",
+               BIO_printf(bio_err,"openssl:Error: '%s' is an invalid command.\n",
                        argv[0]);
+               BIO_printf(bio_err, "\nStandard commands");
                i=0;
-               fp=functions;
                tp=0;
                for (fp=functions; fp->name != NULL; fp++)
                        {
@@ -295,27 +315,43 @@ char *argv[];
                                        {
                                        i=1;
                                        BIO_printf(bio_err,
-                                               "Message Digest commands - see the dgst command for more details\n");
+                                               "\nMessage Digest commands (see the `dgst' command for more details)\n");
                                        }
                                else if (tp == FUNC_TYPE_CIPHER)
                                        {
                                        i=1;
-                                       BIO_printf(bio_err,"Cipher commands - see the enc command for more details\n");
+                                       BIO_printf(bio_err,"\nCipher commands (see the `enc' command for more details)\n");
                                        }
                                }
                        BIO_printf(bio_err,"%-15s",fp->name);
                        }
-               BIO_printf(bio_err,"\nquit\n");
+               BIO_printf(bio_err,"\n\n");
                ret=0;
                }
 end:
        return(ret);
        }
 
-static LHASH *prog_init()
+static int SortFnByName(const void *_f1,const void *_f2)
+    {
+    const FUNCTION *f1=_f1;
+    const FUNCTION *f2=_f2;
+
+    if(f1->type != f2->type)
+       return f1->type-f2->type;
+    return strcmp(f1->name,f2->name);
+    }
+
+static LHASH *prog_init(void)
        {
        LHASH *ret;
        FUNCTION *f;
+       int i;
+
+       /* Purely so it looks nice when the user hits ? */
+       for(i=0,f=functions ; f->name != NULL ; ++f,++i)
+           ;
+       qsort(functions,i,sizeof *functions,SortFnByName);
 
        if ((ret=lh_new(hash,cmp)) == NULL) return(NULL);
 
@@ -324,14 +360,12 @@ static LHASH *prog_init()
        return(ret);
        }
 
-static int MS_CALLBACK cmp(a,b)
-FUNCTION *a,*b;
+static int MS_CALLBACK cmp(FUNCTION *a, FUNCTION *b)
        {
        return(strncmp(a->name,b->name,8));
        }
 
-static unsigned long MS_CALLBACK hash(a)
-FUNCTION *a;
+static unsigned long MS_CALLBACK hash(FUNCTION *a)
        {
        return(lh_strhash(a->name));
        }