1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/txt_db/txt_db.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/buffer.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/txt_db.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef BUFSIZE
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BUFSIZE	512
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char TXT_DB_version[]="TXT_DB" OPENSSL_VERSION_PTEXT;
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTXT_DB *TXT_DB_read(BIO *in, int num)
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	TXT_DB *ret=NULL;
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int er=1;
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int esc=0;
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long ln=0;
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,add,n;
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int size=BUFSIZE;
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int offset=0;
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	char *p,*f;
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	OPENSSL_STRING *pp;
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_MEM *buf=NULL;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((buf=BUF_MEM_new()) == NULL) goto err;
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!BUF_MEM_grow(buf,size)) goto err;
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((ret=OPENSSL_malloc(sizeof(TXT_DB))) == NULL)
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->num_fields=num;
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->index=NULL;
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->qual=NULL;
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((ret->data=sk_OPENSSL_PSTRING_new_null()) == NULL)
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((ret->index=OPENSSL_malloc(sizeof(*ret->index)*num)) == NULL)
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((ret->qual=OPENSSL_malloc(sizeof(*(ret->qual))*num)) == NULL)
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<num; i++)
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret->index[i]=NULL;
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret->qual[i]=NULL;
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add=(num+1)*sizeof(char *);
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	buf->data[size-1]='\0';
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	offset=0;
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (offset != 0)
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			size+=BUFSIZE;
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!BUF_MEM_grow_clean(buf,size)) goto err;
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buf->data[offset]='\0';
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_gets(in,&(buf->data[offset]),size-offset);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ln++;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (buf->data[offset] == '\0') break;
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((offset == 0) && (buf->data[0] == '#')) continue;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=strlen(&(buf->data[offset]));
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		offset+=i;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (buf->data[offset-1] != '\n')
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			continue;
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			buf->data[offset-1]='\0'; /* blat the '\n' */
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (!(p=OPENSSL_malloc(add+offset))) goto err;
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			offset=0;
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		pp=(char **)p;
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p+=add;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		n=0;
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		pp[n++]=p;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=0;
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		f=buf->data;
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		esc=0;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (;;)
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*f == '\0') break;
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*f == '\t')
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (esc)
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					p--;
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					*(p++)='\0';
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					f++;
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (n >=  num) break;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					pp[n++]=p;
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					continue;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			esc=(*f == '\\');
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(p++)= *(f++);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*(p++)='\0';
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((n != num) || (*f != '\0'))
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)	/* temporary fix :-( */
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(stderr,"wrong number of fields on line %ld (looking for field %d, got %d, '%s' left)\n",ln,num,n,f);
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			er=2;
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		pp[n]=p;
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (!sk_OPENSSL_PSTRING_push(ret->data,pp))
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)	/* temporary fix :-( */
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fprintf(stderr,"failure in sk_push\n");
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			er=2;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	er=0;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_MEM_free(buf);
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (er)
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (er == 1) fprintf(stderr,"OPENSSL_malloc failure\n");
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ret != NULL)
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (ret->data != NULL) sk_OPENSSL_PSTRING_free(ret->data);
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ret->index != NULL) OPENSSL_free(ret->index);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ret->qual != NULL) OPENSSL_free(ret->qual);
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ret != NULL) OPENSSL_free(ret);
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(ret);
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromOPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, OPENSSL_STRING *value)
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	OPENSSL_STRING *ret;
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	LHASH_OF(OPENSSL_STRING) *lh;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (idx >= db->num_fields)
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		db->error=DB_ERROR_INDEX_OUT_OF_RANGE;
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lh=db->index[idx];
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (lh == NULL)
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		db->error=DB_ERROR_NO_INDEX;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(NULL);
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret=lh_OPENSSL_STRING_retrieve(lh,value);
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	db->error=DB_ERROR_OK;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint TXT_DB_create_index(TXT_DB *db, int field, int (*qual)(OPENSSL_STRING *),
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp)
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	LHASH_OF(OPENSSL_STRING) *idx;
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	OPENSSL_STRING *r;
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,n;
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (field >= db->num_fields)
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		db->error=DB_ERROR_INDEX_OUT_OF_RANGE;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* FIXME: we lose type checking at this point */
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((idx=(LHASH_OF(OPENSSL_STRING) *)lh_new(hash,cmp)) == NULL)
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		db->error=DB_ERROR_MALLOC;
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	n=sk_OPENSSL_PSTRING_num(db->data);
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<n; i++)
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		r=sk_OPENSSL_PSTRING_value(db->data,i);
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((qual != NULL) && (qual(r) == 0)) continue;
240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if ((r=lh_OPENSSL_STRING_insert(idx,r)) != NULL)
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			db->error=DB_ERROR_INDEX_CLASH;
243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			db->arg1=sk_OPENSSL_PSTRING_find(db->data,r);
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			db->arg2=i;
245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			lh_OPENSSL_STRING_free(idx);
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (db->index[field] != NULL) lh_OPENSSL_STRING_free(db->index[field]);
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	db->index[field]=idx;
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	db->qual[field]=qual;
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong TXT_DB_write(BIO *out, TXT_DB *db)
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long i,j,n,nn,l,tot=0;
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p,**pp,*f;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_MEM *buf=NULL;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	long ret= -1;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((buf=BUF_MEM_new()) == NULL)
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	n=sk_OPENSSL_PSTRING_num(db->data);
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nn=db->num_fields;
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<n; i++)
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		pp=sk_OPENSSL_PSTRING_value(db->data,i);
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l=0;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (j=0; j<nn; j++)
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (pp[j] != NULL)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				l+=strlen(pp[j]);
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!BUF_MEM_grow_clean(buf,(int)(l*2+nn))) goto err;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p=buf->data;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (j=0; j<nn; j++)
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			f=pp[j];
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (f != NULL)
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (;;)
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (*f == '\0') break;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (*f == '\t') *(p++)='\\';
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					*(p++)= *(f++);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*(p++)='\t';
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p[-1]='\n';
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		j=p-buf->data;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (BIO_write(out,buf->data,(int)j) != j)
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tot+=j;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=tot;
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (buf != NULL) BUF_MEM_free(buf);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *row)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	OPENSSL_STRING *r;
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<db->num_fields; i++)
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (db->index[i] != NULL)
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((db->qual[i] != NULL) &&
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(db->qual[i](row) == 0)) continue;
314221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			r=lh_OPENSSL_STRING_retrieve(db->index[i],row);
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (r != NULL)
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				db->error=DB_ERROR_INDEX_CLASH;
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				db->arg1=i;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				db->arg_row=r;
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* We have passed the index checks, now just append and insert */
325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!sk_OPENSSL_PSTRING_push(db->data,row))
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		db->error=DB_ERROR_MALLOC;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<db->num_fields; i++)
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (db->index[i] != NULL)
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((db->qual[i] != NULL) &&
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(db->qual[i](row) == 0)) continue;
337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			(void)lh_OPENSSL_STRING_insert(db->index[i],row);
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid TXT_DB_free(TXT_DB *db)
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,n;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char **p,*max;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(db == NULL)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    return;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (db->index != NULL)
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=db->num_fields-1; i>=0; i--)
356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (db->index[i] != NULL) lh_OPENSSL_STRING_free(db->index[i]);
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(db->index);
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (db->qual != NULL)
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(db->qual);
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (db->data != NULL)
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		for (i=sk_OPENSSL_PSTRING_num(db->data)-1; i>=0; i--)
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* check if any 'fields' have been allocated
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * from outside of the initial block */
367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			p=sk_OPENSSL_PSTRING_value(db->data,i);
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			max=p[db->num_fields]; /* last address */
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (max == NULL) /* new row */
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (n=0; n<db->num_fields; n++)
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (p[n] != NULL) OPENSSL_free(p[n]);
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (n=0; n<db->num_fields; n++)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (((p[n] < (char *)p) || (p[n] > max))
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						&& (p[n] != NULL))
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						OPENSSL_free(p[n]);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			OPENSSL_free(sk_OPENSSL_PSTRING_value(db->data,i));
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sk_OPENSSL_PSTRING_free(db->data);
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(db);
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
389