--- 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);