1/*-
2 * Copyright (c) 1990, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Margo Seltzer.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 4. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#if defined(LIBC_SCCS) && !defined(lint)
34static char sccsid[] = "@(#)ndbm.c	8.4 (Berkeley) 7/21/94";
35#endif /* LIBC_SCCS and not lint */
36#include <sys/cdefs.h>
37__FBSDID("$FreeBSD$");
38
39/*
40 * This package provides a dbm compatible interface to the new hashing
41 * package described in db(3).
42 */
43
44#include <sys/param.h>
45
46#include <stdio.h>
47#include <string.h>
48#include <errno.h>
49
50#include <ndbm.h>
51#include "hash.h"
52
53/*
54 * Returns:
55 * 	*DBM on success
56 *	 NULL on failure
57 */
58extern DBM *
59dbm_open(file, flags, mode)
60	const char *file;
61	int flags, mode;
62{
63	HASHINFO info;
64	char path[MAXPATHLEN];
65
66	info.bsize = 4096;
67	info.ffactor = 40;
68	info.nelem = 1;
69	info.cachesize = 0;
70	info.hash = NULL;
71	info.lorder = 0;
72
73	if( strlen(file) >= sizeof(path) - strlen(DBM_SUFFIX)) {
74		errno = ENAMETOOLONG;
75		return(NULL);
76	}
77	(void)strcpy(path, file);
78	(void)strcat(path, DBM_SUFFIX);
79	return ((DBM *)__hash_open(path, flags, mode, &info, 0));
80}
81
82extern void
83dbm_close(db)
84	DBM *db;
85{
86	(void)(db->close)(db);
87}
88
89/*
90 * Returns:
91 *	DATUM on success
92 *	NULL on failure
93 */
94extern datum
95dbm_fetch(db, key)
96	DBM *db;
97	datum key;
98{
99	datum retdata;
100	int status;
101	DBT dbtkey, dbtretdata;
102
103	dbtkey.data = key.dptr;
104	dbtkey.size = key.dsize;
105	status = (db->get)(db, &dbtkey, &dbtretdata, 0);
106	if (status) {
107		dbtretdata.data = NULL;
108		dbtretdata.size = 0;
109	}
110	retdata.dptr = dbtretdata.data;
111	retdata.dsize = dbtretdata.size;
112	return (retdata);
113}
114
115/*
116 * Returns:
117 *	DATUM on success
118 *	NULL on failure
119 */
120extern datum
121dbm_firstkey(db)
122	DBM *db;
123{
124	int status;
125	datum retkey;
126	DBT dbtretkey, dbtretdata;
127
128	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST);
129	if (status)
130		dbtretkey.data = NULL;
131	retkey.dptr = dbtretkey.data;
132	retkey.dsize = dbtretkey.size;
133	return (retkey);
134}
135
136/*
137 * Returns:
138 *	DATUM on success
139 *	NULL on failure
140 */
141extern datum
142dbm_nextkey(db)
143	DBM *db;
144{
145	int status;
146	datum retkey;
147	DBT dbtretkey, dbtretdata;
148
149	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
150	if (status)
151		dbtretkey.data = NULL;
152	retkey.dptr = dbtretkey.data;
153	retkey.dsize = dbtretkey.size;
154	return (retkey);
155}
156
157/*
158 * Returns:
159 *	 0 on success
160 *	<0 failure
161 */
162extern int
163dbm_delete(db, key)
164	DBM *db;
165	datum key;
166{
167	int status;
168	DBT dbtkey;
169
170	dbtkey.data = key.dptr;
171	dbtkey.size = key.dsize;
172	status = (db->del)(db, &dbtkey, 0);
173	if (status)
174		return (-1);
175	else
176		return (0);
177}
178
179/*
180 * Returns:
181 *	 0 on success
182 *	<0 failure
183 *	 1 if DBM_INSERT and entry exists
184 */
185extern int
186dbm_store(db, key, data, flags)
187	DBM *db;
188	datum key, data;
189	int flags;
190{
191	DBT dbtkey, dbtdata;
192
193	dbtkey.data = key.dptr;
194	dbtkey.size = key.dsize;
195	dbtdata.data = data.dptr;
196	dbtdata.size = data.dsize;
197	return ((db->put)(db, &dbtkey, &dbtdata,
198	    (flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
199}
200
201extern int
202dbm_error(db)
203	DBM *db;
204{
205	HTAB *hp;
206
207	hp = (HTAB *)db->internal;
208	return (hp->error);
209}
210
211extern int
212dbm_clearerr(db)
213	DBM *db;
214{
215	HTAB *hp;
216
217	hp = (HTAB *)db->internal;
218	hp->error = 0;
219	return (0);
220}
221
222extern int
223dbm_dirfno(db)
224	DBM *db;
225{
226	return(((HTAB *)db->internal)->fp);
227}
228