summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/Makefile4
-rw-r--r--include/dbm.h43
-rw-r--r--lib/libc/db/hash/ndbm.c148
3 files changed, 175 insertions, 20 deletions
diff --git a/include/Makefile b/include/Makefile
index 106c1cfaa13..5fabbc903b7 100644
--- a/include/Makefile
+++ b/include/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.58 1999/02/01 22:59:15 d Exp $
+# $OpenBSD: Makefile,v 1.59 1999/02/12 04:46:27 millert Exp $
# $NetBSD: Makefile,v 1.59 1996/05/15 21:36:43 jtc Exp $
# @(#)Makefile 5.45.1.1 (Berkeley) 5/6/91
@@ -9,7 +9,7 @@
# Missing: mp.h
FILES= a.out.h ar.h assert.h bitstring.h blf.h bm.h cast.h cpio.h ctype.h \
- curses.h db.h des.h dirent.h disktab.h elf_abi.h err.h fnmatch.h \
+ curses.h db.h dbm.h des.h dirent.h disktab.h elf_abi.h err.h fnmatch.h \
fstab.h fts.h glob.h grp.h ieeefp.h inttypes.h iso646.h kvm.h \
langinfo.h libgen.h limits.h locale.h malloc.h math.h md4.h md5.h \
memory.h mpool.h ndbm.h netdb.h netgroup.h nlist.h nl_types.h \
diff --git a/include/dbm.h b/include/dbm.h
new file mode 100644
index 00000000000..d1422292f24
--- /dev/null
+++ b/include/dbm.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1999 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * 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. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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.
+ */
+
+#ifndef _DBM_H_
+#define _DBM_H_
+
+#include <ndbm.h>
+
+__BEGIN_DECLS
+int dbmclose __P((void));
+int dbminit __P((char *));
+int delete __P((datum));
+datum fetch __P((datum));
+datum firstkey __P((void));
+datum nextkey __P((datum));
+int store __P((datum, datum));
+__END_DECLS
+
+#endif /* _DBM_H_ */
diff --git a/lib/libc/db/hash/ndbm.c b/lib/libc/db/hash/ndbm.c
index e7a9d1c1cf5..545d0fa5c9f 100644
--- a/lib/libc/db/hash/ndbm.c
+++ b/lib/libc/db/hash/ndbm.c
@@ -1,3 +1,5 @@
+/* $OpenBSD: ndbm.c,v 1.6 1999/02/12 04:46:28 millert Exp $ */
+
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@@ -35,29 +37,134 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: ndbm.c,v 1.5 1997/02/16 11:08:16 deraadt Exp $";
+#if 0
+static char sccsid[] = "@(#)dbm.c 8.6 (Berkeley) 11/7/95";
+#else
+static char rcsid[] = "$OpenBSD: ndbm.c,v 1.6 1999/02/12 04:46:28 millert Exp $";
+#endif
#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 <errno.h>
+#include <fcntl.h>
#include <stdio.h>
#include <string.h>
-#include <errno.h>
#include <ndbm.h>
#include "hash.h"
/*
+ *
+ * This package provides dbm and ndbm compatible interfaces to DB.
+ * First are the DBM routines, which call the NDBM routines, and
+ * the NDBM routines, which call the DB routines.
+ */
+static DBM *__cur_db;
+
+static void no_open_db __P((void));
+
+int
+dbminit(file)
+ char *file;
+{
+ if (__cur_db != NULL)
+ (void)dbm_close(__cur_db);
+ if ((__cur_db = dbm_open(file, O_RDWR, 0)) != NULL)
+ return (0);
+ if ((__cur_db = dbm_open(file, O_RDONLY, 0)) != NULL)
+ return (0);
+ return (-1);
+}
+
+int
+dbmclose()
+{
+
+ if (__cur_db != NULL)
+ return (dbm_close(__cur_db));
+ return (-1);
+}
+
+datum
+fetch(key)
+ datum key;
+{
+ datum item;
+
+ if (__cur_db == NULL) {
+ no_open_db();
+ item.dptr = 0;
+ return (item);
+ }
+ return (dbm_fetch(__cur_db, key));
+}
+
+datum
+firstkey()
+{
+ datum item;
+
+ if (__cur_db == NULL) {
+ no_open_db();
+ item.dptr = 0;
+ return (item);
+ }
+ return (dbm_firstkey(__cur_db));
+}
+
+datum
+nextkey(key)
+ datum key;
+{
+ datum item;
+
+ if (__cur_db == NULL) {
+ no_open_db();
+ item.dptr = 0;
+ return (item);
+ }
+ return (dbm_nextkey(__cur_db));
+}
+
+int
+delete(key)
+ datum key;
+{
+ if (__cur_db == NULL) {
+ no_open_db();
+ return (-1);
+ }
+ if (dbm_rdonly(__cur_db))
+ return (-1);
+ return (dbm_delete(__cur_db, key));
+}
+
+int
+store(key, dat)
+ datum key, dat;
+{
+ if (__cur_db == NULL) {
+ no_open_db();
+ return (-1);
+ }
+ if (dbm_rdonly(__cur_db))
+ return (-1);
+ return (dbm_store(__cur_db, key, dat, DBM_REPLACE));
+}
+
+static void
+no_open_db()
+{
+ (void)fprintf(stderr, "dbm: no open database.\n");
+}
+
+/*
* Returns:
* *DBM on success
* NULL on failure
*/
-extern DBM *
+DBM *
dbm_open(file, flags, mode)
const char *file;
int flags, mode;
@@ -65,7 +172,7 @@ dbm_open(file, flags, mode)
HASHINFO info;
char path[MAXPATHLEN];
- if (strlen(file) + strlen(DBM_SUFFIX) > sizeof(path)-1) {
+ if (strlen(file) + strlen(DBM_SUFFIX) > sizeof(path) - 1) {
errno = ENAMETOOLONG;
return (NULL);
}
@@ -80,10 +187,15 @@ dbm_open(file, flags, mode)
return ((DBM *)__hash_open(path, flags, mode, &info, 0));
}
-extern void
+/*
+ * Returns:
+ * Nothing.
+ */
+void
dbm_close(db)
DBM *db;
{
+
(void)(db->close)(db);
}
@@ -92,7 +204,7 @@ dbm_close(db)
* DATUM on success
* NULL on failure
*/
-extern datum
+datum
dbm_fetch(db, key)
DBM *db;
datum key;
@@ -118,7 +230,7 @@ dbm_fetch(db, key)
* DATUM on success
* NULL on failure
*/
-extern datum
+datum
dbm_firstkey(db)
DBM *db;
{
@@ -139,7 +251,7 @@ dbm_firstkey(db)
* DATUM on success
* NULL on failure
*/
-extern datum
+datum
dbm_nextkey(db)
DBM *db;
{
@@ -160,7 +272,7 @@ dbm_nextkey(db)
* 0 on success
* <0 failure
*/
-extern int
+int
dbm_delete(db, key)
DBM *db;
datum key;
@@ -183,7 +295,7 @@ dbm_delete(db, key)
* <0 failure
* 1 if DBM_INSERT and entry exists
*/
-extern int
+int
dbm_store(db, key, data, flags)
DBM *db;
datum key, data;
@@ -199,7 +311,7 @@ dbm_store(db, key, data, flags)
(flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
}
-extern int
+int
dbm_error(db)
DBM *db;
{
@@ -209,7 +321,7 @@ dbm_error(db)
return (hp->errno);
}
-extern int
+int
dbm_clearerr(db)
DBM *db;
{
@@ -220,7 +332,7 @@ dbm_clearerr(db)
return (0);
}
-extern int
+int
dbm_dirfno(db)
DBM *db;
{