summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/conf
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/conf')
-rw-r--r--src/lib/libcrypto/conf/Makefile.ssl85
-rw-r--r--src/lib/libcrypto/conf/conf.c727
-rw-r--r--src/lib/libcrypto/conf/conf.err12
-rw-r--r--src/lib/libcrypto/conf/conf_lcl.h102
4 files changed, 926 insertions, 0 deletions
diff --git a/src/lib/libcrypto/conf/Makefile.ssl b/src/lib/libcrypto/conf/Makefile.ssl
new file mode 100644
index 0000000000..00e917aa44
--- /dev/null
+++ b/src/lib/libcrypto/conf/Makefile.ssl
@@ -0,0 +1,85 @@
1#
2# SSLeay/crypto/conf/Makefile
3#
4
5DIR= conf
6TOP= ../..
7CC= cc
8INCLUDES= -I.. -I../../include
9CFLAG=-g
10INSTALLTOP=/usr/local/ssl
11MAKE= make -f Makefile.ssl
12MAKEDEPEND= makedepend -f Makefile.ssl
13MAKEFILE= Makefile.ssl
14AR= ar r
15
16CFLAGS= $(INCLUDES) $(CFLAG)
17
18ERR=conf
19ERRC=conf_err
20GENERAL=Makefile
21TEST=
22APPS=
23
24LIB=$(TOP)/libcrypto.a
25LIBSRC= conf.c $(ERRC).c
26
27LIBOBJ= conf.o $(ERRC).o
28
29SRC= $(LIBSRC)
30
31EXHEADER= conf.h
32HEADER= conf_lcl.h $(EXHEADER)
33
34ALL= $(GENERAL) $(SRC) $(HEADER)
35
36top:
37 (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
38
39all: lib
40
41lib: $(LIBOBJ)
42 $(AR) $(LIB) $(LIBOBJ)
43 sh $(TOP)/util/ranlib.sh $(LIB)
44 @touch lib
45
46files:
47 perl $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
48
49links:
50 /bin/rm -f Makefile
51 $(TOP)/util/point.sh Makefile.ssl Makefile ;
52 $(TOP)/util/mklink.sh ../../include $(EXHEADER)
53 $(TOP)/util/mklink.sh ../../test $(TEST)
54 $(TOP)/util/mklink.sh ../../apps $(APPS)
55
56install:
57 @for i in $(EXHEADER) ; \
58 do \
59 (cp $$i $(INSTALLTOP)/include/$$i; \
60 chmod 644 $(INSTALLTOP)/include/$$i ); \
61 done;
62
63tags:
64 ctags $(SRC)
65
66tests:
67
68lint:
69 lint -DLINT $(INCLUDES) $(SRC)>fluff
70
71depend:
72 $(MAKEDEPEND) $(INCLUDES) $(LIBSRC)
73
74dclean:
75 perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
76 mv -f Makefile.new $(MAKEFILE)
77
78clean:
79 /bin/rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
80
81errors:
82 perl $(TOP)/util/err-ins.pl $(ERR).err $(ERR).h
83 perl ../err/err_genc.pl -s $(ERR).h $(ERRC).c
84
85# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/src/lib/libcrypto/conf/conf.c b/src/lib/libcrypto/conf/conf.c
new file mode 100644
index 0000000000..9e84300c5e
--- /dev/null
+++ b/src/lib/libcrypto/conf/conf.c
@@ -0,0 +1,727 @@
1/* crypto/conf/conf.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <errno.h>
61#include "cryptlib.h"
62#include "stack.h"
63#include "lhash.h"
64#include "conf.h"
65#include "buffer.h"
66#include "err.h"
67
68#include "conf_lcl.h"
69
70#ifndef NOPROTO
71static void value_free_hash(CONF_VALUE *a, LHASH *conf);
72static void value_free_stack(CONF_VALUE *a,LHASH *conf);
73static unsigned long hash(CONF_VALUE *v);
74static int cmp(CONF_VALUE *a,CONF_VALUE *b);
75static char *eat_ws(char *p);
76static char *eat_alpha_numeric(char *p);
77static void clear_comments(char *p);
78static int str_copy(LHASH *conf,char *section,char **to, char *from);
79static char *scan_quote(char *p);
80static CONF_VALUE *new_section(LHASH *conf,char *section);
81static CONF_VALUE *get_section(LHASH *conf,char *section);
82#else
83static void value_free_hash();
84static void value_free_stack();
85static unsigned long hash();
86static int cmp();
87static char *eat_ws();
88static char *eat_alpha_numeric();
89static void clear_comments();
90static int str_copy();
91static char *scan_quote();
92static CONF_VALUE *new_section();
93static CONF_VALUE *get_section();
94#endif
95
96#define scan_esc(p) ((*(++p) == '\0')?(p):(++p))
97
98char *CONF_version="CONF part of SSLeay 0.9.0b 29-Jun-1998";
99
100LHASH *CONF_load(h,file,line)
101LHASH *h;
102char *file;
103long *line;
104 {
105 LHASH *ret=NULL;
106 FILE *in=NULL;
107#define BUFSIZE 512
108 int bufnum=0,i,ii;
109 BUF_MEM *buff=NULL;
110 char *s,*p,*end;
111 int again,n,eline=0;
112 CONF_VALUE *v=NULL,*vv,*tv;
113 CONF_VALUE *sv=NULL;
114 char *section=NULL,*buf;
115 STACK *section_sk=NULL,*ts;
116 char *start,*psection,*pname;
117
118 if ((buff=BUF_MEM_new()) == NULL)
119 {
120 CONFerr(CONF_F_CONF_LOAD,ERR_R_BUF_LIB);
121 goto err;
122 }
123
124 in=fopen(file,"rb");
125 if (in == NULL)
126 {
127 SYSerr(SYS_F_FOPEN,get_last_sys_error());
128 ERR_set_error_data(BUF_strdup(file),
129 ERR_TXT_MALLOCED|ERR_TXT_STRING);
130 CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB);
131 goto err;
132 }
133
134 section=(char *)Malloc(10);
135 if (section == NULL)
136 {
137 CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
138 goto err;
139 }
140 strcpy(section,"default");
141
142 if (h == NULL)
143 {
144 if ((ret=lh_new(hash,cmp)) == NULL)
145 {
146 CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
147 goto err;
148 }
149 }
150 else
151 ret=h;
152
153 sv=new_section(ret,section);
154 if (sv == NULL)
155 {
156 CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
157 goto err;
158 }
159 section_sk=(STACK *)sv->value;
160
161 bufnum=0;
162 for (;;)
163 {
164 again=0;
165 if (!BUF_MEM_grow(buff,bufnum+BUFSIZE))
166 {
167 CONFerr(CONF_F_CONF_LOAD,ERR_R_BUF_LIB);
168 goto err;
169 }
170 p= &(buff->data[bufnum]);
171 *p='\0';
172 fgets(p,BUFSIZE-1,in);
173 p[BUFSIZE-1]='\0';
174 ii=i=strlen(p);
175 if (i == 0) break;
176 while (i > 0)
177 {
178 if ((p[i-1] != '\r') && (p[i-1] != '\n'))
179 break;
180 else
181 i--;
182 }
183 /* we removed some trailing stuff so there is a new
184 * line on the end. */
185 if (i == ii)
186 again=1; /* long line */
187 else
188 {
189 p[i]='\0';
190 eline++; /* another input line */
191 }
192
193 /* we now have a line with trailing \r\n removed */
194
195 /* i is the number of bytes */
196 bufnum+=i;
197
198 v=NULL;
199 /* check for line continuation */
200 if (bufnum >= 1)
201 {
202 /* If we have bytes and the last char '\\' and
203 * second last char is not '\\' */
204 p= &(buff->data[bufnum-1]);
205 if ( IS_ESC(p[0]) &&
206 ((bufnum <= 1) || !IS_ESC(p[-1])))
207 {
208 bufnum--;
209 again=1;
210 }
211 }
212 if (again) continue;
213 bufnum=0;
214 buf=buff->data;
215
216 clear_comments(buf);
217 n=strlen(buf);
218 s=eat_ws(buf);
219 if (IS_EOF(*s)) continue; /* blank line */
220 if (*s == '[')
221 {
222 s++;
223 start=eat_ws(s);
224 end=eat_alpha_numeric(start);
225 p=eat_ws(end);
226 if (*p != ']')
227 {
228 CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_CLOSE_SQUARE_BRACKET);
229 goto err;
230 }
231 *end='\0';
232 if (!str_copy(ret,NULL,&section,start)) goto err;
233 if ((sv=get_section(ret,section)) == NULL)
234 sv=new_section(ret,section);
235 if (sv == NULL)
236 {
237 CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
238 goto err;
239 }
240 section_sk=(STACK *)sv->value;
241 continue;
242 }
243 else
244 {
245 pname=s;
246 psection=NULL;
247 end=eat_alpha_numeric(s);
248 if ((end[0] == ':') && (end[1] == ':'))
249 {
250 *end='\0';
251 end+=2;
252 psection=pname;
253 pname=end;
254 end=eat_alpha_numeric(end);
255 }
256 p=eat_ws(end);
257 if (*p != '=')
258 {
259 CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_EQUAL_SIGN);
260 goto err;
261 }
262 *end='\0';
263 p++;
264 start=eat_ws(p);
265 while (!IS_EOF(*p))
266 p++;
267 p--;
268 while ((p != start) && (IS_WS(*p)))
269 p--;
270 p++;
271 *p='\0';
272
273 if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL)
274 {
275 CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
276 goto err;
277 }
278 if (psection == NULL) psection=section;
279 v->name=(char *)Malloc(strlen(pname)+1);
280 v->value=NULL;
281 if (v->name == NULL)
282 {
283 CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
284 goto err;
285 }
286 strcpy(v->name,pname);
287 if (!str_copy(ret,psection,&(v->value),start)) goto err;
288
289 if (strcmp(psection,section) != 0)
290 {
291 if ((tv=get_section(ret,psection))
292 == NULL)
293 tv=new_section(ret,psection);
294 if (tv == NULL)
295 {
296 CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
297 goto err;
298 }
299 ts=(STACK *)tv->value;
300 }
301 else
302 {
303 tv=sv;
304 ts=section_sk;
305 }
306 v->section=tv->section;
307 if (!sk_push(ts,(char *)v))
308 {
309 CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
310 goto err;
311 }
312 vv=(CONF_VALUE *)lh_insert(ret,(char *)v);
313 if (vv != NULL)
314 {
315 sk_delete_ptr(ts,(char *)vv);
316 Free(vv->name);
317 Free(vv->value);
318 Free(vv);
319 }
320 v=NULL;
321 }
322 }
323 if (buff != NULL) BUF_MEM_free(buff);
324 if (section != NULL) Free(section);
325 if (in != NULL) fclose(in);
326 return(ret);
327err:
328 if (buff != NULL) BUF_MEM_free(buff);
329 if (section != NULL) Free(section);
330 if (line != NULL) *line=eline;
331 if (in != NULL) fclose(in);
332 if ((h != ret) && (ret != NULL)) CONF_free(ret);
333 if (v != NULL)
334 {
335 if (v->name != NULL) Free(v->name);
336 if (v->value != NULL) Free(v->value);
337 if (v != NULL) Free(v);
338 }
339 return(NULL);
340 }
341
342char *CONF_get_string(conf,section,name)
343LHASH *conf;
344char *section;
345char *name;
346 {
347 CONF_VALUE *v,vv;
348 char *p;
349
350 if (name == NULL) return(NULL);
351 if (conf != NULL)
352 {
353 if (section != NULL)
354 {
355 vv.name=name;
356 vv.section=section;
357 v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv);
358 if (v != NULL) return(v->value);
359 if (strcmp(section,"ENV") == 0)
360 {
361 p=Getenv(name);
362 if (p != NULL) return(p);
363 }
364 }
365 vv.section="default";
366 vv.name=name;
367 v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv);
368 if (v != NULL)
369 return(v->value);
370 else
371 return(NULL);
372 }
373 else
374 return(Getenv(name));
375 }
376
377static CONF_VALUE *get_section(conf,section)
378LHASH *conf;
379char *section;
380 {
381 CONF_VALUE *v,vv;
382
383 if ((conf == NULL) || (section == NULL)) return(NULL);
384 vv.name=NULL;
385 vv.section=section;
386 v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv);
387 return(v);
388 }
389
390STACK *CONF_get_section(conf,section)
391LHASH *conf;
392char *section;
393 {
394 CONF_VALUE *v;
395
396 v=get_section(conf,section);
397 if (v != NULL)
398 return((STACK *)v->value);
399 else
400 return(NULL);
401 }
402
403long CONF_get_number(conf,section,name)
404LHASH *conf;
405char *section;
406char *name;
407 {
408 char *str;
409 long ret=0;
410
411 str=CONF_get_string(conf,section,name);
412 if (str == NULL) return(0);
413 for (;;)
414 {
415 if (IS_NUMER(*str))
416 ret=ret*10+(*str -'0');
417 else
418 return(ret);
419 str++;
420 }
421 }
422
423void CONF_free(conf)
424LHASH *conf;
425 {
426 if (conf == NULL) return;
427
428 conf->down_load=0; /* evil thing to make sure the 'Free()'
429 * works as expected */
430 lh_doall_arg(conf,(void (*)())value_free_hash,(char *)conf);
431
432 /* We now have only 'section' entries in the hash table.
433 * Due to problems with */
434
435 lh_doall_arg(conf,(void (*)())value_free_stack,(char *)conf);
436 lh_free(conf);
437 }
438
439static void value_free_hash(a,conf)
440CONF_VALUE *a;
441LHASH *conf;
442 {
443 if (a->name != NULL)
444 {
445 a=(CONF_VALUE *)lh_delete(conf,(char *)a);
446 }
447 }
448
449static void value_free_stack(a,conf)
450CONF_VALUE *a;
451LHASH *conf;
452 {
453 CONF_VALUE *vv;
454 STACK *sk;
455 int i;
456
457 if (a->name != NULL) return;
458
459 sk=(STACK *)a->value;
460 for (i=sk_num(sk)-1; i>=0; i--)
461 {
462 vv=(CONF_VALUE *)sk_value(sk,i);
463 Free(vv->value);
464 Free(vv->name);
465 Free(vv);
466 }
467 if (sk != NULL) sk_free(sk);
468 Free(a->section);
469 Free(a);
470 }
471
472static void clear_comments(p)
473char *p;
474 {
475 char *to;
476
477 to=p;
478 for (;;)
479 {
480 if (IS_COMMENT(*p))
481 {
482 *p='\0';
483 return;
484 }
485 if (IS_QUOTE(*p))
486 {
487 p=scan_quote(p);
488 continue;
489 }
490 if (IS_ESC(*p))
491 {
492 p=scan_esc(p);
493 continue;
494 }
495 if (IS_EOF(*p))
496 return;
497 else
498 p++;
499 }
500 }
501
502static int str_copy(conf,section,pto,from)
503LHASH *conf;
504char *section;
505char **pto,*from;
506 {
507 int q,r,rr=0,to=0,len=0;
508 char *s,*e,*rp,*p,*rrp,*np,*cp,v;
509 BUF_MEM *buf;
510
511 if ((buf=BUF_MEM_new()) == NULL) return(0);
512
513 len=strlen(from)+1;
514 if (!BUF_MEM_grow(buf,len)) goto err;
515
516 for (;;)
517 {
518 if (IS_QUOTE(*from))
519 {
520 q= *from;
521 from++;
522 while ((*from != '\0') && (*from != q))
523 {
524 if (*from == '\\')
525 {
526 from++;
527 if (*from == '\0') break;
528 }
529 buf->data[to++]= *(from++);
530 }
531 }
532 else if (*from == '\\')
533 {
534 from++;
535 v= *(from++);
536 if (v == '\0') break;
537 else if (v == 'r') v='\r';
538 else if (v == 'n') v='\n';
539 else if (v == 'b') v='\b';
540 else if (v == 't') v='\t';
541 buf->data[to++]= v;
542 }
543 else if (*from == '\0')
544 break;
545 else if (*from == '$')
546 {
547 /* try to expand it */
548 rrp=NULL;
549 s= &(from[1]);
550 if (*s == '{')
551 q='}';
552 else if (*s == '(')
553 q=')';
554 else q=0;
555
556 if (q) s++;
557 cp=section;
558 e=np=s;
559 while (IS_ALPHA_NUMERIC(*e))
560 e++;
561 if ((e[0] == ':') && (e[1] == ':'))
562 {
563 cp=np;
564 rrp=e;
565 rr= *e;
566 *rrp='\0';
567 e+=2;
568 np=e;
569 while (IS_ALPHA_NUMERIC(*e))
570 e++;
571 }
572 r= *e;
573 *e='\0';
574 rp=e;
575 if (q)
576 {
577 if (r != q)
578 {
579 CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE);
580 goto err;
581 }
582 e++;
583 }
584 /* So at this point we have
585 * ns which is the start of the name string which is
586 * '\0' terminated.
587 * cs which is the start of the section string which is
588 * '\0' terminated.
589 * e is the 'next point after'.
590 * r and s are the chars replaced by the '\0'
591 * rp and sp is where 'r' and 's' came from.
592 */
593 p=CONF_get_string(conf,cp,np);
594 if (rrp != NULL) *rrp=rr;
595 *rp=r;
596 if (p == NULL)
597 {
598 CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE);
599 goto err;
600 }
601 BUF_MEM_grow(buf,(strlen(p)+len-(e-from)));
602 while (*p)
603 buf->data[to++]= *(p++);
604 from=e;
605 }
606 else
607 buf->data[to++]= *(from++);
608 }
609 buf->data[to]='\0';
610 if (*pto != NULL) Free(*pto);
611 *pto=buf->data;
612 Free(buf);
613 return(1);
614err:
615 if (buf != NULL) BUF_MEM_free(buf);
616 return(0);
617 }
618
619static char *eat_ws(p)
620char *p;
621 {
622 while (IS_WS(*p) && (!IS_EOF(*p)))
623 p++;
624 return(p);
625 }
626
627static char *eat_alpha_numeric(p)
628char *p;
629 {
630 for (;;)
631 {
632 if (IS_ESC(*p))
633 {
634 p=scan_esc(p);
635 continue;
636 }
637 if (!IS_ALPHA_NUMERIC_PUNCT(*p))
638 return(p);
639 p++;
640 }
641 }
642
643static unsigned long hash(v)
644CONF_VALUE *v;
645 {
646 return((lh_strhash(v->section)<<2)^lh_strhash(v->name));
647 }
648
649static int cmp(a,b)
650CONF_VALUE *a,*b;
651 {
652 int i;
653
654 if (a->section != b->section)
655 {
656 i=strcmp(a->section,b->section);
657 if (i) return(i);
658 }
659
660 if ((a->name != NULL) && (b->name != NULL))
661 {
662 i=strcmp(a->name,b->name);
663 return(i);
664 }
665 else if (a->name == b->name)
666 return(0);
667 else
668 return((a->name == NULL)?-1:1);
669 }
670
671static char *scan_quote(p)
672char *p;
673 {
674 int q= *p;
675
676 p++;
677 while (!(IS_EOF(*p)) && (*p != q))
678 {
679 if (IS_ESC(*p))
680 {
681 p++;
682 if (IS_EOF(*p)) return(p);
683 }
684 p++;
685 }
686 if (*p == q) p++;
687 return(p);
688 }
689
690static CONF_VALUE *new_section(conf,section)
691LHASH *conf;
692char *section;
693 {
694 STACK *sk=NULL;
695 int ok=0,i;
696 CONF_VALUE *v=NULL,*vv;
697
698 if ((sk=sk_new_null()) == NULL)
699 goto err;
700 if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL)
701 goto err;
702 i=strlen(section)+1;
703 if ((v->section=(char *)Malloc(i)) == NULL)
704 goto err;
705
706 memcpy(v->section,section,i);
707 v->name=NULL;
708 v->value=(char *)sk;
709
710 vv=(CONF_VALUE *)lh_insert(conf,(char *)v);
711 if (vv != NULL)
712 {
713#if !defined(NO_STDIO) && !defined(WIN16)
714 fprintf(stderr,"internal fault\n");
715#endif
716 abort();
717 }
718 ok=1;
719err:
720 if (!ok)
721 {
722 if (sk != NULL) sk_free(sk);
723 if (v != NULL) Free(v);
724 v=NULL;
725 }
726 return(v);
727 }
diff --git a/src/lib/libcrypto/conf/conf.err b/src/lib/libcrypto/conf/conf.err
new file mode 100644
index 0000000000..933d3d692a
--- /dev/null
+++ b/src/lib/libcrypto/conf/conf.err
@@ -0,0 +1,12 @@
1/* Error codes for the CONF functions. */
2
3/* Function codes. */
4#define CONF_F_CONF_LOAD 100
5#define CONF_F_STR_COPY 101
6
7/* Reason codes. */
8#define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100
9#define CONF_R_MISSING_EQUAL_SIGN 101
10#define CONF_R_NO_CLOSE_BRACE 102
11#define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103
12#define CONF_R_VARIABLE_HAS_NO_VALUE 104
diff --git a/src/lib/libcrypto/conf/conf_lcl.h b/src/lib/libcrypto/conf/conf_lcl.h
new file mode 100644
index 0000000000..4e5644ed79
--- /dev/null
+++ b/src/lib/libcrypto/conf/conf_lcl.h
@@ -0,0 +1,102 @@
1/* crypto/conf/conf_lcl.h */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#define CONF_NUMBER 1
60#define CONF_UPPER 2
61#define CONF_LOWER 4
62#define CONF_UNDER 256
63#define CONF_PUNCTUATION 512
64#define CONF_WS 16
65#define CONF_ESC 32
66#define CONF_QUOTE 64
67#define CONF_COMMENT 128
68#define CONF_EOF 8
69#define CONF_ALPHA (CONF_UPPER|CONF_LOWER)
70#define CONF_ALPHA_NUMERIC (CONF_ALPHA|CONF_NUMBER|CONF_UNDER)
71#define CONF_ALPHA_NUMERIC_PUNCT (CONF_ALPHA|CONF_NUMBER|CONF_UNDER| \
72 CONF_PUNCTUATION)
73
74#define IS_COMMENT(a) (CONF_COMMENT&(CONF_type[(a)&0x7f]))
75#define IS_EOF(a) ((a) == '\0')
76#define IS_ESC(a) ((a) == '\\')
77#define IS_NUMER(a) (CONF_type[(a)&0x7f]&CONF_NUMBER)
78#define IS_WS(a) (CONF_type[(a)&0x7f]&CONF_WS)
79#define IS_ALPHA_NUMERIC(a) (CONF_type[(a)&0x7f]&CONF_ALPHA_NUMERIC)
80#define IS_ALPHA_NUMERIC_PUNCT(a) \
81 (CONF_type[(a)&0x7f]&CONF_ALPHA_NUMERIC_PUNCT)
82#define IS_QUOTE(a) (CONF_type[(a)&0x7f]&CONF_QUOTE)
83
84static unsigned short CONF_type[128]={
85 0x008,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
86 0x000,0x010,0x010,0x000,0x000,0x010,0x000,0x000,
87 0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
88 0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
89 0x010,0x200,0x040,0x080,0x000,0x200,0x200,0x040,
90 0x000,0x000,0x200,0x200,0x200,0x200,0x200,0x200,
91 0x001,0x001,0x001,0x001,0x001,0x001,0x001,0x001,
92 0x001,0x001,0x000,0x200,0x000,0x000,0x000,0x200,
93 0x200,0x002,0x002,0x002,0x002,0x002,0x002,0x002,
94 0x002,0x002,0x002,0x002,0x002,0x002,0x002,0x002,
95 0x002,0x002,0x002,0x002,0x002,0x002,0x002,0x002,
96 0x002,0x002,0x002,0x000,0x020,0x000,0x200,0x100,
97 0x040,0x004,0x004,0x004,0x004,0x004,0x004,0x004,
98 0x004,0x004,0x004,0x004,0x004,0x004,0x004,0x004,
99 0x004,0x004,0x004,0x004,0x004,0x004,0x004,0x004,
100 0x004,0x004,0x004,0x000,0x200,0x000,0x200,0x000,
101 };
102