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);