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; +}