Make it possible for methods to load from something other than a BIO,
by providing a function pointer that is given a name instead of a BIO.
For example, this could be used to load configuration data from an
LDAP server.
diff --git a/crypto/conf/conf.h b/crypto/conf/conf.h
index 3fded16..9f03939 100644
--- a/crypto/conf/conf.h
+++ b/crypto/conf/conf.h
@@ -90,7 +90,8 @@
 	int (MS_FAR *init)(CONF *conf);
 	int (MS_FAR *destroy)(CONF *conf);
 	int (MS_FAR *destroy_data)(CONF *conf);
-	int (MS_FAR *load)(CONF *conf, BIO *bp, long *eline);
+	int (MS_FAR *load)(CONF *conf, const char *name, long *eline);
+	int (MS_FAR *load_bio)(CONF *conf, BIO *bp, long *eline);
 	int (MS_FAR *dump)(CONF *conf, BIO *bp);
 	int (MS_FAR *is_number)(CONF *conf, char c);
 	int (MS_FAR *to_int)(CONF *conf, char c);
@@ -166,7 +167,9 @@
 #define CONF_F_NCONF_GET_NUMBER_E			 112
 #define CONF_F_NCONF_GET_SECTION			 108
 #define CONF_F_NCONF_GET_STRING				 109
+#define CONF_F_NCONF_LOAD				 113
 #define CONF_F_NCONF_LOAD_BIO				 110
+#define CONF_F_NCONF_LOAD_FP				 114
 #define CONF_F_NCONF_NEW				 111
 #define CONF_F_STR_COPY					 101
 
diff --git a/crypto/conf/conf_def.c b/crypto/conf/conf_def.c
index 773df32..7cf1431 100644
--- a/crypto/conf/conf_def.c
+++ b/crypto/conf/conf_def.c
@@ -81,7 +81,8 @@
 static int def_init_WIN32(CONF *conf);
 static int def_destroy(CONF *conf);
 static int def_destroy_data(CONF *conf);
-static int def_load(CONF *conf, BIO *bp, long *eline);
+static int def_load(CONF *conf, const char *name, long *eline);
+static int def_load_bio(CONF *conf, BIO *bp, long *eline);
 static int def_dump(CONF *conf, BIO *bp);
 static int def_is_number(CONF *conf, char c);
 static int def_to_int(CONF *conf, char c);
@@ -95,6 +96,7 @@
 	def_destroy,
 	def_destroy_data,
 	def_load,
+	def_load_bio,
 	def_dump,
 	def_is_number,
 	def_to_int
@@ -107,6 +109,7 @@
 	def_destroy,
 	def_destroy_data,
 	def_load,
+	def_load_bio,
 	def_dump,
 	def_is_number,
 	def_to_int
@@ -177,7 +180,29 @@
 	return 1;
 	}
 
-static int def_load(CONF *conf, BIO *in, long *line)
+static int def_load(CONF *conf, const char *name, long *line)
+	{
+	int ret;
+	BIO *in=NULL;
+
+#ifdef VMS
+	in=BIO_new_file(name, "r");
+#else
+	in=BIO_new_file(name, "rb");
+#endif
+	if (in == NULL)
+		{
+		CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB);
+		return 0;
+		}
+
+	ret = def_load_bio(conf, in, line);
+	BIO_free(in);
+
+	return ret;
+	}
+
+static int def_load_bio(CONF *conf, BIO *in, long *line)
 	{
 #define BUFSIZE	512
 	char btmp[16];
diff --git a/crypto/conf/conf_lib.c b/crypto/conf/conf_lib.c
index a1d31cf..2005c87 100644
--- a/crypto/conf/conf_lib.c
+++ b/crypto/conf/conf_lib.c
@@ -252,24 +252,13 @@
 
 int NCONF_load(CONF *conf, const char *file, long *eline)
 	{
-	int ret;
-	BIO *in=NULL;
-
-#ifdef VMS
-	in=BIO_new_file(file, "r");
-#else
-	in=BIO_new_file(file, "rb");
-#endif
-	if (in == NULL)
+	if (conf == NULL)
 		{
-		CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB);
+		CONFerr(CONF_F_NCONF_LOAD,CONF_R_NO_CONF);
 		return 0;
 		}
 
-	ret = NCONF_load_bio(conf, in, eline);
-	BIO_free(in);
-
-	return ret;
+	return conf->meth->load(conf, file, eline);
 	}
 
 #ifndef NO_FP_API
@@ -279,7 +268,7 @@
 	int ret;
 	if(!(btmp = BIO_new_fp(fp, BIO_NOCLOSE)))
 		{
-		CONFerr(CONF_F_CONF_LOAD_FP,ERR_R_BUF_LIB);
+		CONFerr(CONF_F_NCONF_LOAD_FP,ERR_R_BUF_LIB);
 		return 0;
 		}
 	ret = NCONF_load_bio(conf, btmp, eline);
@@ -296,7 +285,7 @@
 		return 0;
 		}
 
-	return conf->meth->load(conf, bp, eline);
+	return conf->meth->load_bio(conf, bp, eline);
 	}
 
 STACK_OF(CONF_VALUE) *NCONF_get_section(CONF *conf,char *section)