svn commit: samba r15108 - in trunk/source: passdb tdb
vlendec at samba.org
vlendec at samba.org
Mon Apr 17 17:56:58 GMT 2006
Author: vlendec
Date: 2006-04-17 17:56:57 +0000 (Mon, 17 Apr 2006)
New Revision: 15108
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15108
Log:
Implement tdb_trans_store() and use it in secrets_store().
Tridge, did I use the transaction stuff right in tdb_trans_store?
Thanks,
Volker
Modified:
trunk/source/passdb/secrets.c
trunk/source/tdb/tdbutil.c
Changeset:
Modified: trunk/source/passdb/secrets.c
===================================================================
--- trunk/source/passdb/secrets.c 2006-04-17 17:16:46 UTC (rev 15107)
+++ trunk/source/passdb/secrets.c 2006-04-17 17:56:57 UTC (rev 15108)
@@ -104,8 +104,8 @@
secrets_init();
if (!tdb)
return False;
- return tdb_store(tdb, string_tdb_data(key), make_tdb_data(data, size),
- TDB_REPLACE) == 0;
+ return tdb_trans_store(tdb, string_tdb_data(key),
+ make_tdb_data(data, size), TDB_REPLACE) == 0;
}
Modified: trunk/source/tdb/tdbutil.c
===================================================================
--- trunk/source/tdb/tdbutil.c 2006-04-17 17:16:46 UTC (rev 15107)
+++ trunk/source/tdb/tdbutil.c 2006-04-17 17:56:57 UTC (rev 15108)
@@ -907,3 +907,32 @@
return tdb->flags;
}
+/****************************************************************************
+ tdb_store, wrapped in a transaction. This way we make sure that a process
+ that dies within writing does not leave a corrupt tdb behind.
+****************************************************************************/
+
+int tdb_trans_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf,
+ int flag)
+{
+ int res;
+
+ if ((res = tdb_transaction_start(tdb)) != 0) {
+ DEBUG(5, ("tdb_transaction_start failed\n"));
+ return res;
+ }
+
+ if ((res = tdb_store(tdb, key, dbuf, flag)) != 0) {
+ DEBUG(10, ("tdb_store failed\n"));
+ if (tdb_transaction_cancel(tdb) != 0) {
+ smb_panic("Cancelling transaction failed\n");
+ }
+ return res;
+ }
+
+ if ((res = tdb_transaction_commit(tdb)) != 0) {
+ DEBUG(5, ("tdb_transaction_commit failed\n"));
+ }
+
+ return res;
+}
More information about the samba-cvs
mailing list