Cdiff kdb_db2.c
--- /net/etna.eng/build7/semery/mit2/webrev/usr/src/lib/krb5/kdb/kdb_db2.c-     Wed Sep  8 17:00:10 2004
+++ kdb_db2.c   Wed Sep  8 13:40:54 2004
@@ -1,11 +1,11 @@
 /*
  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident  "@(#)kdb_db2.c  1.4     04/09/08 SMI"
+#pragma ident  "@(#)kdb_db2.c  1.3     04/02/20 SMI"
 
 /*
  * lib/kdb/kdb_db2.c
  *
  * Copyright 1997 by the Massachusetts Institute of Technology.
@@ -61,10 +61,11 @@
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
 #include "k5-int.h"
+#include "kdb_log.h"
 #include <db.h>
 #include <stdio.h>
 #include <errno.h>
 #include <utime.h>
 
@@ -985,28 +986,66 @@
     DB *db;
     DBT key, contents;
     krb5_data contdata, keydata;
     krb5_error_code retval;
     krb5_db2_context *db_ctx;
+    kdb_incr_update_t *upd, *fupd;
+    char *princ_name = NULL;
+    kdb_log_context *log_ctx;
 
+    log_ctx = context->kdblog_context;
+
     n = *nentries;
     *nentries = 0;
     if (!k5db2_inited(context))
        return KRB5_KDB_DBNOTINITED;
 
     db_ctx = (krb5_db2_context *) context->db_context;
-    if ((retval = krb5_db2_db_lock(context, KRB5_LOCKMODE_EXCLUSIVE)))
+    if ((retval = krb5_db2_db_lock(context, KRB5_LOCKMODE_EXCLUSIVE))) {
        return retval;
+    }
 
+    /*
+     * We need the lock since ulog_conv_2logentry() does a get
+     */
+    if (log_ctx && (log_ctx->iproprole == IPROP_MASTER)) {
+       if (!(upd = (kdb_incr_update_t *)
+         malloc(sizeof (kdb_incr_update_t)*n))) {
+           retval = errno;
+           goto err_lock;
+       }
+       fupd = upd;
+
+       (void) memset(upd, 0, sizeof(kdb_incr_update_t)*n);
+
+        if ((retval = ulog_conv_2logentry(context, entries, upd, n))) {
+           goto err_lock;
+       }
+    }
+
     db = db_ctx->db;
     if ((retval = krb5_db2_db_start_update(context))) {
-        (void)krb5_db2_db_unlock(context);
-       return retval;
+       goto err_lock;
     }
 
     /* for each one, stuff temps, and do replace/append */
     for (i = 0; i < n; i++) {
+       /*
+        * We'll be sharing the same locks as db for logging
+        */
+        if (log_ctx && (log_ctx->iproprole == IPROP_MASTER)) {
+               if ((retval = krb5_unparse_name(context, entries->princ,
+                   &princ_name)))
+                       goto err_lock;
+
+               upd->kdb_princ_name.utf8str_t_val = princ_name;
+               upd->kdb_princ_name.utf8str_t_len = strlen(princ_name);
+
+                if (retval = ulog_add_update(context, upd))
+                       goto err_lock;
+        }
+
        retval = krb5_encode_princ_contents(context, &contdata, entries);
        if (retval)
            break;
        contents.data = contdata.data;
        contents.size = contdata.length;
@@ -1022,15 +1061,34 @@
        retval = dbret ? errno : 0;
        krb5_free_data_contents(context, &keydata);
        krb5_free_data_contents(context, &contdata);
        if (retval)
            break;
+       else if (log_ctx && (log_ctx->iproprole == IPROP_MASTER)) {
+           /*
+            * We need to make sure the db record is synced before we mark
+            * it as committed via finish_update.
+            */
+           dbret = (*db->sync)(db, 0);
+           if (dbret) {
+               retval = errno;
+               goto err_lock;
+           }
+           (void) ulog_finish_update(context, upd);
+           upd++;
+       }
        entries++;                      /* bump to next struct */
     }
 
     (void)krb5_db2_db_end_update(context);
+
+err_lock:
     (void)krb5_db2_db_unlock(context);         /* unlock database */
+
+    if (log_ctx && (log_ctx->iproprole == IPROP_MASTER))
+        ulog_free_entries(fupd, n);
+
     *nentries = i;
     return(retval);
 }
 
 /*
@@ -1049,11 +1107,16 @@
     krb5_db2_context *db_ctx;
     DB *db;
     DBT key, contents;
     krb5_data keydata, contdata;
     int i, dbret;
+    kdb_incr_update_t upd;
+    char *princ_name = NULL;
+    kdb_log_context *log_ctx;
 
+    log_ctx = context->kdblog_context;
+
     if (!k5db2_inited(context))
        return KRB5_KDB_DBNOTINITED;
 
     db_ctx = (krb5_db2_context *) context->db_context;
     if ((retval = krb5_db2_db_lock(context, KRB5_LOCKMODE_EXCLUSIVE)))
@@ -1080,10 +1143,34 @@
        *nentries = 0;
        goto cleankey;
     case 0:
        ;
     }
+
+    /*
+     * We'll be sharing the same locks as db for logging
+     */
+    if (log_ctx && (log_ctx->iproprole == IPROP_MASTER)) {
+       if ((retval = krb5_unparse_name(context, searchfor, &princ_name))) {
+               (void) krb5_db2_db_unlock(context);
+               return retval;
+       }
+
+       (void) memset(&upd, 0, sizeof (kdb_incr_update_t));
+
+       upd.kdb_princ_name.utf8str_t_val = princ_name;
+       upd.kdb_princ_name.utf8str_t_len = strlen(princ_name);
+
+       if (retval = ulog_delete_update(context, &upd)) {
+               free(princ_name);
+               (void) krb5_db2_db_unlock(context);
+               return retval;
+       }
+
+       free(princ_name);
+    }
+
     memset((char *)&entry, 0, sizeof(entry));
     contdata.data = contents.data;
     contdata.length = contents.size;
     retval = krb5_decode_princ_contents(context, &contdata, &entry);
     if (retval)
@@ -1110,10 +1197,18 @@
     krb5_free_data_contents(context, &contdata);
     if (retval)
        goto cleankey;
     dbret = (*db->del)(db, &key, 0);
     retval = dbret ? errno : 0;
+
+    /*
+     * We need to commit our update upon success
+     */
+    if (!retval)
+       if (log_ctx && (log_ctx->iproprole == IPROP_MASTER))
+               (void) ulog_finish_update(context, &upd);
+
 cleankey:
     krb5_free_data_contents(context, &keydata);
 
 cleanup:
     (void) krb5_db2_db_end_update(context);