An initial review of the OpenSSL code was done to determine how many 
global variables where present.  The idea was to determine the amount of 
work required to pull the globals into an instance data structure in 
order to build a Library NLM for NetWare.  This file contains the results 
of the review.  Each file is listed along with the globals in the file.  
The initial review was done very quickly so this list is probably
not a comprehensive list.


cryptlib.c
===========================================

static STACK *app_locks=NULL;

static STACK_OF(CRYPTO_dynlock) *dyn_locks=NULL;

static void (MS_FAR *locking_callback)(int mode,int type,
   const char *file,int line)=NULL;
static int (MS_FAR *add_lock_callback)(int *pointer,int amount,
   int type,const char *file,int line)=NULL;
static unsigned long (MS_FAR *id_callback)(void)=NULL;
static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback)
   (const char *file,int line)=NULL;
static void (MS_FAR *dynlock_lock_callback)(int mode,
   struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL;
static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l,
   const char *file,int line)=NULL;


mem.c
===========================================
static int allow_customize = 1;      /* we provide flexible functions for */
static int allow_customize_debug = 1;/* exchanging memory-related functions at

/* may be changed as long as `allow_customize' is set */
static void *(*malloc_locked_func)(size_t)  = malloc;
static void (*free_locked_func)(void *)     = free;
static void *(*malloc_func)(size_t)         = malloc;
static void *(*realloc_func)(void *, size_t)= realloc;
static void (*free_func)(void *)            = free;

/* use default functions from mem_dbg.c */
static void (*malloc_debug_func)(void *,int,const char *,int,int)
   = CRYPTO_dbg_malloc;
static void (*realloc_debug_func)(void *,void *,int,const char *,int,int)
   = CRYPTO_dbg_realloc;
static void (*free_debug_func)(void *,int) = CRYPTO_dbg_free;
static void (*set_debug_options_func)(long) = CRYPTO_dbg_set_options;
static long (*get_debug_options_func)(void) = CRYPTO_dbg_get_options;


mem_dbg.c
===========================================
static int mh_mode=CRYPTO_MEM_CHECK_OFF;
static unsigned long order = 0; /* number of memory requests */
static LHASH *mh=NULL; /* hash-table of memory requests (address as key) */

static LHASH *amih=NULL; /* hash-table with those app_mem_info_st's */
static long options =             /* extra information to be recorded */
static unsigned long disabling_thread = 0;


err.c
===========================================
static LHASH *error_hash=NULL;
static LHASH *thread_hash=NULL;

several files have routines with static "init" to track if error strings
   have been loaded ( may not want seperate error strings for each process )
   The "init" variable can't be left "global" because the error has is a ptr
   that is malloc'ed.  The malloc'ed error has is dependant on the "init"
   vars.

   files:
      pem_err.c
      cpt_err.c
      pk12err.c
      asn1_err.c
      bio_err.c
      bn_err.c
      buf_err.c
      comp_err.c
      conf_err.c
      cpt_err.c
      dh_err.c
      dsa_err.c
      dso_err.c
      evp_err.c
      obj_err.c
      pkcs7err.c
      rand_err.c
      rsa_err.c
      rsar_err.c
      ssl_err.c
      x509_err.c
      v3err.c
		err.c

These file have similar "init" globals but they are for other stuff not
error strings:

		bn_lib.c
		ecc_enc.c
		s23_clnt.c
		s23_meth.c
		s23_srvr.c
		s2_clnt.c
		s2_lib.c
		s2_meth.c
		s2_srvr.c
		s3_clnt.c
		s3_lib.c
		s3_srvr.c
		t1_clnt.c
		t1_meth.c
		t1_srvr.c

rand_lib.c
===========================================
static RAND_METHOD *rand_meth= &rand_ssleay_meth;

md_rand.c
===========================================
static int state_num=0,state_index=0;
static unsigned char state[STATE_SIZE+MD_DIGEST_LENGTH];
static unsigned char md[MD_DIGEST_LENGTH];
static long md_count[2]={0,0};
static double entropy=0;
static int initialized=0;

/* This should be set to 1 only when ssleay_rand_add() is called inside
   an already locked state, so it doesn't try to lock and thereby cause
   a hang.  And it should always be reset back to 0 before unlocking. */
static int add_do_not_lock=0;

obj_dat.c
============================================
static int new_nid=NUM_NID;
static LHASH *added=NULL;

b_sock.c
===========================================
static unsigned long BIO_ghbn_hits=0L;
static unsigned long BIO_ghbn_miss=0L;
static struct ghbn_cache_st
   {
   char name[129];
   struct hostent *ent;
   unsigned long order;
   } ghbn_cache[GHBN_NUM];

static int wsa_init_done=0;


bio_lib.c
===========================================
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *bio_meth=NULL;
static int bio_meth_num=0;


bn_lib.c
========================================
static int bn_limit_bits=0;
static int bn_limit_num=8;        /* (1<<bn_limit_bits) */
static int bn_limit_bits_low=0;
static int bn_limit_num_low=8;    /* (1<<bn_limit_bits_low) */
static int bn_limit_bits_high=0;
static int bn_limit_num_high=8;   /* (1<<bn_limit_bits_high) */
static int bn_limit_bits_mont=0;
static int bn_limit_num_mont=8;   /* (1<<bn_limit_bits_mont) */

conf_lib.c
========================================
static CONF_METHOD *default_CONF_method=NULL;

dh_lib.c
========================================
static DH_METHOD *default_DH_method;
static int dh_meth_num = 0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dh_meth = NULL;

dsa_lib.c
========================================
static DSA_METHOD *default_DSA_method;
static int dsa_meth_num = 0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dsa_meth = NULL;

dso_lib.c
========================================
static DSO_METHOD *default_DSO_meth = NULL;

rsa_lib.c
========================================
static RSA_METHOD *default_RSA_meth=NULL;
static int rsa_meth_num=0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *rsa_meth=NULL;

x509_trs.c
=======================================
static int (*default_trust)(int id, X509 *x, int flags) = obj_trust;
static STACK_OF(X509_TRUST) *trtable = NULL;

x509_req.c
=======================================
static int *ext_nids = ext_nid_list;

o_names.c
======================================
static LHASH *names_lh=NULL;
static STACK_OF(NAME_FUNCS) *name_funcs_stack;
static int free_type;
static int names_type_num=OBJ_NAME_TYPE_NUM;


th-lock.c - NEED to add support for locking for NetWare
==============================================
static long *lock_count;
(other platform specific globals)

x_x509.c
==============================================
static int x509_meth_num = 0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *x509_meth = NULL;


evp_pbe.c
============================================
static STACK *pbe_algs;

evp_key.c
============================================
static char prompt_string[80];

ssl_ciph.c
============================================
static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;

ssl_lib.c
=============================================
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_meth=NULL;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_ctx_meth=NULL;
static int ssl_meth_num=0;
static int ssl_ctx_meth_num=0;

ssl_sess.c
=============================================
static int ssl_session_num=0;
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_session_meth=NULL;

x509_vfy.c
============================================
static STACK_OF(CRYPTO_EX_DATA_FUNCS) *x509_store_ctx_method=NULL;
static int x509_store_ctx_num=0;

