summaryrefslogtreecommitdiff
path: root/lib/hdb/db3.c
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2022-03-28 17:02:13 +0000
committerCy Schubert <cy@FreeBSD.org>2022-03-28 17:02:13 +0000
commit49af073ed77202a54dfdd773cbcbbf7835c75baf (patch)
treeb180dbeab238a3d30b8d99d05c9cf0e30fbadd5a /lib/hdb/db3.c
parentd684f11da759490a8d98d7b790796106285f4084 (diff)
heimdal: Vendor import 7.7.0vendor/heimdal/7.7.0
Diffstat (limited to 'lib/hdb/db3.c')
-rw-r--r--lib/hdb/db3.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/lib/hdb/db3.c b/lib/hdb/db3.c
index cd2e33f067ad..0d41369d7101 100644
--- a/lib/hdb/db3.c
+++ b/lib/hdb/db3.c
@@ -54,6 +54,7 @@
typedef struct {
HDB hdb; /* generic members */
int lock_fd; /* DB3-specific */
+ int do_sync; /* DB3-specific */
} DB3_HDB;
@@ -92,6 +93,32 @@ DB_destroy(krb5_context context, HDB *db)
}
static krb5_error_code
+DB_set_sync(krb5_context context, HDB *db, int on)
+{
+ DB3_HDB *db3 = (DB3_HDB *)db;
+ DB *d = (DB*)db->hdb_db;
+ krb5_error_code ret = 0;
+
+ db3->do_sync = on;
+ if (on) {
+ ret = (*d->sync)(d, 0);
+ if (ret) {
+ if (ret == EACCES || ret == ENOSPC || ret == EINVAL) {
+ krb5_set_error_message(context, ret,
+ "Database %s put sync error: %s",
+ db->hdb_name, strerror(ret));
+ } else {
+ ret = HDB_ERR_UK_SERROR;
+ krb5_set_error_message(context, ret,
+ "Database %s put sync error: unknown (%d)",
+ db->hdb_name, ret);
+ }
+ }
+ }
+ return ret;
+}
+
+static krb5_error_code
DB_lock(krb5_context context, HDB *db, int operation)
{
@@ -220,6 +247,7 @@ static krb5_error_code
DB__put(krb5_context context, HDB *db, int replace,
krb5_data key, krb5_data value)
{
+ DB3_HDB *db3 = (DB3_HDB *)db;
DB *d = (DB*)db->hdb_db;
DBT k, v;
int code;
@@ -261,26 +289,13 @@ DB__put(krb5_context context, HDB *db, int replace,
}
return code;
}
- code = (*d->sync)(d, 0);
- if (code) {
- if (code == EACCES || code == ENOSPC || code == EINVAL) {
- krb5_set_error_message(context, code,
- "Database %s put sync error: %s",
- db->hdb_name, strerror(code));
- } else {
- code = HDB_ERR_UK_SERROR;
- krb5_set_error_message(context, code,
- "Database %s put sync error: unknown (%d)",
- db->hdb_name, code);
- }
- return code;
- }
- return 0;
+ return db->hdb_set_sync(context, db, db3->do_sync);
}
static krb5_error_code
DB__del(krb5_context context, HDB *db, krb5_data key)
{
+ DB3_HDB *db3 = (DB3_HDB *)db;
DB *d = (DB*)db->hdb_db;
DBT k;
krb5_error_code code;
@@ -304,21 +319,7 @@ DB__del(krb5_context context, HDB *db, krb5_data key)
}
return code;
}
- code = (*d->sync)(d, 0);
- if (code) {
- if (code == EACCES || code == ENOSPC || code == EINVAL) {
- krb5_set_error_message(context, code,
- "Database %s del sync error: %s",
- db->hdb_name, strerror(code));
- } else {
- code = HDB_ERR_UK_SERROR;
- krb5_set_error_message(context, code,
- "Database %s del sync error: unknown (%d)",
- db->hdb_name, code);
- }
- return code;
- }
- return 0;
+ return db->hdb_set_sync(context, db, db3->do_sync);
}
#define RD_CACHE_SZ 0x8000 /* Minimal read cache size */
@@ -485,6 +486,7 @@ hdb_db3_create(krb5_context context, HDB **db,
(*db)->hdb__put = DB__put;
(*db)->hdb__del = DB__del;
(*db)->hdb_destroy = DB_destroy;
+ (*db)->hdb_set_sync = DB_set_sync;
(*db3)->lock_fd = -1;
return 0;