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