New kdb backend operation promote_db, makes a temporary database become the
authorKen Raeburn <raeburn@mit.edu>
Fri, 30 Jun 2006 03:51:48 +0000 (03:51 +0000)
committerKen Raeburn <raeburn@mit.edu>
Fri, 30 Jun 2006 03:51:48 +0000 (03:51 +0000)
live database.  New function krb5_db_promote invokes it.

ticket: 3964
status: open

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@18282 dc483132-0cff-0310-8789-dd5450dbe970

src/include/kdb.h
src/kadmin/dbutil/dump.c
src/lib/kdb/kdb5.c
src/lib/kdb/kdb5.h

index 694c6f1c73000f605b9be4b1b8016af52e65e0fa..d9fb61886e691b5bc9b884b3f3c01551ce9534af 100644 (file)
@@ -238,6 +238,7 @@ krb5_error_code kdb5_db_create ( krb5_context kcontext, char **db_args );
 krb5_error_code krb5_db_fini ( krb5_context kcontext );
 const char * krb5_db_errcode2string ( krb5_context kcontext, long err_code );
 krb5_error_code krb5_db_destroy ( krb5_context kcontext, char **db_args );
+krb5_error_code krb5_db_promote ( krb5_context kcontext, char **db_args );
 krb5_error_code krb5_db_get_age ( krb5_context kcontext, char *db_name, time_t *t );
 krb5_error_code krb5_db_set_option ( krb5_context kcontext, int option, void *value );
 krb5_error_code krb5_db_lock ( krb5_context kcontext, int lock_mode );
index f0d277c12280e25fe4b842914431b7c1bc1ecf5e..f491ae70f95d7569e47b068bba5c2df8418621de 100644 (file)
@@ -2224,7 +2224,8 @@ load_db(argc, argv)
 
     /*
      * Cons up params for the new databases.  If we are not in update
-     * mode, we dont create tmp file and then move it to final place. As it is dependent on DB type, this is not done
+     * mode, we create an alternate database and then promote it to
+     * be the live db.
      */
     newparams = global_params;
     if (! update) {
@@ -2238,6 +2239,11 @@ load_db(argc, argv)
              exit_status++;
              return;
         }
+
+        if (!add_db_arg("temporary")) {
+            com_err(progname, ENOMEM, "computing parameters for database");
+            exit(1);
+        }
     }
     
     /*
index 852fc85b76353048b2ec534cdeb1db9464e69908..46f0eeb8f85c2dc9869aed89f90cd998d8c8c108 100644 (file)
@@ -1890,3 +1890,43 @@ krb5_db_free_policy(krb5_context kcontext, osa_policy_ent_t policy)
   clean_n_exit:
     return;
 }
+
+krb5_error_code
+krb5_db_promote(krb5_context kcontext, char **db_args)
+{
+    krb5_error_code status = 0;
+    char   *section = NULL;
+    kdb5_dal_handle *dal_handle;
+
+    section = kdb_get_conf_section(kcontext);
+    if (section == NULL) {
+       status = KRB5_KDB_SERVER_INTERNAL_ERR;
+       krb5_set_error_message (kcontext, status,
+               "unable to determine configuration section for realm %s\n",
+               kcontext->default_realm);
+       goto clean_n_exit;
+    }
+
+    if (kcontext->db_context == NULL) {
+       status = kdb_setup_lib_handle(kcontext);
+       if (status) {
+           goto clean_n_exit;
+       }
+    }
+
+    dal_handle = (kdb5_dal_handle *) kcontext->db_context;
+    status = kdb_lock_lib_lock(dal_handle->lib_handle, FALSE);
+    if (status) {
+       goto clean_n_exit;
+    }
+
+    status =
+       dal_handle->lib_handle->vftabl.promote_db(kcontext, section, db_args);
+    kdb_unlock_lib_lock(dal_handle->lib_handle, FALSE);
+
+  clean_n_exit:
+    if (section)
+       free(section);
+    return status;
+}
+
index 39253496dd8abcb6ca21730244f034da20d7b42a..ae4b1c8b2ddced9f1109cc0c3ea5d46ae5dfd805 100644 (file)
@@ -170,6 +170,11 @@ typedef struct _kdb_vftabl{
                       krb5_boolean       keepold,
                       krb5_db_entry    * db_entry);
 
+    /* Promote a temporary database to be the live one.  */
+    krb5_error_code (*promote_db) (krb5_context context,
+                                  char *conf_section,
+                                  char **db_args);
+
 } kdb_vftabl;
 
 typedef struct _db_library {