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