[SCM] Samba Shared Repository - branch master updated

Michael Adam obnox at samba.org
Mon Sep 20 22:54:12 MDT 2010


The branch, master has been updated
       via  08cf13a s3:registry: remove now (finally) obsolete reg_util_registry.{c,h}
       via  7f1efa6 s3:services_db: does not need legacy registry code any more.
       via  8df2ab9 s3:services_db: rewrite svcctl_init_keys() to use reg_api calls instead of legacy
       via  a6f0f91 s3:services_db: extract core of svcctl_set_secdesc to _internal version
       via  f2a4d55 s3:services_db: create the "Security" subkey if it does not exist in svcctl_set_secdesc()
       via  8be007d s3:services_db: remove bogus comments
       via  5fe2abb s3:services_db: remove unused legacy function svcctl_fetch_regvalues().
       via  e869af9 s3:rpc_server:ntsvcs: registry is not directly used an more.
       via  d760e54 s3:rpc_server:ntsvcs: use svcctl_lookup_dispname instead of legacy svcctl in _PNP_GetDeviceRegProp
       via  4cee4bb s3:rpc_server: registry is not direclty used in the svcctl server any more
       via  3cab109 s3:srv_ntsvcs_nt: make fill_svc_config() use svcctl_get_string_value()
       via  3c85a9f s3:services_db: publish svcctl_get_string_value()
       via  e28bc8d s3:services_db: factor out common code of lookup_dispname and lookup_description
       via  53dcbc2 s3:services_db: change svcctl_lookup_description() to use reg_api functions
       via  9fee033 s3:services_db: rewrite svcctl_lookup_description() to use a tmp talloc ctx
       via  464515c s3:services_db: change svcctl_lookup_dispname() to use reg_api functions
       via  e464ca9 s3:services_db: make svcctl_lookup_dispname() use a temp talloc ctx
       via  a4b1042 s3:services_db: change svcctl_get_secdesc() to use reg_api functions
       via  4fc2b5c s3:services_db: use temp talloc ctx in svcctl_get_secdesc()
       via  9bfd587 s3:services_db: remove the TALLOC_CTX argument from svcctl_set_secdesc
       via  91d5446 s3:services_db: fix a debug message
       via  d2794b0 s3:services_db: rewrite svcctl_set_secdesc to use tmp talloc ctx
       via  7cefb89 s3:services_db: rewrite svcctl_set_secdesc() using reg_api calls instead of legacy
       via  f53c17b s3:services_db: untanlge assignments from check in read_init_file().
       via  a67a553 s3:services_db: untangle assignments from check in construct_service_sd().
      from  7ffcf90 s4-drepl: use the partition UDV and hwm for extended getncchanges ops

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 08cf13a3df212bd421275f61e2db146752490c7d
Author: Michael Adam <obnox at samba.org>
Date:   Tue Sep 21 06:51:38 2010 +0200

    s3:registry: remove now (finally) obsolete reg_util_registry.{c,h}

commit 7f1efa6ea25eba0c0829131758746ac0c2ab9e42
Author: Michael Adam <obnox at samba.org>
Date:   Tue Sep 21 06:49:40 2010 +0200

    s3:services_db: does not need legacy registry code any more.

commit 8df2ab974689c585f19b5a0de40a80245d12639d
Author: Michael Adam <obnox at samba.org>
Date:   Tue Sep 21 06:48:19 2010 +0200

    s3:services_db: rewrite svcctl_init_keys() to use reg_api calls instead of legacy

commit a6f0f912cc461dcca2b34242327c6fc82d6ff849
Author: Michael Adam <obnox at samba.org>
Date:   Tue Sep 21 03:11:43 2010 +0200

    s3:services_db: extract core of svcctl_set_secdesc to _internal version
    
    The internal version operates on an already opened key.

