diff options
Diffstat (limited to 'src/lib/kadm5/srv/adb_openclose.c')
-rw-r--r-- | src/lib/kadm5/srv/adb_openclose.c | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/src/lib/kadm5/srv/adb_openclose.c b/src/lib/kadm5/srv/adb_openclose.c index 627a6b410..0417be53b 100644 --- a/src/lib/kadm5/srv/adb_openclose.c +++ b/src/lib/kadm5/srv/adb_openclose.c @@ -28,11 +28,6 @@ osa_adb_ret_t osa_adb_create_db(char *filename, char *lockfilename, DB *db; HASHINFO info; - lf = fopen(lockfilename, "w+"); - if (lf == NULL) - return errno; - (void) fclose(lf); - memset(&info, 0, sizeof(info)); info.hash = NULL; info.bsize = 256; @@ -44,6 +39,13 @@ osa_adb_ret_t osa_adb_create_db(char *filename, char *lockfilename, return errno; if (db->close(db) < 0) return errno; + + /* only create the lock file if we successfully created the db */ + lf = fopen(lockfilename, "w+"); + if (lf == NULL) + return errno; + (void) fclose(lf); + return OSA_ADB_OK; } @@ -57,6 +59,48 @@ osa_adb_ret_t osa_adb_destroy_db(char *filename, char *lockfilename, return OSA_ADB_OK; } +osa_adb_ret_t osa_adb_rename_db(char *filefrom, char *lockfrom, + char *fileto, char *lockto, int magic) +{ + osa_adb_db_t fromdb, todb; + osa_adb_ret_t ret; + + if (ret = osa_adb_init_db(&fromdb, filefrom, lockfrom, magic)) + return ret; + if (ret = osa_adb_init_db(&todb, fileto, lockto, magic)) { + (void) osa_adb_fini_db(fromdb, magic); + return ret; + } + if (ret = osa_adb_get_lock(fromdb, OSA_ADB_PERMANENT)) { + (void) osa_adb_fini_db(fromdb, magic); + (void) osa_adb_fini_db(todb, magic); + return ret; + } + if (ret = osa_adb_get_lock(todb, OSA_ADB_PERMANENT)) { + (void) osa_adb_fini_db(fromdb, magic); + (void) osa_adb_fini_db(todb, magic); + return ret; + } + if (rename(filefrom, fileto) < 0) { + (void) osa_adb_fini_db(fromdb, magic); + (void) osa_adb_fini_db(todb, magic); + return errno; + } + /* + * Do not release the lock on fromdb because it is being renamed + * out of existence; no one can ever use it again. + */ + if (ret = osa_adb_release_lock(todb)) { + (void) osa_adb_fini_db(fromdb, magic); + (void) osa_adb_fini_db(todb, magic); + return ret; + } + + (void) osa_adb_fini_db(fromdb, magic); + (void) osa_adb_fini_db(todb, magic); + return 0; +} + osa_adb_ret_t osa_adb_init_db(osa_adb_db_t *dbp, char *filename, char *lockfilename, int magic) { |