RT3548: Remove unsupported platforms
[openssl.git] / crypto / threads / mttest.c
index 47faef53c4641313efe16038e1f7b3a04ea8a11a..9decb751db02aa950d992e644f85f4474e549c84 100644 (file)
@@ -63,7 +63,7 @@
 #ifdef LINUX
 #include <typedefs.h>
 #endif
-#ifdef WIN32
+#ifdef OPENSSL_SYS_WIN32
 #include <windows.h>
 #endif
 #ifdef SOLARIS
 #ifdef PTHREADS
 #include <pthread.h>
 #endif
+#ifdef OPENSSL_SYS_NETWARE
+#if !defined __int64
+#  define __int64 long long
+#endif   
+#include <nwmpk.h>
+#endif
 #include <openssl/lhash.h>
 #include <openssl/crypto.h>
 #include <openssl/buffer.h>
 #include <openssl/x509.h>
 #include <openssl/ssl.h>
 #include <openssl/err.h>
+#include <openssl/rand.h>
 
-#ifdef NO_FP_API
-#define APPS_WIN16
+#ifdef OPENSSL_NO_FP_API
 #include "../buffer/bss_file.c"
 #endif
 
+#ifdef OPENSSL_SYS_NETWARE
+#define TEST_SERVER_CERT "/openssl/apps/server.pem"
+#define TEST_CLIENT_CERT "/openssl/apps/client.pem"
+#else
 #define TEST_SERVER_CERT "../../apps/server.pem"
 #define TEST_CLIENT_CERT "../../apps/client.pem"
+#endif
 
 #define MAX_THREAD_NUMBER      100
 
@@ -104,10 +115,20 @@ void irix_locking_callback(int mode,int type,char *file,int line);
 void solaris_locking_callback(int mode,int type,char *file,int line);
 void win32_locking_callback(int mode,int type,char *file,int line);
 void pthreads_locking_callback(int mode,int type,char *file,int line);
+void netware_locking_callback(int mode,int type,char *file,int line);
+void beos_locking_callback(int mode,int type,const char *file,int line);
 
 unsigned long irix_thread_id(void );
 unsigned long solaris_thread_id(void );
 unsigned long pthreads_thread_id(void );
+unsigned long netware_thread_id(void );
+unsigned long beos_thread_id(void );
+
+#if defined(OPENSSL_SYS_NETWARE)
+static MPKMutex *lock_cs;
+static MPKSema ThreadSem;
+static long *lock_count;
+#endif
 
 BIO *bio_err=NULL;
 BIO *bio_stdout=NULL;
@@ -123,6 +144,8 @@ int number_of_loops=10;
 int reconnect=0;
 int cache_stats=0;
 
+static const char rnd_seed[] = "string to make the random number generator think it has entropy";
+
 int doit(char *ctx[4]);
 static void print_stats(FILE *fp, SSL_CTX *ctx)
 {
@@ -172,6 +195,8 @@ int main(int argc, char *argv[])
        char *ccert=TEST_CLIENT_CERT;
        SSL_METHOD *ssl_method=SSLv23_method();
 
+       RAND_seed(rnd_seed, sizeof rnd_seed);
+
        if (bio_err == NULL)
                bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
        if (bio_stdout == NULL)
@@ -191,8 +216,6 @@ int main(int argc, char *argv[])
                        cache_stats=1;
                else if (strcmp(*argv,"-ssl3") == 0)
                        ssl_method=SSLv3_method();
-               else if (strcmp(*argv,"-ssl2") == 0)
-                       ssl_method=SSLv2_method();
                else if (strcmp(*argv,"-CApath") == 0)
                        {
                        if (--argc < 1) goto bad;
@@ -243,7 +266,8 @@ bad:
                goto end;
                }
 
-       if (cipher == NULL) cipher=getenv("SSL_CIPHER");
+       if (cipher == NULL && OPENSSL_issetugid() == 0)
+               cipher=getenv("SSL_CIPHER");
 
        SSL_load_error_strings();
        OpenSSL_add_ssl_algorithms();
@@ -261,8 +285,15 @@ bad:
        SSL_CTX_set_session_cache_mode(c_ctx,
                SSL_SESS_CACHE_NO_AUTO_CLEAR|SSL_SESS_CACHE_SERVER);
 
-       SSL_CTX_use_certificate_file(s_ctx,scert,SSL_FILETYPE_PEM);
-       SSL_CTX_use_RSAPrivateKey_file(s_ctx,scert,SSL_FILETYPE_PEM);
+       if (!SSL_CTX_use_certificate_file(s_ctx,scert,SSL_FILETYPE_PEM))
+               {
+               ERR_print_errors(bio_err);
+               }
+       else if (!SSL_CTX_use_RSAPrivateKey_file(s_ctx,scert,SSL_FILETYPE_PEM))
+               {
+               ERR_print_errors(bio_err);
+               goto end;
+               }
 
        if (client_auth)
                {
@@ -376,6 +407,9 @@ int ndoit(SSL_CTX *ssl_ctx[2])
                SSL_free((SSL *)ctx[2]);
                SSL_free((SSL *)ctx[3]);
                }
+#   ifdef OPENSSL_SYS_NETWARE
+        MPKSemaphoreSignal(ThreadSem);
+#   endif
        return(0);
        }
 
