ndbm.c.patch   [plain text]


--- ndbm.c.org	2006-09-08 18:47:42.000000000 -0700
+++ ndbm.c	2006-09-08 18:48:03.000000000 -0700
@@ -51,6 +51,9 @@
 #include <string.h>
 #include <errno.h>
 
+#include <db.h>
+#define _DBM
+typedef DB DBM;
 #include <ndbm.h>
 #include "hash.h"
 
@@ -62,7 +65,8 @@
 extern DBM *
 dbm_open(file, flags, mode)
 	const char *file;
-	int flags, mode;
+	int flags;
+	mode_t mode;
 {
 	HASHINFO info;
 	char path[MAXPATHLEN];
@@ -128,10 +132,14 @@
 	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);
@@ -146,13 +154,20 @@
 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);