ndbm.c.patch   [plain text]


--- ndbm.c.orig	2009-11-06 12:41:16.000000000 -0800
+++ ndbm.c	2009-11-06 12:41:27.000000000 -0800
@@ -47,6 +47,9 @@ __FBSDID("$FreeBSD: src/lib/libc/db/hash
 #include <string.h>
 #include <errno.h>
 
+#include <db.h>
+#define _DBM
+typedef DB DBM;
 #include <ndbm.h>
 #include "hash.h"
 
@@ -58,7 +61,8 @@ __FBSDID("$FreeBSD: src/lib/libc/db/hash
 extern DBM *
 dbm_open(file, flags, mode)
 	const char *file;
-	int flags, mode;
+	int flags;
+	mode_t mode;
 {
 	HASHINFO info;
 	char path[MAXPATHLEN];
@@ -124,10 +128,14 @@ dbm_firstkey(db)
 	int status;
 	datum retkey;
 	DBT dbtretkey, dbtretdata;
+	HTAB *htab = (HTAB *)(db->internal);
 
 	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST);
-	if (status)
+	if (status) {
 		dbtretkey.data = NULL;
+		htab->nextkey_eof = 1;
+	} else
+		htab->nextkey_eof = 0;
 	retkey.dptr = dbtretkey.data;
 	retkey.dsize = dbtretkey.size;
 	return (retkey);
@@ -142,13 +150,20 @@ extern datum
 dbm_nextkey(db)
 	DBM *db;
 {
-	int status;
+	int status = 1;
 	datum retkey;
 	DBT dbtretkey, dbtretdata;
+	HTAB *htab = (HTAB *)(db->internal);
 
-	status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
-	if (status)
+	if (htab->nextkey_eof)
 		dbtretkey.data = NULL;
+	else {
+		status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT);
+		if (status) {
+			dbtretkey.data = NULL;
+			htab->nextkey_eof = 1;
+		}
+	}
 	retkey.dptr = dbtretkey.data;
 	retkey.dsize = dbtretkey.size;
 	return (retkey);