@@ -491,6 +525,7 @@ int doit(char *ctx[4])
                                        else
                                                {
                                                fprintf(stderr,"ERROR in CLIENT\n");
+                                               ERR_print_errors_fp(stderr);
                                                return(1);
                                                }
                                        }
@@ -522,6 +557,7 @@ int doit(char *ctx[4])
                                        else
                                                {
                                                fprintf(stderr,"ERROR in CLIENT\n");
+                                               ERR_print_errors_fp(stderr);
                                                return(1);
                                                }
                                        }
@@ -617,6 +653,9 @@ int doit(char *ctx[4])
                        }
 
                if ((done & S_DONE) && (done & C_DONE)) break;
+#   if defined(OPENSSL_SYS_NETWARE)
+        ThreadSwitchWithDelay();
+#   endif
                }
 
        SSL_set_shutdown(c_ssl,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
@@ -677,7 +716,7 @@ int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
 
 #define THREAD_STACK_SIZE (16*1024)
 
-#ifdef WIN32
+#ifdef OPENSSL_SYS_WIN32
 
 static HANDLE *lock_cs;
 
@@ -685,7 +724,7 @@ void thread_setup(void)
        {
        int i;
 
-       lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE));
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
        for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
@@ -702,7 +741,7 @@ void thread_cleanup(void)
        CRYPTO_set_locking_callback(NULL);
        for (i=0; i<CRYPTO_num_locks(); i++)
                CloseHandle(lock_cs[i]);
-       Free(lock_cs);
+       OPENSSL_free(lock_cs);
        }
 
 void win32_locking_callback(int mode, int type, char *file, int line)
@@ -768,7 +807,7 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
        printf("win32 threads done - %.3f seconds\n",ret);
        }
 
-#endif /* WIN32 */
+#endif /* OPENSSL_SYS_WIN32 */
 
 #ifdef SOLARIS
 
@@ -780,8 +819,8 @@ void thread_setup(void)
        {
        int i;
 
-       lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t));
-       lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(mutex_t));
+       lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
        for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_count[i]=0;
@@ -807,8 +846,8 @@ void thread_cleanup(void)
                mutex_destroy(&(lock_cs[i]));
                fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
                }
-       Free(lock_cs);
-       Free(lock_count);
+       OPENSSL_free(lock_cs);
+       OPENSSL_free(lock_count);
 
        fprintf(stderr,"done cleanup\n");
 
@@ -823,7 +862,7 @@ void solaris_locking_callback(int mode, int type, char *file, int line)
                (type&CRYPTO_READ)?"r":"w",file,line);
 #endif
 
-       /*
+       /*-
        if (CRYPTO_LOCK_SSL_CERT == type)
        fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n",
                CRYPTO_thread_id(),
@@ -831,7 +870,8 @@ void solaris_locking_callback(int mode, int type, char *file, int line)
        */
        if (mode & CRYPTO_LOCK)
                {
-       /*      if (mode & CRYPTO_READ)
+       /*-
+               if (mode & CRYPTO_READ)
                        rw_rdlock(&(lock_cs[type]));
                else
                        rw_wrlock(&(lock_cs[type])); */
@@ -905,7 +945,7 @@ void thread_setup(void)
        arena=usinit(filename);
        unlink(filename);
 
-       lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *));
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(usema_t *));
        for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_cs[i]=usnewsema(arena,1);