commit f2a4d5536b68f344edab717c4e6dfbef15523499
Author: Michael Adam <obnox at samba.org>
Date:   Tue Sep 21 03:00:29 2010 +0200

    s3:services_db: create the "Security" subkey if it does not exist in svcctl_set_secdesc()
    
    Windows behaves like this. - Tests will follow.

commit 8be007dbb0c10a0755a87639eccabd7f5cdd05b3
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 11:24:36 2010 +0200

    s3:services_db: remove bogus comments
    
    (from copy and paste probably...)

commit 5fe2abb2f85afe2e8655257446c7dd03a08b2d57
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 11:20:37 2010 +0200

    s3:services_db: remove unused legacy function svcctl_fetch_regvalues().

commit e869af9e0e6e460d8ae225310f58f458e094e86f
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 11:18:33 2010 +0200

    s3:rpc_server:ntsvcs: registry is not directly used an more.

commit d760e543a1340a2166a43f83b27b5a4a6a39dfcf
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 11:17:38 2010 +0200

    s3:rpc_server:ntsvcs: use svcctl_lookup_dispname instead of legacy svcctl in _PNP_GetDeviceRegProp

commit 4cee4bbd02cdd0e4bc458378016621948e58d47c
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 10:57:53 2010 +0200

    s3:rpc_server: registry is not direclty used in the svcctl server any more

commit 3cab10975464a6f67c1728301ffc0264fb1763e0
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 10:30:30 2010 +0200

    s3:srv_ntsvcs_nt: make fill_svc_config() use svcctl_get_string_value()
    
    instead of using legacy svcctl_fetch_regvalues()

commit 3c85a9fcbe56aadc6a50706d253d7d010cf91c63
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 10:27:56 2010 +0200

    s3:services_db: publish svcctl_get_string_value()

commit e28bc8d763978762480367d031a4a62ebd411f8a
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 08:06:30 2010 +0200

    s3:services_db: factor out common code of lookup_dispname and lookup_description
    
    into a new function svcctl_get_string_value()

commit 53dcbc2dd2705c5273163c757e2587e3596c6971
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 06:19:57 2010 +0200

    s3:services_db: change svcctl_lookup_description() to use reg_api functions

commit 9fee03365621cca011da4521d98f1e1aa2882278
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 06:03:58 2010 +0200

    s3:services_db: rewrite svcctl_lookup_description() to use a tmp talloc ctx
    
    Also remove a possible memory by tallocing the result string
    also in a default case, where a string constant was returned before.

commit 464515cd610b5ee3862d8bc8558cd698d4f7258e
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 08:11:07 2010 +0200

    s3:services_db: change svcctl_lookup_dispname() to use reg_api functions

commit e464ca9f311e3becd5f88f41fa7a95520fe6fbc3
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 04:58:27 2010 +0200

    s3:services_db: make svcctl_lookup_dispname() use a temp talloc ctx

commit a4b1042f33b505dcb51ac25bf84a597d98fa9d4b
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 04:41:59 2010 +0200

    s3:services_db: change svcctl_get_secdesc() to use reg_api functions

commit 4fc2b5c40e63579c2fe4e95bdbaa31108f2b3475
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 04:12:42 2010 +0200

    s3:services_db: use temp talloc ctx in svcctl_get_secdesc()

commit 9bfd587358fb58b98dd0fbdd72069430a89cefc7
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 03:38:45 2010 +0200

    s3:services_db: remove the TALLOC_CTX argument from svcctl_set_secdesc

commit 91d5446390dc41b43fe18785a765bbd71ff709c2
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 03:36:23 2010 +0200

    s3:services_db: fix a debug message

commit d2794b05a6b8be40ebde4a47b9c03008242b1c46
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 03:34:49 2010 +0200

    s3:services_db: rewrite svcctl_set_secdesc to use tmp talloc ctx
    
    and add a common exit point

commit 7cefb898729bc46e1ba9fd1c8b48e7aef0486339
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 02:43:33 2010 +0200

    s3:services_db: rewrite svcctl_set_secdesc() using reg_api calls instead of legacy

