1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
7 * Reserved.  This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License').  You may not use this file
10 * except in compliance with the License.  Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
19 * License for the specific language governing rights and limitations
20 * under the License."
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24/*	$OpenBSD: ypdb.c,v 1.5 1997/02/09 09:49:36 maja Exp $ */
25
26/*
27 * Copyright (c) 1990, 1993
28 *	The Regents of the University of California.  All rights reserved.
29 * All rights reserved.
30 *
31 * This code is derived from software contributed to Berkeley by
32 * Margo Seltzer.
33 *
34 * This code is derived from ndbm module of BSD4.4 db (hash) by
35 * Mats O Jansson
36 *
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
39 * are met:
40 * 1. Redistributions of source code must retain the above copyright
41 *    notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above copyright
43 *    notice, this list of conditions and the following disclaimer in the
44 *    documentation and/or other materials provided with the distribution.
45 * 3. All advertising materials mentioning features or use of this software
46 *    must display the following acknowledgement:
47 *	This product includes software developed by the University of
48 *	California, Berkeley and its contributors.
49 * 4. Neither the name of the University nor the names of its contributors
50 *    may be used to endorse or promote products derived from this software
51 *    without specific prior written permission.
52 *
53 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
54 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
55 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
57 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63 * SUCH DAMAGE.
64 */
65
66#include <sys/param.h>
67#include <sys/types.h>
68#include <stdio.h>
69#include <string.h>
70
71#include "ypdb.h"
72
73#ifdef YPDB_PATCH
74extern DBM *__hash_open();
75#else
76extern DBM *__bt_open();
77#endif
78
79/*
80 * Returns:
81 * 	*DBM on success
82 *	 NULL on failure
83 */
84
85extern DBM *
86ypdb_open(file, flags, mode)
87	const char *file;
88	int flags, mode;
89{
90#ifdef YPDB_PATCH
91	HASHINFO info;
92	char path[MAXPATHLEN];
93
94	info.bsize = 4096;
95	info.ffactor = 40;
96	info.nelem = 1;
97	info.cachesize = NULL;
98	info.hash = NULL;
99	info.lorder = 0;
100	snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX);
101	return ((DBM *)__hash_open(path, flags, mode, &info, 0));
102#else
103	BTREEINFO info;
104	char path[MAXPATHLEN];
105	DBM *db;
106
107	info.flags = 0;
108	info.cachesize = 0;
109	info.maxkeypage = 0;
110	info.minkeypage = 0;
111	info.psize = 0;
112	info.compare = NULL;
113	info.prefix = NULL;
114	info.lorder = 0;
115	snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX);
116	db = (DBM *)__bt_open(path, flags, mode, &info, 0);
117	return (db);
118#endif
119}
120
121/*
122 * Returns:
123 * 	*DBM on success
124 *	 NULL on failure
125 */
126
127extern DBM *
128ypdb_open_suf(file, flags, mode)
129	const char *file;
130	int flags, mode;
131{
132#ifdef YPDB_PATCH
133	HASHINFO info;
134
135	info.bsize = 4096;
136	info.ffactor = 40;
137	info.nelem = 1;
138	info.cachesize = NULL;
139	info.hash = NULL;
140	info.lorder = 0;
141	return ((DBM *)__hash_open(file, flags, mode, &info, 0));
142#else
143	BTREEINFO info;
144	DBM *db;
145
146	info.flags = 0;
147	info.cachesize = 0;
148	info.maxkeypage = 0;
149	info.minkeypage = 0;
150	info.psize = 0;
151	info.compare = NULL;
152	info.prefix = NULL;
153	info.lorder = 0;
154	db = (DBM *)__bt_open(file, flags, mode, &info, 0);
155	return (db);
156#endif
157}
158
159extern void
160ypdb_close(db)
161	DBM *db;
162{
163	(void)(db->close)(db);
164}
165
166/*
167 * Returns:
168 *	DATUM on success
169 *	NULL on failure
170 */
171
172extern datum
173ypdb_fetch(db, key)
174	DBM *db;
175	datum key;
176{
177	datum retval;
178	int status;
179
180	status = (db->get)(db, (DBT *)&key, (DBT *)&retval, 0);
181	if (status) {
182		retval.dptr = NULL;
183		retval.dsize = 0;
184	}
185	return (retval);
186}
187
188/*
189 * Returns:
190 *	DATUM on success
191 *	NULL on failure
192 */
193
194extern datum
195ypdb_firstkey(db)
196	DBM *db;
197{
198	int status;
199	datum retdata, retkey;
200
201	status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST);
202	if (status)
203		retkey.dptr = NULL;
204	return (retkey);
205}
206
207/*
208 * Returns:
209 *	DATUM on success
210 *	NULL on failure
211 */
212
213extern datum
214ypdb_nextkey(db)
215	DBM *db;
216{
217	int status;
218	datum retdata, retkey;
219
220	status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT);
221	if (status)
222		retkey.dptr = NULL;
223	return (retkey);
224}
225
226/*
227 * Returns:
228 *	DATUM on success
229 *	NULL on failure
230 */
231
232extern datum
233ypdb_setkey(db, key)
234	DBM *db;
235        datum key;
236{
237	int status;
238	datum retdata;
239#ifdef YPDB_PATCH
240	datum retkey;
241
242	status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST);
243	if (status)
244		retkey.dptr = NULL;
245	while ((retkey.dptr != NULL) &&
246	       ((retkey.dsize != key.dsize) ||
247		(strncmp(key.dptr,retkey.dptr,retkey.dsize) != 0))) {
248	  status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT);
249	  if (status)
250	  	retkey.dptr = NULL;
251	};
252	return (retkey);
253#else
254	status = (db->seq)(db, (DBT *)&key, (DBT *)&retdata, R_CURSOR);
255	if (status)
256		key.dptr = NULL;
257	return (key);
258#endif
259}
260
261/*
262 * Returns:
263 *	 0 on success
264 *	<0 failure
265 */
266
267int
268ypdb_delete(db, key)
269	DBM *db;
270	datum key;
271{
272	int status;
273
274	status = (db->del)(db, (DBT *)&key, 0);
275	if (status)
276		return (-1);
277	else
278		return (0);
279}
280
281/*
282 * Returns:
283 *	 0 on success
284 *	<0 failure
285 *	 1 if YPDB_INSERT and entry exists
286 */
287
288int
289ypdb_store(db, key, content, flags)
290	DBM *db;
291	datum key, content;
292	int flags;
293{
294	return ((db->put)(db, (DBT *)&key, (DBT *)&content,
295	    (flags == YPDB_INSERT) ? R_NOOVERWRITE : 0));
296}
297
298