1 /* 2 * Default Initialization Function 3 * (C) 1999-2007 Jack Lloyd 4 * 5 * Distributed under the terms of the Botan license 6 */ 7 8 #include <botan/init.h> 9 #include <botan/parsing.h> 10 #include <botan/libstate.h> 11 #include <botan/global_state.h> 12 13 namespace Botan { 14 15 /* 16 * Library Initialization 17 */ initialize(const std::string & arg_string)18void LibraryInitializer::initialize(const std::string& arg_string) 19 { 20 bool thread_safe = false; 21 22 const std::vector<std::string> arg_list = split_on(arg_string, ' '); 23 for(size_t i = 0; i != arg_list.size(); ++i) 24 { 25 if(arg_list[i].size() == 0) 26 continue; 27 28 std::string name, value; 29 30 if(arg_list[i].find('=') == std::string::npos) 31 { 32 name = arg_list[i]; 33 value = "true"; 34 } 35 else 36 { 37 std::vector<std::string> name_and_value = split_on(arg_list[i], '='); 38 name = name_and_value[0]; 39 value = name_and_value[1]; 40 } 41 42 bool is_on = 43 (value == "1" || value == "true" || value == "yes" || value == "on"); 44 45 if(name == "thread_safe") 46 thread_safe = is_on; 47 } 48 49 try 50 { 51 /* 52 This two stage initialization process is because Library_State's 53 constructor will implicitly refer to global state through the 54 allocators and so forth, so global_state() has to be a valid 55 reference before initialize() can be called. Yeah, gross. 56 */ 57 Global_State_Management::set_global_state(new Library_State); 58 59 global_state().initialize(thread_safe); 60 } 61 catch(...) 62 { 63 deinitialize(); 64 throw; 65 } 66 } 67 68 /* 69 * Library Shutdown 70 */ deinitialize()71void LibraryInitializer::deinitialize() 72 { 73 Global_State_Management::set_global_state(0); 74 } 75 76 } 77