commit f53c17b4ff27c39fbeccce4d369f4bb8f1b13ce7
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 00:46:59 2010 +0200

    s3:services_db: untanlge assignments from check in read_init_file().

commit a67a553f40833a182b89a058d59015bcf19640f0
Author: Michael Adam <obnox at samba.org>
Date:   Mon Sep 20 00:40:44 2010 +0200

    s3:services_db: untangle assignments from check in construct_service_sd().

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in                |    3 +-
 source3/include/proto.h            |    7 +-
 source3/registry/reg_util_legacy.c |   52 ----
 source3/registry/reg_util_legacy.h |   45 ---
 source3/rpc_server/srv_ntsvcs_nt.c |   32 +-
 source3/rpc_server/srv_svcctl_nt.c |   31 +--
 source3/services/services_db.c     |  571 ++++++++++++++++--------------------
 7 files changed, 294 insertions(+), 447 deletions(-)
 delete mode 100644 source3/registry/reg_util_legacy.c
 delete mode 100644 source3/registry/reg_util_legacy.h


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index b7dfc6e..c72a6c3 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -657,8 +657,7 @@ REG_FULL_OBJ = $(REG_SMBCONF_OBJ) \
 	       $(REG_INIT_FULL_OBJ) \
 	       registry/reg_eventlog.o \
 	       registry/reg_perfcount.o \
-	       librpc/gen_ndr/ndr_perfcount.o \
-	       registry/reg_util_legacy.o
+	       librpc/gen_ndr/ndr_perfcount.o
 
 LIB_EVENTLOG_OBJ = lib/eventlog/eventlog.o
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index d7b9cb0..3349e02 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4397,10 +4397,13 @@ bool init_service_op_table( void );
 
 void svcctl_init_keys( void );
 struct security_descriptor *svcctl_get_secdesc( TALLOC_CTX *ctx, const char *name, struct security_token *token );
-bool svcctl_set_secdesc( TALLOC_CTX *ctx, const char *name, struct security_descriptor *sec_desc, struct security_token *token );
+bool svcctl_set_secdesc(const char *name, struct security_descriptor *sec_desc,
+			struct security_token *token);
+const char *svcctl_get_string_value(TALLOC_CTX *ctx, const char *key_name,
+				    const char *value_name,
+				    struct security_token *token);
 const char *svcctl_lookup_dispname(TALLOC_CTX *ctx, const char *name, struct security_token *token );
 const char *svcctl_lookup_description(TALLOC_CTX *ctx, const char *name, struct security_token *token );
-struct regval_ctr *svcctl_fetch_regvalues( const char *name, struct security_token *token );
 
 /* The following definitions come from services/svc_netlogon.c  */
 
