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<