| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | /*-
 | 
					
						
							|  |  |  |  * Copyright (c) 1990, 1993 | 
					
						
							|  |  |  |  *	The Regents of the University of California.  All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This code is derived from software contributed to Berkeley by | 
					
						
							|  |  |  |  * Margo Seltzer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |  * are met: | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer in the | 
					
						
							|  |  |  |  *    documentation and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * 3. All advertising materials mentioning features or use of this software | 
					
						
							|  |  |  |  *    must display the following acknowledgement: | 
					
						
							|  |  |  |  *	This product includes software developed by the University of | 
					
						
							|  |  |  |  *	California, Berkeley and its contributors. | 
					
						
							|  |  |  |  * 4. Neither the name of the University nor the names of its contributors | 
					
						
							|  |  |  |  *    may be used to endorse or promote products derived from this software | 
					
						
							|  |  |  |  *    without specific prior written permission. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | 
					
						
							|  |  |  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
					
						
							|  |  |  |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | 
					
						
							|  |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
					
						
							|  |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
					
						
							|  |  |  |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
					
						
							|  |  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
					
						
							|  |  |  |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
					
						
							|  |  |  |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
					
						
							|  |  |  |  * SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(LIBC_SCCS) && !defined(lint)
 | 
					
						
							|  |  |  | static char sccsid[] = "@(#)ndbm.c	8.4 (Berkeley) 7/21/94"; | 
					
						
							|  |  |  | #endif /* LIBC_SCCS and not lint */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * This package provides a dbm compatible interface to the new hashing | 
					
						
							|  |  |  |  * package described in db(3). | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <sys/param.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <ndbm.h>
 | 
					
						
							|  |  |  | #include "hash.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Returns: | 
					
						
							|  |  |  |  * 	*DBM on success | 
					
						
							|  |  |  |  *	 NULL on failure | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern DBM * | 
					
						
							|  |  |  | dbm_open(file, flags, mode) | 
					
						
							|  |  |  | 	const char *file; | 
					
						
							|  |  |  | 	int flags, mode; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   	DBM *db; | 
					
						
							|  |  |  | 	HASHINFO info; | 
					
						
							|  |  |  | 	const size_t len = strlen(file) + sizeof (DBM_SUFFIX); | 
					
						
							|  |  |  | #ifdef __GNUC__
 | 
					
						
							|  |  |  | 	char path[len]; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	char *path = malloc(len); | 
					
						
							|  |  |  | 	if (path == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	info.bsize = 4096; | 
					
						
							|  |  |  | 	info.ffactor = 40; | 
					
						
							|  |  |  | 	info.nelem = 1; | 
					
						
							|  |  |  | 	info.cachesize = 0; | 
					
						
							|  |  |  | 	info.hash = NULL; | 
					
						
							|  |  |  | 	info.lorder = 0; | 
					
						
							| 
									
										
										
										
											2020-06-01 18:25:48 -05:00
										 |  |  | 	snprintf(path, len, "%s%s", file, DBM_SUFFIX); | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	db = (DBM *)__hash_open(path, flags, mode, &info, 0); | 
					
						
							|  |  |  | #ifndef	__GNUC__
 | 
					
						
							|  |  |  | 	free(path); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	return db; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern void | 
					
						
							|  |  |  | dbm_close(db) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	(void)(db->close)(db); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Returns: | 
					
						
							|  |  |  |  *	DATUM on success | 
					
						
							|  |  |  |  *	NULL on failure | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern datum | 
					
						
							|  |  |  | dbm_fetch(db, key) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | 	datum key; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	datum retdata; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	int status; | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	DBT dbtkey, dbtretdata; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	dbtkey.data = key.dptr; | 
					
						
							|  |  |  | 	dbtkey.size = key.dsize; | 
					
						
							|  |  |  | 	status = (db->get)(db, &dbtkey, &dbtretdata, 0); | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	if (status) { | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 		dbtretdata.data = NULL; | 
					
						
							|  |  |  | 		dbtretdata.size = 0; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	retdata.dptr = dbtretdata.data; | 
					
						
							|  |  |  | 	retdata.dsize = dbtretdata.size; | 
					
						
							|  |  |  | 	return (retdata); | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Returns: | 
					
						
							|  |  |  |  *	DATUM on success | 
					
						
							|  |  |  |  *	NULL on failure | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern datum | 
					
						
							|  |  |  | dbm_firstkey(db) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int status; | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	datum retkey; | 
					
						
							|  |  |  | 	DBT dbtretkey, dbtretdata; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST); | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	if (status) | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 		dbtretkey.data = NULL; | 
					
						
							|  |  |  | 	retkey.dptr = dbtretkey.data; | 
					
						
							|  |  |  | 	retkey.dsize = dbtretkey.size; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	return (retkey); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Returns: | 
					
						
							|  |  |  |  *	DATUM on success | 
					
						
							|  |  |  |  *	NULL on failure | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern datum | 
					
						
							|  |  |  | dbm_nextkey(db) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int status; | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	datum retkey; | 
					
						
							|  |  |  | 	DBT dbtretkey, dbtretdata; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT); | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	if (status) | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 		dbtretkey.data = NULL; | 
					
						
							|  |  |  | 	retkey.dptr = dbtretkey.data; | 
					
						
							|  |  |  | 	retkey.dsize = dbtretkey.size; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	return (retkey); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Returns: | 
					
						
							|  |  |  |  *	 0 on success | 
					
						
							|  |  |  |  *	<0 failure | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern int | 
					
						
							|  |  |  | dbm_delete(db, key) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | 	datum key; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int status; | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	DBT dbtkey; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	dbtkey.data = key.dptr; | 
					
						
							|  |  |  | 	dbtkey.size = key.dsize; | 
					
						
							|  |  |  | 	status = (db->del)(db, &dbtkey, 0); | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	if (status) | 
					
						
							|  |  |  | 		return (-1); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return (0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Returns: | 
					
						
							|  |  |  |  *	 0 on success | 
					
						
							|  |  |  |  *	<0 failure | 
					
						
							|  |  |  |  *	 1 if DBM_INSERT and entry exists | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern int | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | dbm_store(db, key, data, flags) | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	DBM *db; | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	datum key, data; | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	int flags; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-10-17 22:24:46 +00:00
										 |  |  | 	DBT dbtkey, dbtdata; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dbtkey.data = key.dptr; | 
					
						
							|  |  |  | 	dbtkey.size = key.dsize; | 
					
						
							|  |  |  | 	dbtdata.data = data.dptr; | 
					
						
							|  |  |  | 	dbtdata.size = data.dsize; | 
					
						
							|  |  |  | 	return ((db->put)(db, &dbtkey, &dbtdata, | 
					
						
							| 
									
										
										
										
											2003-01-04 18:53:14 +00:00
										 |  |  | 	    (flags == DBM_INSERT) ? R_NOOVERWRITE : 0)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int | 
					
						
							|  |  |  | dbm_error(db) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	HTAB *hp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hp = (HTAB *)db->internal; | 
					
						
							|  |  |  | 	return (hp->errnum); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int | 
					
						
							|  |  |  | dbm_clearerr(db) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	HTAB *hp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hp = (HTAB *)db->internal; | 
					
						
							|  |  |  | 	hp->errnum = 0; | 
					
						
							|  |  |  | 	return (0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int | 
					
						
							|  |  |  | dbm_dirfno(db) | 
					
						
							|  |  |  | 	DBM *db; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return(((HTAB *)db->internal)->fp); | 
					
						
							|  |  |  | } |