diff --git a/source3/registry/reg_util_legacy.c b/source3/registry/reg_util_legacy.c
deleted file mode 100644
index 29b0889..0000000
--- a/source3/registry/reg_util_legacy.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* 
- *  Unix SMB/CIFS implementation.
- *  Virtual Windows Registry Layer
- *  Copyright (C) Gerald Carter                     2002-2005
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *  
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *  
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-/* Implementation of registry frontend view functions. */
-
-#include "includes.h"
-#include "registry.h"
-#include "reg_util_legacy.h"
-#include "reg_api_util.h"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_REGISTRY
-
-/**
- * legacy open key function that should be replaced by uses of
- * reg_open_path
- */
-WERROR regkey_open_internal(TALLOC_CTX *ctx,
-			    struct registry_key_handle **regkey,
-			    const char *path,
-			    const struct security_token *token,
-			    uint32 access_desired )
-{
-	struct registry_key *key;
-	WERROR err;
-	TALLOC_CTX *tmp_ctx = talloc_stackframe();
-
-	err = reg_open_path(tmp_ctx, path, access_desired, token, &key);
-	if (!W_ERROR_IS_OK(err)) {
-		return err;
-	}
-
-	*regkey = talloc_move(ctx, &key->key);
-	TALLOC_FREE(tmp_ctx);
-	return WERR_OK;
-}
diff --git a/source3/registry/reg_util_legacy.h b/source3/registry/reg_util_legacy.h
deleted file mode 100644
index d0cb626..0000000
--- a/source3/registry/reg_util_legacy.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* 
- *  Unix SMB/CIFS implementation.
- *  Virtual Windows Registry Layer
- *  Copyright (C) Gerald Carter                     2002-2005
- *  Copyright (C) Michael Adam                      2009
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *  
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *  
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _REG_UTIL_LEGACY_H
-#define _REG_UTIL_LEGACY_H
-
-/*
- * This module contains legacy code code from the old regkey
- * interface that is now mostly hidden behind the reg_api interface.
- * This code should be removed once the last users of the old code
- * have been converted.
- */
-
-#include "includes.h"
-#include "registry.h"
-
-/**
- * legacy open key function that should be replaced by uses of
- * reg_open_path
- */
-
-WERROR regkey_open_internal(TALLOC_CTX *ctx,
-			    struct registry_key_handle **regkey,
-			    const char *path,
-			    const struct security_token *token,
-			    uint32 access_desired );
-
-#endif /* _REG_UTIL_LEGACY_H */
diff --git a/source3/rpc_server/srv_ntsvcs_nt.c b/source3/rpc_server/srv_ntsvcs_nt.c
index aed9a53..a948b86 100644
--- a/source3/rpc_server/srv_ntsvcs_nt.c
+++ b/source3/rpc_server/srv_ntsvcs_nt.c
@@ -21,8 +21,6 @@
 
 #include "includes.h"
 #include "../librpc/gen_ndr/srv_ntsvcs.h"
