📄 conf_def.c
字号:
p++; *p='\0'; if (!(v=(CONF_VALUE *)OPENSSL_malloc(sizeof(CONF_VALUE)))) { CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE); goto err; } if (psection == NULL) psection=section; v->name=(char *)OPENSSL_malloc(strlen(pname)+1); v->value=NULL; if (v->name == NULL) { CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE); goto err; } BUF_strlcpy(v->name,pname,strlen(pname)+1); if (!str_copy(conf,psection,&(v->value),start)) goto err; if (strcmp(psection,section) != 0) { if ((tv=_CONF_get_section(conf,psection)) == NULL) tv=_CONF_new_section(conf,psection); if (tv == NULL) { CONFerr(CONF_F_DEF_LOAD_BIO, CONF_R_UNABLE_TO_CREATE_NEW_SECTION); goto err; } ts=(STACK_OF(CONF_VALUE) *)tv->value; } else { tv=sv; ts=section_sk; }#if 1 if (_CONF_add_string(conf, tv, v) == 0) { CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE); goto err; }#else v->section=tv->section; if (!sk_CONF_VALUE_push(ts,v)) { CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE); goto err; } vv=(CONF_VALUE *)lh_insert(conf->data,v); if (vv != NULL) { sk_CONF_VALUE_delete_ptr(ts,vv); OPENSSL_free(vv->name); OPENSSL_free(vv->value); OPENSSL_free(vv); }#endif v=NULL; } } if (buff != NULL) BUF_MEM_free(buff); if (section != NULL) OPENSSL_free(section); return(1);err: if (buff != NULL) BUF_MEM_free(buff); if (section != NULL) OPENSSL_free(section); if (line != NULL) *line=eline; BIO_snprintf(btmp,sizeof btmp,"%ld",eline); ERR_add_error_data(2,"line ",btmp); if ((h != conf->data) && (conf->data != NULL)) { CONF_free(conf->data); conf->data=NULL; } if (v != NULL) { if (v->name != NULL) OPENSSL_free(v->name); if (v->value != NULL) OPENSSL_free(v->value); if (v != NULL) OPENSSL_free(v); } return(0); }static void clear_comments(CONF *conf, char *p) { char *to; to=p; for (;;) { if (IS_FCOMMENT(conf,*p)) { *p='\0'; return; } if (!IS_WS(conf,*p)) { break; } p++; } for (;;) { if (IS_COMMENT(conf,*p)) { *p='\0'; return; } if (IS_DQUOTE(conf,*p)) { p=scan_dquote(conf, p); continue; } if (IS_QUOTE(conf,*p)) { p=scan_quote(conf, p); continue; } if (IS_ESC(conf,*p)) { p=scan_esc(conf,p); continue; } if (IS_EOF(conf,*p)) return; else p++; } }static int str_copy(CONF *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; BUF_MEM *buf; if ((buf=BUF_MEM_new()) == NULL) return(0); len=strlen(from)+1; if (!BUF_MEM_grow(buf,len)) goto err; for (;;) { if (IS_QUOTE(conf,*from)) { q= *from; from++; while (!IS_EOF(conf,*from) && (*from != q)) { if (IS_ESC(conf,*from)) { from++; if (IS_EOF(conf,*from)) break; } buf->data[to++]= *(from++); } if (*from == q) from++; } else if (IS_DQUOTE(conf,*from)) { q= *from; from++; while (!IS_EOF(conf,*from)) { if (*from == q) { if (*(from+1) == q) { from++; } else { break; } } buf->data[to++]= *(from++); } if (*from == q) from++; } else if (IS_ESC(conf,*from)) { from++; v= *(from++); if (IS_EOF(conf,v)) break; else if (v == 'r') v='\r'; else if (v == 'n') v='\n'; else if (v == 'b') v='\b'; else if (v == 't') v='\t'; buf->data[to++]= v; } else if (IS_EOF(conf,*from)) break; else if (*from == '$') { /* try to expand it */ rrp=NULL; s= &(from[1]); if (*s == '{') q='}'; else if (*s == '(') q=')'; else q=0; if (q) s++; cp=section; e=np=s; while (IS_ALPHA_NUMERIC(conf,*e)) e++; if ((e[0] == ':') && (e[1] == ':')) { cp=np; rrp=e; rr= *e; *rrp='\0'; e+=2; np=e; while (IS_ALPHA_NUMERIC(conf,*e)) e++; } r= *e; *e='\0'; rp=e; if (q) { if (r != q) { CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE); goto err; } e++; } /* So at this point we have * np which is the start of the name string which is * '\0' terminated. * cp which is the start of the section string which is * '\0' terminated. * e is the 'next point after'. * r and rr are the chars replaced by the '\0' * rp and rrp is where 'r' and 'rr' came from. */ p=_CONF_get_string(conf,cp,np); if (rrp != NULL) *rrp=rr; *rp=r; if (p == NULL) { CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE); goto err; } BUF_MEM_grow_clean(buf,(strlen(p)+buf->length-(e-from))); while (*p) buf->data[to++]= *(p++); /* Since we change the pointer 'from', we also have to change the perceived length of the string it points at. /RL */ len -= e-from; from=e; /* In case there were no braces or parenthesis around the variable reference, we have to put back the character that was replaced with a '\0'. /RL */ *rp = r; } else buf->data[to++]= *(from++); } buf->data[to]='\0'; if (*pto != NULL) OPENSSL_free(*pto); *pto=buf->data; OPENSSL_free(buf); return(1);err: if (buf != NULL) BUF_MEM_free(buf); return(0); }static char *eat_ws(CONF *conf, char *p) { while (IS_WS(conf,*p) && (!IS_EOF(conf,*p))) p++; return(p); }static char *eat_alpha_numeric(CONF *conf, char *p) { for (;;) { if (IS_ESC(conf,*p)) { p=scan_esc(conf,p); continue; } if (!IS_ALPHA_NUMERIC_PUNCT(conf,*p)) return(p); p++; } }static char *scan_quote(CONF *conf, char *p) { int q= *p; p++; while (!(IS_EOF(conf,*p)) && (*p != q)) { if (IS_ESC(conf,*p)) { p++; if (IS_EOF(conf,*p)) return(p); } p++; } if (*p == q) p++; return(p); }static char *scan_dquote(CONF *conf, char *p) { int q= *p; p++; while (!(IS_EOF(conf,*p))) { if (*p == q) { if (*(p+1) == q) { p++; } else { break; } } p++; } if (*p == q) p++; return(p); }static void dump_value(CONF_VALUE *a, BIO *out) { if (a->name) BIO_printf(out, "[%s] %s=%s\n", a->section, a->name, a->value); else BIO_printf(out, "[[%s]]\n", a->section); }static IMPLEMENT_LHASH_DOALL_ARG_FN(dump_value, CONF_VALUE *, BIO *)static int def_dump(const CONF *conf, BIO *out) { lh_doall_arg(conf->data, LHASH_DOALL_ARG_FN(dump_value), out); return 1; }static int def_is_number(const CONF *conf, char c) { return IS_NUMBER(conf,c); }static int def_to_int(const CONF *conf, char c) { return c - '0'; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -