158f0484fSRodney W. Grimes /*- 258f0484fSRodney W. Grimes * Copyright (c) 1990, 1993 358f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved. 458f0484fSRodney W. Grimes * 558f0484fSRodney W. Grimes * This code is derived from software contributed to Berkeley by 658f0484fSRodney W. Grimes * Margo Seltzer. 758f0484fSRodney W. Grimes * 858f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 958f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions 1058f0484fSRodney W. Grimes * are met: 1158f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 1258f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 1358f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 1458f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 1558f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution. 1658f0484fSRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 1758f0484fSRodney W. Grimes * must display the following acknowledgement: 1858f0484fSRodney W. Grimes * This product includes software developed by the University of 1958f0484fSRodney W. Grimes * California, Berkeley and its contributors. 2058f0484fSRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 2158f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software 2258f0484fSRodney W. Grimes * without specific prior written permission. 2358f0484fSRodney W. Grimes * 2458f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2558f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2658f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2758f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2858f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2958f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3058f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3158f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3258f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3358f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3458f0484fSRodney W. Grimes * SUCH DAMAGE. 3558f0484fSRodney W. Grimes */ 3658f0484fSRodney W. Grimes 3758f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint) 38f1e396bcSPaul Traina static char sccsid[] = "@(#)ndbm.c 8.4 (Berkeley) 7/21/94"; 3958f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */ 4058f0484fSRodney W. Grimes 4158f0484fSRodney W. Grimes /* 4258f0484fSRodney W. Grimes * This package provides a dbm compatible interface to the new hashing 4358f0484fSRodney W. Grimes * package described in db(3). 4458f0484fSRodney W. Grimes */ 4558f0484fSRodney W. Grimes 4658f0484fSRodney W. Grimes #include <sys/param.h> 4758f0484fSRodney W. Grimes 4858f0484fSRodney W. Grimes #include <stdio.h> 4958f0484fSRodney W. Grimes #include <string.h> 50d53ec6c0SDaniel O'Callaghan #include <errno.h> 5158f0484fSRodney W. Grimes 52f1e396bcSPaul Traina #include <ndbm.h> 5358f0484fSRodney W. Grimes #include "hash.h" 5458f0484fSRodney W. Grimes 5558f0484fSRodney W. Grimes /* 5658f0484fSRodney W. Grimes * Returns: 5758f0484fSRodney W. Grimes * *DBM on success 5858f0484fSRodney W. Grimes * NULL on failure 5958f0484fSRodney W. Grimes */ 6058f0484fSRodney W. Grimes extern DBM * 6158f0484fSRodney W. Grimes dbm_open(file, flags, mode) 6258f0484fSRodney W. Grimes const char *file; 6358f0484fSRodney W. Grimes int flags, mode; 6458f0484fSRodney W. Grimes { 6558f0484fSRodney W. Grimes HASHINFO info; 6658f0484fSRodney W. Grimes char path[MAXPATHLEN]; 6758f0484fSRodney W. Grimes 6858f0484fSRodney W. Grimes info.bsize = 4096; 6958f0484fSRodney W. Grimes info.ffactor = 40; 7058f0484fSRodney W. Grimes info.nelem = 1; 71f1e396bcSPaul Traina info.cachesize = 0; 7258f0484fSRodney W. Grimes info.hash = NULL; 7358f0484fSRodney W. Grimes info.lorder = 0; 74d53ec6c0SDaniel O'Callaghan 75d53ec6c0SDaniel O'Callaghan if( strlen(file) >= sizeof(path) - strlen(DBM_SUFFIX)) { 76d53ec6c0SDaniel O'Callaghan errno = ENAMETOOLONG; 77d53ec6c0SDaniel O'Callaghan return(NULL); 78d53ec6c0SDaniel O'Callaghan } 7958f0484fSRodney W. Grimes (void)strcpy(path, file); 8058f0484fSRodney W. Grimes (void)strcat(path, DBM_SUFFIX); 8158f0484fSRodney W. Grimes return ((DBM *)__hash_open(path, flags, mode, &info, 0)); 8258f0484fSRodney W. Grimes } 8358f0484fSRodney W. Grimes 8458f0484fSRodney W. Grimes extern void 8558f0484fSRodney W. Grimes dbm_close(db) 8658f0484fSRodney W. Grimes DBM *db; 8758f0484fSRodney W. Grimes { 8858f0484fSRodney W. Grimes (void)(db->close)(db); 8958f0484fSRodney W. Grimes } 9058f0484fSRodney W. Grimes 9158f0484fSRodney W. Grimes /* 9258f0484fSRodney W. Grimes * Returns: 9358f0484fSRodney W. Grimes * DATUM on success 9458f0484fSRodney W. Grimes * NULL on failure 9558f0484fSRodney W. Grimes */ 9658f0484fSRodney W. Grimes extern datum 9758f0484fSRodney W. Grimes dbm_fetch(db, key) 9858f0484fSRodney W. Grimes DBM *db; 9958f0484fSRodney W. Grimes datum key; 10058f0484fSRodney W. Grimes { 1018618ef52SPaul Traina datum retdata; 10258f0484fSRodney W. Grimes int status; 1038618ef52SPaul Traina DBT dbtkey, dbtretdata; 10458f0484fSRodney W. Grimes 1058618ef52SPaul Traina dbtkey.data = key.dptr; 1068618ef52SPaul Traina dbtkey.size = key.dsize; 1078618ef52SPaul Traina status = (db->get)(db, &dbtkey, &dbtretdata, 0); 10858f0484fSRodney W. Grimes if (status) { 1098618ef52SPaul Traina dbtretdata.data = NULL; 1108618ef52SPaul Traina dbtretdata.size = 0; 11158f0484fSRodney W. Grimes } 1128618ef52SPaul Traina retdata.dptr = dbtretdata.data; 1138618ef52SPaul Traina retdata.dsize = dbtretdata.size; 1148618ef52SPaul Traina return (retdata); 11558f0484fSRodney W. Grimes } 11658f0484fSRodney W. Grimes 11758f0484fSRodney W. Grimes /* 11858f0484fSRodney W. Grimes * Returns: 11958f0484fSRodney W. Grimes * DATUM on success 12058f0484fSRodney W. Grimes * NULL on failure 12158f0484fSRodney W. Grimes */ 12258f0484fSRodney W. Grimes extern datum 12358f0484fSRodney W. Grimes dbm_firstkey(db) 12458f0484fSRodney W. Grimes DBM *db; 12558f0484fSRodney W. Grimes { 12658f0484fSRodney W. Grimes int status; 1278618ef52SPaul Traina datum retkey; 1288618ef52SPaul Traina DBT dbtretkey, dbtretdata; 12958f0484fSRodney W. Grimes 1308618ef52SPaul Traina status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST); 13158f0484fSRodney W. Grimes if (status) 1328618ef52SPaul Traina dbtretkey.data = NULL; 1338618ef52SPaul Traina retkey.dptr = dbtretkey.data; 1348618ef52SPaul Traina retkey.dsize = dbtretkey.size; 13558f0484fSRodney W. Grimes return (retkey); 13658f0484fSRodney W. Grimes } 13758f0484fSRodney W. Grimes 13858f0484fSRodney W. Grimes /* 13958f0484fSRodney W. Grimes * Returns: 14058f0484fSRodney W. Grimes * DATUM on success 14158f0484fSRodney W. Grimes * NULL on failure 14258f0484fSRodney W. Grimes */ 14358f0484fSRodney W. Grimes extern datum 14458f0484fSRodney W. Grimes dbm_nextkey(db) 14558f0484fSRodney W. Grimes DBM *db; 14658f0484fSRodney W. Grimes { 14758f0484fSRodney W. Grimes int status; 1488618ef52SPaul Traina datum retkey; 1498618ef52SPaul Traina DBT dbtretkey, dbtretdata; 15058f0484fSRodney W. Grimes 1518618ef52SPaul Traina status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT); 15258f0484fSRodney W. Grimes if (status) 1538618ef52SPaul Traina dbtretkey.data = NULL; 1548618ef52SPaul Traina retkey.dptr = dbtretkey.data; 1558618ef52SPaul Traina retkey.dsize = dbtretkey.size; 15658f0484fSRodney W. Grimes return (retkey); 15758f0484fSRodney W. Grimes } 1588618ef52SPaul Traina 15958f0484fSRodney W. Grimes /* 16058f0484fSRodney W. Grimes * Returns: 16158f0484fSRodney W. Grimes * 0 on success 16258f0484fSRodney W. Grimes * <0 failure 16358f0484fSRodney W. Grimes */ 16458f0484fSRodney W. Grimes extern int 16558f0484fSRodney W. Grimes dbm_delete(db, key) 16658f0484fSRodney W. Grimes DBM *db; 16758f0484fSRodney W. Grimes datum key; 16858f0484fSRodney W. Grimes { 16958f0484fSRodney W. Grimes int status; 1708618ef52SPaul Traina DBT dbtkey; 17158f0484fSRodney W. Grimes 1728618ef52SPaul Traina dbtkey.data = key.dptr; 1738618ef52SPaul Traina dbtkey.size = key.dsize; 1748618ef52SPaul Traina status = (db->del)(db, &dbtkey, 0); 17558f0484fSRodney W. Grimes if (status) 17658f0484fSRodney W. Grimes return (-1); 17758f0484fSRodney W. Grimes else 17858f0484fSRodney W. Grimes return (0); 17958f0484fSRodney W. Grimes } 18058f0484fSRodney W. Grimes 18158f0484fSRodney W. Grimes /* 18258f0484fSRodney W. Grimes * Returns: 18358f0484fSRodney W. Grimes * 0 on success 18458f0484fSRodney W. Grimes * <0 failure 18558f0484fSRodney W. Grimes * 1 if DBM_INSERT and entry exists 18658f0484fSRodney W. Grimes */ 18758f0484fSRodney W. Grimes extern int 1888618ef52SPaul Traina dbm_store(db, key, data, flags) 18958f0484fSRodney W. Grimes DBM *db; 1908618ef52SPaul Traina datum key, data; 19158f0484fSRodney W. Grimes int flags; 19258f0484fSRodney W. Grimes { 1938618ef52SPaul Traina DBT dbtkey, dbtdata; 1948618ef52SPaul Traina 1958618ef52SPaul Traina dbtkey.data = key.dptr; 1968618ef52SPaul Traina dbtkey.size = key.dsize; 1978618ef52SPaul Traina dbtdata.data = data.dptr; 1988618ef52SPaul Traina dbtdata.size = data.dsize; 1998618ef52SPaul Traina return ((db->put)(db, &dbtkey, &dbtdata, 20058f0484fSRodney W. Grimes (flags == DBM_INSERT) ? R_NOOVERWRITE : 0)); 20158f0484fSRodney W. Grimes } 20258f0484fSRodney W. Grimes 20358f0484fSRodney W. Grimes extern int 20458f0484fSRodney W. Grimes dbm_error(db) 20558f0484fSRodney W. Grimes DBM *db; 20658f0484fSRodney W. Grimes { 20758f0484fSRodney W. Grimes HTAB *hp; 20858f0484fSRodney W. Grimes 20958f0484fSRodney W. Grimes hp = (HTAB *)db->internal; 210f70177e7SJulian Elischer return (hp->error); 21158f0484fSRodney W. Grimes } 21258f0484fSRodney W. Grimes 21358f0484fSRodney W. Grimes extern int 21458f0484fSRodney W. Grimes dbm_clearerr(db) 21558f0484fSRodney W. Grimes DBM *db; 21658f0484fSRodney W. Grimes { 21758f0484fSRodney W. Grimes HTAB *hp; 21858f0484fSRodney W. Grimes 21958f0484fSRodney W. Grimes hp = (HTAB *)db->internal; 220f70177e7SJulian Elischer hp->error = 0; 22158f0484fSRodney W. Grimes return (0); 22258f0484fSRodney W. Grimes } 22358f0484fSRodney W. Grimes 22458f0484fSRodney W. Grimes extern int 22558f0484fSRodney W. Grimes dbm_dirfno(db) 22658f0484fSRodney W. Grimes DBM *db; 22758f0484fSRodney W. Grimes { 22858f0484fSRodney W. Grimes return(((HTAB *)db->internal)->fp); 22958f0484fSRodney W. Grimes } 230