aboutsummaryrefslogtreecommitdiff
path: root/lib/hdb/hdb-mitdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hdb/hdb-mitdb.c')
-rw-r--r--lib/hdb/hdb-mitdb.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/lib/hdb/hdb-mitdb.c b/lib/hdb/hdb-mitdb.c
index 4e4fcdc58556..f3f8cf24c271 100644
--- a/lib/hdb/hdb-mitdb.c
+++ b/lib/hdb/hdb-mitdb.c
@@ -91,6 +91,11 @@ salt:
#include "hdb_locl.h"
+typedef struct MITDB {
+ HDB db; /* Generic */
+ int do_sync; /* MITDB-specific */
+} MITDB;
+
static void
attr_to_flags(unsigned attr, HDBFlags *flags)
{
@@ -698,6 +703,18 @@ mdb_destroy(krb5_context context, HDB *db)
}
static krb5_error_code
+mdb_set_sync(krb5_context context, HDB *db, int on)
+{
+ MITDB *mdb = (MITDB *)db;
+ DB *d = (DB*)db->hdb_db;
+
+ mdb->do_sync = on;
+ if (on)
+ return fsync((*d->fd)(d));
+ return 0;
+}
+
+static krb5_error_code
mdb_lock(krb5_context context, HDB *db, int operation)
{
DB *d = (DB*)db->hdb_db;
@@ -861,6 +878,7 @@ static krb5_error_code
mdb__put(krb5_context context, HDB *db, int replace,
krb5_data key, krb5_data value)
{
+ MITDB *mdb = (MITDB *)db;
DB *d = (DB*)db->hdb_db;
DBT k, v;
int code;
@@ -873,6 +891,11 @@ mdb__put(krb5_context context, HDB *db, int replace,
if(code)
return code;
code = (*d->put)(d, &k, &v, replace ? 0 : R_NOOVERWRITE);
+ if (code == 0) {
+ code = mdb_set_sync(context, db, mdb->do_sync);
+ db->hdb_unlock(context, db);
+ return code;
+ }
db->hdb_unlock(context, db);
if(code < 0) {
code = errno;
@@ -880,16 +903,14 @@ mdb__put(krb5_context context, HDB *db, int replace,
db->hdb_name, strerror(code));
return code;
}
- if(code == 1) {
- krb5_clear_error_message(context);
- return HDB_ERR_EXISTS;
- }
- return 0;
+ krb5_clear_error_message(context);
+ return HDB_ERR_EXISTS;
}
static krb5_error_code
mdb__del(krb5_context context, HDB *db, krb5_data key)
{
+ MITDB *mdb = (MITDB *)db;
DB *d = (DB*)db->hdb_db;
DBT k;
krb5_error_code code;
@@ -899,6 +920,11 @@ mdb__del(krb5_context context, HDB *db, krb5_data key)
if(code)
return code;
code = (*d->del)(d, &k, 0);
+ if (code == 0) {
+ code = mdb_set_sync(context, db, mdb->do_sync);
+ db->hdb_unlock(context, db);
+ return code;
+ }
db->hdb_unlock(context, db);
if(code == 1) {
code = errno;
@@ -1090,8 +1116,9 @@ krb5_error_code
hdb_mitdb_create(krb5_context context, HDB **db,
const char *filename)
{
- *db = calloc(1, sizeof(**db));
- if (*db == NULL) {
+ MITDB **mdb (MITDB **)db;
+ *mdb = calloc(1, sizeof(**mdb));
+ if (*mdb == NULL) {
krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
return ENOMEM;
}
@@ -1104,6 +1131,7 @@ hdb_mitdb_create(krb5_context context, HDB **db,
krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
return ENOMEM;
}
+ (*mdb)->do_sync = 1;
(*db)->hdb_master_key_set = 0;
(*db)->hdb_openp = 0;
(*db)->hdb_capability_flags = 0;
@@ -1121,6 +1149,7 @@ hdb_mitdb_create(krb5_context context, HDB **db,
(*db)->hdb__put = mdb__put;
(*db)->hdb__del = mdb__del;
(*db)->hdb_destroy = mdb_destroy;
+ (*db)->hdb_set_sync = mdb_set_sync;
return 0;
}