pull up r18282 from trunk
authorTom Yu <tlyu@mit.edu>
Fri, 30 Jun 2006 23:11:07 +0000 (23:11 +0000)
committerTom Yu <tlyu@mit.edu>
Fri, 30 Jun 2006 23:11:07 +0000 (23:11 +0000)
 r18282@cathode-dark-space:  raeburn | 2006-06-29 23:51:48 -0400
 ticket: 3964
 status: open

 New kdb backend operation promote_db, makes a temporary database become the
 live database.  New function krb5_db_promote invokes it.

ticket: 3964
version_fixed: 1.5

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-5@18300 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 2ce811d0b5a9e053968044938e51a3c521e23e4d..b1f119808b4cce9a2c646f90f280689485e16ced 100644 (file)
@@ -2235,7 +2235,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) {
@@ -2249,6 +2250,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 9b6d1c70c1663a89fd8383a55f90b65ebdbff7b5..97e8c9ec1095d83baeb5e4eb8417c64b92bbe0cc 100644 (file)
@@ -176,6 +176,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 {