diff options
Diffstat (limited to 'lib/hdb/hdb-mitdb.c')
-rw-r--r-- | lib/hdb/hdb-mitdb.c | 43 |
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; } |