(oops) Apologies all, that last header-cleanup commit was from the wrong
[openssl.git] / crypto / engine / eng_cnf.c
index 8e3f894f66e56cde7002ed722964216c1c136d47..8567f266759eea6722ebabfbb3f54fe4ea34fcaa 100644 (file)
  *
  */
 
-#include <stdio.h>
-#include <openssl/crypto.h>
-#include "cryptlib.h"
+#include "eng_int.h"
 #include <openssl/conf.h>
-#include <openssl/engine.h>
 
 /* #define ENGINE_CONF_DEBUG */
 
@@ -75,10 +72,28 @@ static char *skip_dot(char *name)
        return name;
        }
 
-int int_engine_configure(char *name, char *value, const CONF *cnf)
+static STACK_OF(ENGINE) *initialized_engines = NULL;
+
+static int int_engine_init(ENGINE *e)
+       {
+       if (!ENGINE_init(e))
+               return 0;
+       if (!initialized_engines)
+               initialized_engines = sk_ENGINE_new_null();
+       if (!initialized_engines || !sk_ENGINE_push(initialized_engines, e))
+               {
+               ENGINE_finish(e);
+               return 0;
+               }
+       return 1;
+       }
+       
+
+static int int_engine_configure(char *name, char *value, const CONF *cnf)
        {
        int i;
        int ret = 0;
+       long do_init = -1;
        STACK_OF(CONF_VALUE) *ecmds;
        CONF_VALUE *ecmd;
        char *ctrlname, *ctrlvalue;
@@ -118,6 +133,8 @@ int int_engine_configure(char *name, char *value, const CONF *cnf)
                                goto err;
                        if (!ENGINE_ctrl_cmd_string(e, "SO_PATH", ctrlvalue, 0))
                                goto err;
+                       if (!ENGINE_ctrl_cmd_string(e, "LIST_ADD", "2", 0))
+                               goto err;
                        if (!ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0))
                                goto err;
                        }
@@ -138,20 +155,43 @@ int int_engine_configure(char *name, char *value, const CONF *cnf)
                         */
                        if (!strcmp(ctrlvalue, "EMPTY"))
                                ctrlvalue = NULL;
-                       if (!ENGINE_ctrl_cmd_string(e,
+                       else if (!strcmp(ctrlname, "init"))
+                               {
+                               if (!NCONF_get_number_e(cnf, value, "init", &do_init))
+                                       goto err;
+                               if (do_init == 1)
+                                       {
+                                       if (!int_engine_init(e))
+                                               goto err;
+                                       }
+                               else if (do_init != 0)
+                                       {
+                                       ENGINEerr(ENGINE_F_INT_ENGINE_CONFIGURE, ENGINE_R_INVALID_INIT_VALUE);
+                                       goto err;
+                                       }
+                               }
+                       else if (!strcmp(ctrlname, "default_algorithms"))
+                               {
+                               if (!ENGINE_set_default_string(e, ctrlvalue))
+                                       goto err;
+                               }
+                       else if (!ENGINE_ctrl_cmd_string(e,
                                        ctrlname, ctrlvalue, 0))
                                return 0;
                        }
 
 
+
                }
+       if (e && (do_init == -1) && !int_engine_init(e))
+               goto err;
        ret = 1;
        err:
        if (e)
                ENGINE_free(e);
        return ret;
        }
-       
+
 
 static int int_engine_module_init(CONF_IMODULE *md, const CONF *cnf)
        {
@@ -181,7 +221,19 @@ static int int_engine_module_init(CONF_IMODULE *md, const CONF *cnf)
        return 1;
        }
 
+static void int_engine_module_finish(CONF_IMODULE *md)
+       {
+       ENGINE *e;
+       while ((e = sk_ENGINE_pop(initialized_engines)))
+               ENGINE_finish(e);
+       sk_ENGINE_free(initialized_engines);
+       initialized_engines = NULL;
+       }
+       
+
 void ENGINE_add_conf_module(void)
        {
-       CONF_module_add("engines", int_engine_module_init, 0);
+       CONF_module_add("engines",
+                       int_engine_module_init,
+                       int_engine_module_finish);
        }