summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2011-01-08 11:51:17 +0100
committerVolker Lendecke <vlendec@samba.org>2011-01-08 12:39:09 +0100
commit61b2ac91210a1d34f47cb480c222b9ae64546180 (patch)
treef415b147fcddaacd9967c4017e2f20584561d63c
parent849816d0dfa18dad6b972f349c2f1d27e5a70a32 (diff)
downloadsamba-61b2ac91210a1d34f47cb480c222b9ae64546180.tar.gz
samba-61b2ac91210a1d34f47cb480c222b9ae64546180.tar.bz2
samba-61b2ac91210a1d34f47cb480c222b9ae64546180.zip
s3: Avoid a ton of registry writes at startup
Autobuild-User: Volker Lendecke <vlendec@samba.org> Autobuild-Date: Sat Jan 8 12:39:09 CET 2011 on sn-devel-104
-rw-r--r--source3/services/services_db.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/source3/services/services_db.c b/source3/services/services_db.c
index ca375d22d4..03f7951b7c 100644
--- a/source3/services/services_db.c
+++ b/source3/services/services_db.c
@@ -270,6 +270,24 @@ static WERROR svcctl_setvalue(struct registry_key *key,
struct registry_value *value)
{
WERROR wresult;
+ struct registry_value *existing;
+
+ wresult = reg_queryvalue(talloc_tos(), key, name, &existing);
+ if (W_ERROR_IS_OK(wresult)) {
+ bool exists;
+
+ exists = ((value->type == existing->type) &&
+ (data_blob_cmp(&value->data, &existing->data) == 0));
+
+ TALLOC_FREE(existing);
+
+ if (exists) {
+ /*
+ * Avoid an expensive write when not necessary
+ */
+ return WERR_OK;
+ }
+ }
wresult = reg_setvalue(key, name, value);
if (!W_ERROR_IS_OK(wresult)) {