summaryrefslogtreecommitdiff
path: root/libmu_dbm/berkeley.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmu_dbm/berkeley.c')
-rw-r--r--libmu_dbm/berkeley.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/libmu_dbm/berkeley.c b/libmu_dbm/berkeley.c
index b9aab0c4f..88965f19f 100644
--- a/libmu_dbm/berkeley.c
+++ b/libmu_dbm/berkeley.c
@@ -1,5 +1,5 @@
/* GNU Mailutils -- a suite of utilities for electronic mail
- Copyright (C) 2011-2019 Free Software Foundation, Inc.
+ Copyright (C) 2011-2024 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -69,8 +69,9 @@ static int
do_bdb_open (mu_dbm_file_t mdb, int flags, int mode)
{
struct bdb_file *bdb_file = mdb->db_descr;
- int f, rc, locker_flags;
+ int f, rc;
enum mu_locker_mode locker_mode;
+ mu_locker_hints_t hints = { .flags = MU_LOCKER_FLAG_RETRY };
int tfd = -1;
switch (flags)
@@ -96,12 +97,10 @@ do_bdb_open (mu_dbm_file_t mdb, int flags, int mode)
#ifdef DB_FCNTL_LOCKING
f |= DB_FCNTL_LOCKING;
- locker_flags = MU_LOCKER_KERNEL;
-#else
- locker_flags = 0;
+ hints.flags |= MU_LOCKER_FLAG_TYPE;
+ hints.type = MU_LOCKER_TYPE_KERNEL;
#endif
- rc = mu_locker_create (&bdb_file->locker, mdb->db_name,
- locker_flags|MU_LOCKER_RETRY);
+ rc = mu_locker_create_ext (&bdb_file->locker, mdb->db_name, &hints);
if (rc)
return rc;
@@ -154,9 +153,14 @@ _bdb_close (mu_dbm_file_t db)
if (db->db_descr)
{
struct bdb_file *bdb_file = db->db_descr;
+
+ if (bdb_file->dbc)
+ bdb_file->dbc->c_close (bdb_file->dbc);
+
if (bdb_file->db)
bdb_file->db->close (bdb_file->db, 0);
if (bdb_file->locker)
+
{
mu_locker_unlock (bdb_file->locker);
mu_locker_destroy (&bdb_file->locker);
@@ -293,8 +297,7 @@ _bdb_firstkey (mu_dbm_file_t db, struct mu_dbm_datum *ret)
if (!bdb_file->dbc)
{
- rc = bdb_file->db->cursor (bdb_file->db, NULL, &bdb_file->dbc
- BDB2_CURSOR_LASTARG);
+ rc = bdb_file->db->cursor (bdb_file->db, NULL, &bdb_file->dbc, 0);
if (rc)
{
db->db_errno.n = rc;
@@ -369,6 +372,18 @@ _bdb_nextkey (mu_dbm_file_t db, struct mu_dbm_datum *ret)
return rc;
}
+static int
+_bdb_break (mu_dbm_file_t mdb)
+{
+ struct bdb_file *bdb_file = mdb->db_descr;
+ if (bdb_file->dbc)
+ {
+ bdb_file->dbc->c_close (bdb_file->dbc);
+ bdb_file->dbc = NULL;
+ }
+ return 0;
+}
+
static void
_bdb_datum_free (struct mu_dbm_datum *datum)
{
@@ -393,6 +408,7 @@ struct mu_dbm_impl _mu_dbm_bdb = {
_bdb_firstkey,
_bdb_nextkey,
_bdb_datum_free,
- _bdb_strerror
+ _bdb_strerror,
+ _bdb_break
};
#endif

Return to:

Send suggestions and report system problems to the System administrator.