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