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) 34 static 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 */ 58 extern DBM * 59 dbm_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 82 extern void 83 dbm_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 */ 94 extern datum 95 dbm_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 */ 120 extern datum 121 dbm_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 */ 141 extern datum 142 dbm_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 */ 162 extern int 163 dbm_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 */ 185 extern int 186 dbm_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 201 extern int 202 dbm_error(db) 203 DBM *db; 204 { 205 HTAB *hp; 206 207 hp = (HTAB *)db->internal; 208 return (hp->error); 209 } 210 211 extern int 212 dbm_clearerr(db) 213 DBM *db; 214 { 215 HTAB *hp; 216 217 hp = (HTAB *)db->internal; 218 hp->error = 0; 219 return (0); 220 } 221 222 extern int 223 dbm_dirfno(db) 224 DBM *db; 225 { 226 return(((HTAB *)db->internal)->fp); 227 } 228