@@ -928,7 +968,7 @@ void thread_cleanup(void)
                usdumpsema(lock_cs[i],stdout,buf);
                usfreesema(lock_cs[i],arena);
                }
-       Free(lock_cs);
+       OPENSSL_free(lock_cs);
        }
 
 void irix_locking_callback(int mode, int type, char *file, int line)
@@ -988,8 +1028,8 @@ void thread_setup(void)
        {
        int i;
 
-       lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
-       lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
+       lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+       lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
        for (i=0; i<CRYPTO_num_locks(); i++)
                {
                lock_count[i]=0;
@@ -1012,8 +1052,8 @@ void thread_cleanup(void)
                fprintf(stderr,"%8ld:%s\n",lock_count[i],
                        CRYPTO_get_lock_name(i));
                }
-       Free(lock_cs);
-       Free(lock_count);
+       OPENSSL_free(lock_cs);
+       OPENSSL_free(lock_count);
 
        fprintf(stderr,"done cleanup\n");
        }
@@ -1027,7 +1067,7 @@ void pthreads_locking_callback(int mode, int type, char *file,
                (mode&CRYPTO_LOCK)?"l":"u",
                (type&CRYPTO_READ)?"r":"w",file,line);
 #endif
-/*
+/*-
        if (CRYPTO_LOCK_SSL_CERT == type)
                fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n",
                CRYPTO_thread_id(),
@@ -1084,3 +1124,88 @@ unsigned long pthreads_thread_id(void)
 
 
 
+#ifdef OPENSSL_SYS_NETWARE
+
+void thread_setup(void)
+{
+   int i;
+
+   lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(MPKMutex));
+   lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
+   for (i=0; i<CRYPTO_num_locks(); i++)
+   {
+      lock_count[i]=0;
+      lock_cs[i]=MPKMutexAlloc("OpenSSL mutex");
+   }
+
+   ThreadSem = MPKSemaphoreAlloc("OpenSSL mttest semaphore", 0 );
+
+   CRYPTO_set_id_callback((unsigned long (*)())netware_thread_id);
+   CRYPTO_set_locking_callback((void (*)())netware_locking_callback);
+}
+
+void thread_cleanup(void)
+{
+   int i;
+
+   CRYPTO_set_locking_callback(NULL);
+
+   fprintf(stdout,"thread_cleanup\n");
+
+   for (i=0; i<CRYPTO_num_locks(); i++)
+   {
+      MPKMutexFree(lock_cs[i]);
+      fprintf(stdout,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
+   }
+   OPENSSL_free(lock_cs);
+   OPENSSL_free(lock_count);
+
+   MPKSemaphoreFree(ThreadSem);
+
+   fprintf(stdout,"done cleanup\n");
+}
+
+void netware_locking_callback(int mode, int type, char *file, int line)
+{
+   if (mode & CRYPTO_LOCK)
+   {
+      MPKMutexLock(lock_cs[type]);
+      lock_count[type]++;
+   }
+   else
+      MPKMutexUnlock(lock_cs[type]);
+}
+
+void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
+{
+   SSL_CTX *ssl_ctx[2];
+   int i;
+   ssl_ctx[0]=s_ctx;
+   ssl_ctx[1]=c_ctx;
+
+   for (i=0; i<thread_number; i++)
+   {
+      BeginThread( (void(*)(void*))ndoit, NULL, THREAD_STACK_SIZE, 
+                   (void*)ssl_ctx);
+      ThreadSwitchWithDelay();
+   }
+
+   printf("reaping\n");
+
+      /* loop until all threads have signaled the semaphore */
+   for (i=0; i<thread_number; i++)
+   {
+      MPKSemaphoreWait(ThreadSem);
+   }
+   printf("netware threads done (%d,%d)\n",
+         s_ctx->references,c_ctx->references);
+}
+
+unsigned long netware_thread_id(void)
+{
+   unsigned long ret;
+
+   ret=(unsigned long)GetThreadID();
+   return(ret);
+}
+#endif /* NETWARE */