-#include "registry.h"
-#include "registry/reg_objects.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
@@ -125,8 +123,9 @@ WERROR _PNP_GetDeviceRegProp(struct pipes_struct *p,
 			     struct PNP_GetDeviceRegProp *r)
 {
 	char *ptr;
-	struct regval_ctr *values;
-	struct regval_blob *val;
+	const char *result;
+	DATA_BLOB blob;
+	TALLOC_CTX *mem_ctx = NULL;
 
 	switch( r->in.property ) {
 	case DEV_REGPROP_DESC:
@@ -141,31 +140,34 @@ WERROR _PNP_GetDeviceRegProp(struct pipes_struct *p,
 			return WERR_GENERAL_FAILURE;
 		ptr++;
 
-		if ( !(values = svcctl_fetch_regvalues(
-			       ptr, p->server_info->ptok)))
+		mem_ctx = talloc_stackframe();
+
+		result = svcctl_lookup_dispname(mem_ctx, ptr, p->server_info->ptok);
+		if (result == NULL) {
 			return WERR_GENERAL_FAILURE;
+		}
 
-		if ( !(val = regval_ctr_getvalue( values, "DisplayName" )) ) {
-			TALLOC_FREE( values );
+		if (!push_reg_sz(mem_ctx, &blob, result)) {
+			talloc_free(mem_ctx);
 			return WERR_GENERAL_FAILURE;
 		}
 
-		if (*r->in.buffer_size < regval_size(val)) {
-			*r->out.needed = regval_size(val);
+		if (*r->in.buffer_size < blob.length) {
+			*r->out.needed = blob.length;
 			*r->out.buffer_size = 0;
-			TALLOC_FREE( values );
+			talloc_free(mem_ctx);
 			return WERR_CM_BUFFER_SMALL;
 		}
 
-		r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, regval_data_p(val), regval_size(val));
-		TALLOC_FREE(values);
+		r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, blob.data, blob.length);
+		talloc_free(mem_ctx);
 		if (!r->out.buffer) {
 			return WERR_NOMEM;
 		}
 
 		*r->out.reg_data_type = REG_SZ;	/* always 1...tested using a remove device manager connection */
-		*r->out.buffer_size = regval_size(val);
-		*r->out.needed = regval_size(val);
+		*r->out.buffer_size = blob.length;
+		*r->out.needed = blob.length;
 
 		break;
 
diff --git a/source3/rpc_server/srv_svcctl_nt.c b/source3/rpc_server/srv_svcctl_nt.c
index e55978c..6c74ade 100644
--- a/source3/rpc_server/srv_svcctl_nt.c
+++ b/source3/rpc_server/srv_svcctl_nt.c
@@ -25,8 +25,6 @@
 #include "includes.h"
 #include "../librpc/gen_ndr/srv_svcctl.h"
 #include "services/services.h"
-#include "registry.h"
-#include "registry/reg_objects.h"
 #include "../librpc/gen_ndr/ndr_security.h"
 
 #undef DBGC_CLASS
@@ -644,27 +642,21 @@ static WERROR fill_svc_config( TALLOC_CTX *ctx, const char *name,
 			       struct QUERY_SERVICE_CONFIG *config,
 			       struct security_token *token )
 {
-	struct regval_ctr *values;
-	struct regval_blob *val;
-
-	/* retrieve the registry values for this service */
-
-	if ( !(values = svcctl_fetch_regvalues( name, token )) )
-		return WERR_REG_CORRUPT;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
+	const char *result = NULL;
 
 	/* now fill in the individual values */
 
-	if ( (val = regval_ctr_getvalue( values, "DisplayName" )) != NULL )
-		config->displayname = regval_sz(val);
-	else
-		config->displayname = name;
+	config->displayname = svcctl_lookup_dispname(mem_ctx, name, token);
 
-	if ( (val = regval_ctr_getvalue( values, "ObjectName" )) != NULL ) {
-		config->startname = regval_sz(val);
+	result = svcctl_get_string_value(mem_ctx, name, "ObjectName", token);
+	if (result != NULL) {
+		config->startname = result;
 	}
 
-	if ( (val = regval_ctr_getvalue( values, "ImagePath" )) != NULL ) {
-		config->executablepath = regval_sz(val);
+	result = svcctl_get_string_value(mem_ctx, name, "ImagePath", token);
+	if (result != NULL) {
+		config->executablepath = result;
 	}
 
 	/* a few hard coded values */
@@ -686,7 +678,7 @@ static WERROR fill_svc_config( TALLOC_CTX *ctx, const char *name,
 		config->start_type = SVCCTL_DEMAND_START;
 
 
-	TALLOC_FREE( values );
+	talloc_free(mem_ctx);
 
 	return WERR_OK;
 }
@@ -956,8 +948,7 @@ WERROR _svcctl_SetServiceObjectSecurity(struct pipes_struct *p,
 
 	/* store the new SD */
 
-	if ( !svcctl_set_secdesc( p->mem_ctx, info->name, sec_desc,
-				  p->server_info->ptok) )
+	if (!svcctl_set_secdesc(info->name, sec_desc, p->server_info->ptok))
 		return WERR_ACCESS_DENIED;
 
 	return WERR_OK;
diff --git a/source3/services/services_db.c b/source3/services/services_db.c
index 0afc6c1..6d361c7 100644
--- a/source3/services/services_db.c
+++ b/source3/services/services_db.c
@@ -23,9 +23,7 @@
 #include "includes.h"
 #include "services/services.h"
 #include "registry.h"
-#include "registry/reg_util_legacy.h"
-#include "registry/reg_dispatcher.h"
-#include "registry/reg_objects.h"
+#include "registry/reg_api_util.h"
 
 struct rcinit_file_information {
 	char *description;
@@ -87,6 +85,8 @@ struct service_display_info common_unix_svcs[] = {
   { NULL, NULL, NULL, NULL }
 };
 
+static WERROR svcctl_set_secdesc_internal(struct registry_key *key,
+					  struct security_descriptor *sec_desc);
 
 /********************************************************************
 ********************************************************************/
@@ -114,13 +114,17 @@ static struct security_descriptor* construct_service_sd( TALLOC_CTX *ctx )
 
 	/* create the security descriptor */
 
-	if ( !(theacl = make_sec_acl(ctx, NT4_ACL_REVISION, i, ace)) )
+	theacl = make_sec_acl(ctx, NT4_ACL_REVISION, i, ace);
+	if (theacl == NULL) {
 		return NULL;
+	}
 
-	if ( !(sd = make_sec_desc(ctx, SECURITY_DESCRIPTOR_REVISION_1,
-				  SEC_DESC_SELF_RELATIVE, NULL, NULL, NULL,
-				  theacl, &sd_size)) )
+	sd = make_sec_desc(ctx, SECURITY_DESCRIPTOR_REVISION_1,
+			   SEC_DESC_SELF_RELATIVE, NULL, NULL, NULL,
+			   theacl, &sd_size);
+	if (sd == NULL) {
 		return NULL;
+	}
 
 	return sd;
 }
@@ -199,8 +203,10 @@ static bool read_init_file( const char *servicename, struct rcinit_file_informat
 	XFILE *f = NULL;
 	char *p = NULL;
 
-	if ( !(info = TALLOC_ZERO_P( NULL, struct rcinit_file_information ) ) )
+	info = TALLOC_ZERO_P( NULL, struct rcinit_file_information );
+	if (info == NULL) {
 		return False;
+	}
 
 	/* attempt the file open */
 
@@ -210,7 +216,8 @@ static bool read_init_file( const char *servicename, struct rcinit_file_informat
 		TALLOC_FREE(info);
 		return false;
 	}
-	if (!(f = x_fopen( filepath, O_RDONLY, 0 ))) {
+	f = x_fopen( filepath, O_RDONLY, 0 );
+	if (f == NULL) {
 		DEBUG(0,("read_init_file: failed to open [%s]\n", filepath));
 		TALLOC_FREE(info);
 		return false;
@@ -225,14 +232,16 @@ static bool read_init_file( const char *servicename, struct rcinit_file_informat
 
 		/* Look for a line like '^#.*Description:' */
 
-		if ( (p = strstr( str, "Description:" )) != NULL ) {
+		p = strstr( str, "Description:" );
+		if (p != NULL) {
 			char *desc;
 
 			p += strlen( "Description:" ) + 1;
 			if ( !p )
 				break;
 
-			if ( (desc = cleanup_string(p)) != NULL )
+			desc = cleanup_string(p);
+			if (desc != NULL)
 				info->description = talloc_strdup( info, desc );
 		}
 	}
@@ -253,37 +262,105 @@ static bool read_init_file( const char *servicename, struct rcinit_file_informat
  Display name, Description, etc...
 ********************************************************************/
 
-static void fill_service_values(const char *name, struct regval_ctr *values)
+static WERROR svcctl_setvalue(struct registry_key *key,
+			      const char *name,
+			      struct registry_value *value)
+{
+	WERROR wresult;
+
+	wresult = reg_setvalue(key, name, value);
+	if (!W_ERROR_IS_OK(wresult)) {
+		DEBUG(0, ("reg_setvalue failed for %s in key %s: %s\n",
+			  name, key->key->name, win_errstr(wresult)));
+	}
+
+	return wresult;
+}
+
+static WERROR svcctl_setvalue_dword(struct registry_key *key,
+				    const char *name,
+				    uint32_t dword)
+{
+	struct registry_value value;
+
+	value.type = REG_DWORD;
+	value.data.length = sizeof(uint32_t);
+	value.data.data = (uint8_t *)&dword;
+
+	return svcctl_setvalue(key, name, &value);
+}
+
+static WERROR svcctl_setvalue_sz(struct registry_key *key,
+				 const char *name,
+				 const char *sz)
+{
+	struct registry_value value;
+	WERROR wresult;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
+
+	if (!push_reg_sz(mem_ctx, &value.data, sz)) {
+		DEBUG(0, ("push_reg_sz failed\n"));
+		wresult = WERR_NOMEM;
+		goto done;
+	}
+	value.type = REG_SZ;
+
+	wresult = svcctl_setvalue(key, name, &value);
+done:
+	talloc_free(mem_ctx);
+	return wresult;
+}
+
+static void fill_service_values(struct registry_key *key)
 {
 	char *dname, *ipath, *description;
-	uint32 dword;
 	int i;
+	WERROR wresult;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
+	char *name = NULL;
+
+	name = strrchr(key->key->name, '\\');
+	if (name == NULL) {
+		name = key->key->name;
+	} else {
+		name++;
+	}
 
 	/* These values are hardcoded in all QueryServiceConfig() replies.
 	   I'm just storing them here for cosmetic purposes */
 
-	dword = SVCCTL_AUTO_START;
-	regval_ctr_addvalue( values, "Start", REG_DWORD, (uint8 *)&dword, sizeof(uint32));
+	wresult = svcctl_setvalue_dword(key, "Start", SVCCTL_AUTO_START);
+	if (!W_ERROR_IS_OK(wresult)) {
+		goto done;
+	}
 
-	dword = SERVICE_TYPE_WIN32_OWN_PROCESS;
-	regval_ctr_addvalue( values, "Type", REG_DWORD, (uint8 *)&dword, sizeof(uint32));
+	wresult = svcctl_setvalue_dword(key, "Type", SERVICE_TYPE_WIN32_OWN_PROCESS);
+	if (!W_ERROR_IS_OK(wresult)) {
+		goto done;
+	}
 
-	dword = SVCCTL_SVC_ERROR_NORMAL;
-	regval_ctr_addvalue( values, "ErrorControl", REG_DWORD, (uint8 *)&dword, sizeof(uint32));
+	wresult = svcctl_setvalue_dword(key, "ErrorControl", SVCCTL_SVC_ERROR_NORMAL);
+	if (!W_ERROR_IS_OK(wresult)) {
+		goto done;
+	}
 
 	/* everything runs as LocalSystem */
 
-	regval_ctr_addvalue_sz(values, "ObjectName", "LocalSystem");
+	wresult = svcctl_setvalue_sz(key, "ObjectName", "LocalSystem");
+	if (!W_ERROR_IS_OK(wresult)) {
+		goto done;
+	}
 
 	/* special considerations for internal services and the DisplayName value */
 
 	for ( i=0; builtin_svcs[i].servicename; i++ ) {
 		if ( strequal( name, builtin_svcs[i].servicename ) ) {
-			ipath = talloc_asprintf(talloc_tos(), "%s/%s/%s",
-					get_dyn_MODULESDIR(), SVCCTL_SCRIPT_DIR,
-					builtin_svcs[i].daemon);
-			description = talloc_strdup(talloc_tos(), builtin_svcs[i].description);
-			dname = talloc_strdup(talloc_tos(), builtin_svcs[i].dispname);
+			ipath = talloc_asprintf(mem_ctx, "%s/%s/%s",
+						get_dyn_MODULESDIR(),
+						SVCCTL_SCRIPT_DIR,
+						builtin_svcs[i].daemon);
+			description = talloc_strdup(mem_ctx, builtin_svcs[i].description);
+			dname = talloc_strdup(mem_ctx, builtin_svcs[i].dispname);
 			break;
 		}
 	}
@@ -294,147 +371,83 @@ static void fill_service_values(const char *name, struct regval_ctr *values)
 		char *dispname = NULL;
 		struct rcinit_file_information *init_info = NULL;
 
-		ipath = talloc_asprintf(talloc_tos(), "%s/%s/%s",
+		ipath = talloc_asprintf(mem_ctx, "%s/%s/%s",
 					get_dyn_MODULESDIR(), SVCCTL_SCRIPT_DIR,
 					name);
 
 		/* lookup common unix display names */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list