typedef struct {
char *section;
char *name;
char *value;
} CONF_VALUE;
Openssl采用哈希表来存放这些信息,后面会看到,LHASH 作为函数的参数。
实例:
#include "/usr/include/openssl/opensslconf.h"
#include <openssl/conf.h>
int main()
{
CONF *conf;
long eline,result;
int ret;
char *p;
BIO *bp;
conf=NCONF_new(NULL);
#if 0
bp=BIO_new_file("openssl.cnf","r");
NCONF_load_bio(conf,bp,&eline);
#else
ret=NCONF_load(conf,"openssl.cnf",&eline);
if(ret!=1)
{
printf("err!\n");
return -1;
}
#endif
p=NCONF_get_string(conf,NULL,"certs");
if(p==NULL)
printf("no global certs info\n");
p=NCONF_get_string(conf,"CA_default","certs");
printf("%s\n",p);
p=NCONF_get_string(conf,"CA_default","default_days");
printf("%s\n",p);
ret=NCONF_get_number_e(conf,"CA_default","default_days",&result);
printf("%ld\n",result);
ret=NCONF_get_number(conf,"CA_default","default_days",&result);
printf("%ld\n",result);
NCONF_free(conf);
//read a section-------------------------------------------------
long errline;
LHASH_OF(CONF_VALUE) *parms = CONF_load(NULL, "openssl.cnf", &errline);
STACK_OF(CONF_VALUE) *sk = NULL;
sk = CONF_get_section(parms, "policy_match");
//if (sk_CONF_VALUE_num(sk) == 0) {
CONF_VALUE *cv = NULL;
for (int i = 0;; i++) {
//sk 开头函数 由conf.h中的宏 DEFINE_STACK_OF(CONF_VALUE) 展开声明与定义
if (sk_CONF_VALUE_num(sk) <= i) //section's attrbutes total num.
break;
cv = sk_CONF_VALUE_value(sk, i);
printf("name: %s\n", cv->name);
printf("value: %s\n", cv->value);
printf("\n");
}
CONF_free(parms);
//bio---------------------------
CONF *conf1;
BIO *bp1;
STACK_OF(CONF_VALUE) *v;
CONF_VALUE *one;
int i,num;
long eline1;
conf1=NCONF_new(NULL);
bp1=BIO_new_file("openssl.cnf","r");
if(bp==NULL)
{
printf("err!\n");
return -1;
}
NCONF_load_bio(conf1,bp1,&eline1);
v=NCONF_get_section(conf1,"policy_match");
num=sk_CONF_VALUE_num(v);
printf("section CA_default :\n");
for(i=0;i<num;i++)
{
one=sk_CONF_VALUE_value(v,i);
printf("%s = %s\n",one->name,one->value);
}
BIO_free(bp1);
NCONF_free(conf1);
printf("\n");
return 0;
}