X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fconf%2Fconf.c;h=3031fa3b44902f6089788a07260f9a307e889085;hp=e8085348e2cb47760a871996f5e1e4a701741d1b;hb=9d1a01be8f84143618fc862e1222eb714949fdc1;hpb=b4cadc6e1343c01b06613053a90ed2ee85e65090 diff --git a/crypto/conf/conf.c b/crypto/conf/conf.c index e8085348e2..3031fa3b44 100644 --- a/crypto/conf/conf.c +++ b/crypto/conf/conf.c @@ -59,19 +59,18 @@ #include #include #include "cryptlib.h" -#include "stack.h" -#include "lhash.h" -#include "conf.h" -#include "buffer.h" -#include "err.h" +#include +#include +#include +#include +#include #include "conf_lcl.h" -#ifndef NOPROTO static void value_free_hash(CONF_VALUE *a, LHASH *conf); static void value_free_stack(CONF_VALUE *a,LHASH *conf); static unsigned long hash(CONF_VALUE *v); -static int cmp(CONF_VALUE *a,CONF_VALUE *b); +static int cmp_conf(CONF_VALUE *a,CONF_VALUE *b); static char *eat_ws(char *p); static char *eat_alpha_numeric(char *p); static void clear_comments(char *p); @@ -79,31 +78,50 @@ static int str_copy(LHASH *conf,char *section,char **to, char *from); static char *scan_quote(char *p); static CONF_VALUE *new_section(LHASH *conf,char *section); static CONF_VALUE *get_section(LHASH *conf,char *section); +#define scan_esc(p) ((((p)[1] == '\0')?(p++):(p+=2)),p) + +const char *CONF_version="CONF" OPENSSL_VERSION_PTEXT; + + +LHASH *CONF_load(LHASH *h, const char *file, long *line) + { + LHASH *ltmp; + BIO *in=NULL; + +#ifdef VMS + in=BIO_new_file(file, "r"); #else -static void value_free_hash(); -static void value_free_stack(); -static unsigned long hash(); -static int cmp(); -static char *eat_ws(); -static char *eat_alpha_numeric(); -static void clear_comments(); -static int str_copy(); -static char *scan_quote(); -static CONF_VALUE *new_section(); -static CONF_VALUE *get_section(); + in=BIO_new_file(file, "rb"); #endif + if (in == NULL) + { + CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB); + return NULL; + } -#define scan_esc(p) ((((p)[1] == '\0')?(p++):(p+=2)),p) - -char *CONF_version="CONF" OPENSSL_VERSION_PTEXT; + ltmp = CONF_load_bio(h, in, line); + BIO_free(in); + + return ltmp; +} +#ifndef NO_FP_API +LHASH *CONF_load_fp(LHASH *h, FILE *in, long *line) +{ + BIO *btmp; + LHASH *ltmp; + if(!(btmp = BIO_new_fp(in, BIO_NOCLOSE))) { + CONFerr(CONF_F_CONF_LOAD_FP,ERR_R_BUF_LIB); + return NULL; + } + ltmp = CONF_load_bio(h, btmp, line); + BIO_free(btmp); + return ltmp; +} +#endif -LHASH *CONF_load(h,file,line) -LHASH *h; -char *file; -long *line; +LHASH *CONF_load_bio(LHASH *h, BIO *in, long *line) { LHASH *ret=NULL; - FILE *in=NULL; #define BUFSIZE 512 char btmp[16]; int bufnum=0,i,ii; @@ -114,38 +132,28 @@ long *line; CONF_VALUE *v=NULL,*vv,*tv; CONF_VALUE *sv=NULL; char *section=NULL,*buf; - STACK *section_sk=NULL,*ts; + STACK_OF(CONF_VALUE) *section_sk=NULL,*ts; char *start,*psection,*pname; if ((buff=BUF_MEM_new()) == NULL) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_BUF_LIB); - goto err; - } - - in=fopen(file,"rb"); - if (in == NULL) - { - SYSerr(SYS_F_FOPEN,get_last_sys_error()); - ERR_set_error_data(BUF_strdup(file), - ERR_TXT_MALLOCED|ERR_TXT_STRING); - CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB); + CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_BUF_LIB); goto err; } section=(char *)Malloc(10); if (section == NULL) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE); + CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_MALLOC_FAILURE); goto err; } strcpy(section,"default"); if (h == NULL) { - if ((ret=lh_new(hash,cmp)) == NULL) + if ((ret=lh_new(hash,cmp_conf)) == NULL) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE); + CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_MALLOC_FAILURE); goto err; } } @@ -155,10 +163,11 @@ long *line; sv=new_section(ret,section); if (sv == NULL) { - CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION); + CONFerr(CONF_F_CONF_LOAD_BIO, + CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } - section_sk=(STACK *)sv->value; + section_sk=(STACK_OF(CONF_VALUE) *)sv->value; bufnum=0; for (;;) @@ -166,12 +175,12 @@ long *line; again=0; if (!BUF_MEM_grow(buff,bufnum+BUFSIZE)) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_BUF_LIB); + CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_BUF_LIB); goto err; } p= &(buff->data[bufnum]); *p='\0'; - fgets(p,BUFSIZE-1,in); + BIO_gets(in, p, BUFSIZE-1); p[BUFSIZE-1]='\0'; ii=i=strlen(p); if (i == 0) break; @@ -236,7 +245,8 @@ again: ss=p; goto again; } - CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_CLOSE_SQUARE_BRACKET); + CONFerr(CONF_F_CONF_LOAD_BIO, + CONF_R_MISSING_CLOSE_SQUARE_BRACKET); goto err; } *end='\0'; @@ -245,10 +255,11 @@ again: sv=new_section(ret,section); if (sv == NULL) { - CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION); + CONFerr(CONF_F_CONF_LOAD_BIO, + CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } - section_sk=(STACK *)sv->value; + section_sk=(STACK_OF(CONF_VALUE) *)sv->value; continue; } else @@ -267,7 +278,8 @@ again: p=eat_ws(end); if (*p != '=') { - CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_EQUAL_SIGN); + CONFerr(CONF_F_CONF_LOAD_BIO, + CONF_R_MISSING_EQUAL_SIGN); goto err; } *end='\0'; @@ -281,9 +293,10 @@ again: p++; *p='\0'; - if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL) + if (!(v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE)))) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE); + CONFerr(CONF_F_CONF_LOAD_BIO, + ERR_R_MALLOC_FAILURE); goto err; } if (psection == NULL) psection=section; @@ -291,7 +304,8 @@ again: v->value=NULL; if (v->name == NULL) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE); + CONFerr(CONF_F_CONF_LOAD_BIO, + ERR_R_MALLOC_FAILURE); goto err; } strcpy(v->name,pname); @@ -304,10 +318,11 @@ again: tv=new_section(ret,psection); if (tv == NULL) { - CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION); + CONFerr(CONF_F_CONF_LOAD_BIO, + CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } - ts=(STACK *)tv->value; + ts=(STACK_OF(CONF_VALUE) *)tv->value; } else { @@ -315,15 +330,16 @@ again: ts=section_sk; } v->section=tv->section; - if (!sk_push(ts,(char *)v)) + if (!sk_CONF_VALUE_push(ts,v)) { - CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE); + CONFerr(CONF_F_CONF_LOAD_BIO, + ERR_R_MALLOC_FAILURE); goto err; } - vv=(CONF_VALUE *)lh_insert(ret,(char *)v); + vv=(CONF_VALUE *)lh_insert(ret,v); if (vv != NULL) { - sk_delete_ptr(ts,(char *)vv); + sk_CONF_VALUE_delete_ptr(ts,vv); Free(vv->name); Free(vv->value); Free(vv); @@ -333,7 +349,6 @@ again: } if (buff != NULL) BUF_MEM_free(buff); if (section != NULL) Free(section); - if (in != NULL) fclose(in); return(ret); err: if (buff != NULL) BUF_MEM_free(buff); @@ -341,7 +356,6 @@ err: if (line != NULL) *line=eline; sprintf(btmp,"%ld",eline); ERR_add_error_data(2,"line ",btmp); - if (in != NULL) fclose(in); if ((h != ret) && (ret != NULL)) CONF_free(ret); if (v != NULL) { @@ -351,11 +365,8 @@ err: } return(NULL); } - -char *CONF_get_string(conf,section,name) -LHASH *conf; -char *section; -char *name; + +char *CONF_get_string(LHASH *conf, char *section, char *name) { CONF_VALUE *v,vv; char *p; @@ -367,7 +378,7 @@ char *name; { vv.name=name; vv.section=section; - v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv); + v=(CONF_VALUE *)lh_retrieve(conf,&vv); if (v != NULL) return(v->value); if (strcmp(section,"ENV") == 0) { @@ -377,7 +388,7 @@ char *name; } vv.section="default"; vv.name=name; - v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv); + v=(CONF_VALUE *)lh_retrieve(conf,&vv); if (v != NULL) return(v->value); else @@ -387,36 +398,29 @@ char *name; return(Getenv(name)); } -static CONF_VALUE *get_section(conf,section) -LHASH *conf; -char *section; +static CONF_VALUE *get_section(LHASH *conf, char *section) { CONF_VALUE *v,vv; if ((conf == NULL) || (section == NULL)) return(NULL); vv.name=NULL; vv.section=section; - v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv); + v=(CONF_VALUE *)lh_retrieve(conf,&vv); return(v); } -STACK *CONF_get_section(conf,section) -LHASH *conf; -char *section; +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf, char *section) { CONF_VALUE *v; v=get_section(conf,section); if (v != NULL) - return((STACK *)v->value); + return((STACK_OF(CONF_VALUE) *)v->value); else return(NULL); } -long CONF_get_number(conf,section,name) -LHASH *conf; -char *section; -char *name; +long CONF_get_number(LHASH *conf, char *section, char *name) { char *str; long ret=0; @@ -433,35 +437,30 @@ char *name; } } -void CONF_free(conf) -LHASH *conf; +void CONF_free(LHASH *conf) { if (conf == NULL) return; conf->down_load=0; /* evil thing to make sure the 'Free()' * works as expected */ - lh_doall_arg(conf,(void (*)())value_free_hash,(char *)conf); + lh_doall_arg(conf,(void (*)())value_free_hash,conf); /* We now have only 'section' entries in the hash table. * Due to problems with */ - lh_doall_arg(conf,(void (*)())value_free_stack,(char *)conf); + lh_doall_arg(conf,(void (*)())value_free_stack,conf); lh_free(conf); } -static void value_free_hash(a,conf) -CONF_VALUE *a; -LHASH *conf; +static void value_free_hash(CONF_VALUE *a, LHASH *conf) { if (a->name != NULL) { - a=(CONF_VALUE *)lh_delete(conf,(char *)a); + a=(CONF_VALUE *)lh_delete(conf,a); } } -static void value_free_stack(a,conf) -CONF_VALUE *a; -LHASH *conf; +static void value_free_stack(CONF_VALUE *a, LHASH *conf) { CONF_VALUE *vv; STACK *sk; @@ -482,8 +481,7 @@ LHASH *conf; Free(a); } -static void clear_comments(p) -char *p; +static void clear_comments(char *p) { char *to; @@ -512,10 +510,7 @@ char *p; } } -static int str_copy(conf,section,pto,from) -LHASH *conf; -char *section; -char **pto,*from; +static int str_copy(LHASH *conf, char *section, char **pto, char *from) { int q,r,rr=0,to=0,len=0; char *s,*e,*rp,*p,*rrp,*np,*cp,v; @@ -629,16 +624,14 @@ err: return(0); } -static char *eat_ws(p) -char *p; +static char *eat_ws(char *p) { while (IS_WS(*p) && (!IS_EOF(*p))) p++; return(p); } -static char *eat_alpha_numeric(p) -char *p; +static char *eat_alpha_numeric(char *p) { for (;;) { @@ -653,14 +646,12 @@ char *p; } } -static unsigned long hash(v) -CONF_VALUE *v; +static unsigned long hash(CONF_VALUE *v) { return((lh_strhash(v->section)<<2)^lh_strhash(v->name)); } -static int cmp(a,b) -CONF_VALUE *a,*b; +static int cmp_conf(CONF_VALUE *a, CONF_VALUE *b) { int i; @@ -681,8 +672,7 @@ CONF_VALUE *a,*b; return((a->name == NULL)?-1:1); } -static char *scan_quote(p) -char *p; +static char *scan_quote(char *p) { int q= *p; @@ -700,9 +690,7 @@ char *p; return(p); } -static CONF_VALUE *new_section(conf,section) -LHASH *conf; -char *section; +static CONF_VALUE *new_section(LHASH *conf, char *section) { STACK *sk=NULL; int ok=0,i; @@ -720,7 +708,7 @@ char *section; v->name=NULL; v->value=(char *)sk; - vv=(CONF_VALUE *)lh_insert(conf,(char *)v); + vv=(CONF_VALUE *)lh_insert(conf,v); if (vv != NULL) { #if !defined(NO_STDIO) && !defined(WIN16) @@ -738,3 +726,5 @@ err: } return(v); } + +IMPLEMENT_STACK_OF(CONF_VALUE)