[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-test-2428-gd08a3a1

Michael Adam obnox at samba.org
Tue Feb 19 08:09:23 GMT 2008


The branch, v3-2-test has been updated
       via  d08a3a195718725228bbafa61fd4f0be8aafb43f (commit)
       via  951d3fae2cbea09cc4e1806cbf0a94ecdfcee8d5 (commit)
       via  a0b12f4d815fa92c8826954e6d73546c8a751583 (commit)
      from  eeb598a19a3d09f2175032e013857fe743da3eec (commit)

http://gitweb.samba.org/?samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit d08a3a195718725228bbafa61fd4f0be8aafb43f
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 19 01:22:32 2008 +0100

    Use linbet_conf code in loadparm's registry handling.
    
    This replaces the original hand-written tdb code, now that the
    linking dependencies have been significantly reduced.
    
    Michael

commit 951d3fae2cbea09cc4e1806cbf0a94ecdfcee8d5
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 19 01:04:31 2008 +0100

    Make regdb_init() behave like regdb_open() when registry is already opened.
    
    I.e. increment the refcounter.
    
    Michael

commit a0b12f4d815fa92c8826954e6d73546c8a751583
Author: Michael Adam <obnox at samba.org>
Date:   Mon Feb 18 18:21:14 2008 +0100

    Add a function libnet_conf_get_seqnum() to the libnet_conf API.
    
    This is to provide a change sequence number to users, so that they
    can use it to detect change in the config and trigger a reload.
    
    Michael

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

Summary of changes:
 source/Makefile.in               |   58 +++++---
 source/libnet/libnet_conf.c      |   13 ++
 source/param/loadparm.c          |  261 ++++++--------------------------------
 source/registry/reg_backend_db.c |    5 +-
 4 files changed, 91 insertions(+), 246 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/Makefile.in b/source/Makefile.in
index cebe49b..920d56b 100644
--- a/source/Makefile.in
+++ b/source/Makefile.in
@@ -358,7 +358,7 @@ READLINE_OBJ = lib/readline.o
 POPT_LIB_OBJ = lib/popt_common.o
 
 PARAM_WITHOUT_REG_OBJ = dynconfig.o param/loadparm.o param/params.o param/util.o lib/sharesec.o lib/ldap_debug_handler.o
-PARAM_REG_ADD_OBJ = $(UTIL_REG_API_OBJ)
+PARAM_REG_ADD_OBJ = $(REG_API_OBJ) $(LIBNET_CONF_OBJ) $(REGOBJS_OBJ) $(PRIVILEGES_BASIC_OBJ)
 PARAM_OBJ = $(PARAM_WITHOUT_REG_OBJ) $(PARAM_REG_ADD_OBJ)
 
 KRBCLIENT_OBJ = libads/kerberos.o libads/ads_status.o
@@ -466,7 +466,8 @@ REGISTRY_OBJ = registry/reg_init_full.o registry/reg_cachehook.o \
 	       $(REGISTRY_BACKENDS) \
 	       $(UTIL_REG_API_OBJ) \
 	       $(REG_INIT_SMBCONF_OBJ) \
-	       $(REGFIO_OBJ)
+	       $(REGFIO_OBJ) \
+	       $(REGOBJS_OBJ)
 
 # objects to be used when not all of the registry code should be
 # loaded but only the portion needed by reg_api, typically for
@@ -532,19 +533,23 @@ RPC_SERVER_OBJ = @RPC_STATIC@ $(RPC_PIPE_OBJ)
 RPC_PARSE_OBJ = $(RPC_PARSE_OBJ2) \
                 rpc_parse/parse_spoolss.o \
 	        rpc_parse/parse_eventlog.o rpc_parse/parse_buffer.o \
-                rpc_parse/parse_ntsvcs.o rpc_parse/parse_svcctl.o $(REGOBJS_OBJ)
+                rpc_parse/parse_ntsvcs.o rpc_parse/parse_svcctl.o
 
 RPC_CLIENT_OBJ = rpc_client/cli_pipe.o
 
 LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o
 
+PRIVILEGES_BASIC_OBJ = lib/privileges_basic.o
+
+PRIVILEGES_OBJ = lib/privileges.o
+
 PASSDB_GET_SET_OBJ = passdb/pdb_get_set.o
 
 PASSDB_OBJ = $(PASSDB_GET_SET_OBJ) passdb/passdb.o passdb/pdb_interface.o \
 		passdb/util_wellknown.o passdb/util_builtin.o passdb/pdb_compat.o \
 		passdb/util_unixsids.o passdb/lookup_sid.o \
 		passdb/login_cache.o @PDB_STATIC@ \
-		lib/account_pol.o lib/privileges.o lib/privileges_basic.o \
+		lib/account_pol.o $(PRIVILEGES_OBJ) \
 		lib/util_nscd.o lib/winbind_util.o
 
 DEVEL_HELP_WEIRD_OBJ = modules/weird.o
@@ -556,7 +561,7 @@ GROUPDB_OBJ = groupdb/mapping.o groupdb/mapping_tdb.o groupdb/mapping_ldb.o
 
 PROFILE_OBJ = profile/profile.o
 PROFILES_OBJ = utils/profiles.o \
-               $(REGFIO_OBJ) $(REGOBJS_OBJ) $(ERRORMAP_OBJ) \
+               $(ERRORMAP_OBJ) \
 	       $(RPC_PARSE_OBJ1) $(PARAM_OBJ) $(LIBSAMBA_OBJ) \
                $(DOSERR_OBJ) $(LIB_OBJ) $(LIB_DUMMY_OBJ) \
                $(POPT_LIB_OBJ) $(SECRETS_OBJ)
@@ -656,7 +661,8 @@ SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) $(LIBSMB_OBJ) \
 		$(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \
 		$(LIBADS_OBJ) $(KRBCLIENT_OBJ) $(LIBADS_SERVER_OBJ) \
 		$(REGISTRY_OBJ) $(POPT_LIB_OBJ) $(BUILDOPT_OBJ) \
-		$(SMBLDAP_OBJ) $(LDB_OBJ) $(LIBNET_OBJ) @LIBWBCLIENT_STATIC@
+		$(SMBLDAP_OBJ) $(LDB_OBJ) $(LIBNET_OBJ) @LIBWBCLIENT_STATIC@ \
+		$(PRIVILEGES_BASIC_OBJ)
 
 PRINTING_OBJ = printing/pcap.o printing/print_svid.o printing/print_aix.o \
                printing/print_cups.o printing/print_generic.o \
@@ -714,7 +720,8 @@ SMBTREE_OBJ = utils/smbtree.o $(PARAM_OBJ) \
 
 TESTPARM_OBJ = utils/testparm.o \
                $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
-	       $(SECRETS_OBJ) $(LIBSAMBA_OBJ) $(RPC_PARSE_OBJ1) $(DOSERR_OBJ)
+	       $(SECRETS_OBJ) $(LIBSAMBA_OBJ) $(RPC_PARSE_OBJ1) $(DOSERR_OBJ) \
+	       $(ERRORMAP_OBJ)
 
 PASSWD_UTIL_OBJ = utils/passwd_util.o
 
@@ -722,7 +729,7 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASSWD_UTIL_OBJ) $(PASSCHANGE_OBJ) \
 		$(PARAM_OBJ) $(SECRETS_OBJ) $(LIBSMB_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ \
 		$(GROUPDB_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \
 		$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) \
-		$(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) $(LDB_OBJ) 
+		$(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) $(LDB_OBJ)
 
 PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ \
 		$(LIBSAMBA_OBJ) $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) \
@@ -796,9 +803,11 @@ LIBNETAPI_OBJ  = $(LIBNETAPI_OBJ1) $(LIBNET_OBJ) \
 		 $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
 		 $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) \
 		 $(SECRETS_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \
-		 $(DCUTIL_OBJ) $(LIBADS_OBJ)
+		 $(DCUTIL_OBJ) $(LIBADS_OBJ) $(REGOBJS_OBJ) $(PRIVILEGES_BASIC_OBJ)
+
+LIBNET_CONF_OBJ = libnet/libnet_conf.o
 
-LIBNET_OBJ = libnet/libnet_conf.o libnet/libnet_join.o \
+LIBNET_OBJ = $(LIBNET_CONF_OBJ) libnet/libnet_join.o \
 	     librpc/gen_ndr/ndr_libnet_join.o
 
 NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_domain.o utils/net_help.o \
@@ -821,7 +830,8 @@ NET_OBJ = $(NET_OBJ1) $(PARAM_WITHOUT_REG_OBJ) $(SECRETS_OBJ) $(LIBSMB_OBJ) \
 	  $(AFS_OBJ) $(AFS_SETTOKEN_OBJ) $(READLINE_OBJ) \
 	  $(LDB_OBJ) $(LIBGPO_OBJ) @BUILD_INIPARSER@ $(DISPLAY_SEC_OBJ) \
 	  $(REG_API_OBJ) $(DISPLAY_DSDCINFO_OBJ) @LIBNETAPI_STATIC@ $(LIBNET_OBJ) \
-	  $(WBCOMMON_OBJ) @LIBWBCLIENT_STATIC@
+	  $(WBCOMMON_OBJ) @LIBWBCLIENT_STATIC@ $(REGOBJS_OBJ) \
+	  $(PRIVILEGES_BASIC_OBJ)
 
 CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) \
 	  $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ)
@@ -841,7 +851,8 @@ CIFS_UMOUNT_OBJ = client/umount.cifs.o
 CIFS_SPNEGO_OBJ = client/cifs.spnego.o
 
 NMBLOOKUP_OBJ = utils/nmblookup.o $(PARAM_OBJ) $(LIBNMB_OBJ) $(RPC_PARSE_OBJ1) $(DOSERR_OBJ) \
-               $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
+               $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ) \
+	       $(ERRORMAP_OBJ)
 
 SMBTORTURE_OBJ1 = torture/torture.o torture/nbio.o torture/scanner.o torture/utable.o \
 		torture/denytest.o torture/mangle_test.o
@@ -868,7 +879,7 @@ PDBTEST_OBJ = torture/pdbtest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
 
 VFSTEST_OBJ = torture/cmd_vfs.o torture/vfstest.o $(SMBD_OBJ_BASE) $(READLINE_OBJ)
 
-SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ) $(DOSERR_OBJ)
+SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ) $(DOSERR_OBJ) $(RPC_PARSE_OBJ1) $(ERRORMAP_OBJ)
 
 LOG2PCAP_OBJ = utils/log2pcaphex.o
 
@@ -889,19 +900,19 @@ SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
 
 EVTLOGADM_OBJ0	= utils/eventlogadm.o
 
-EVTLOGADM_OBJ	= $(EVTLOGADM_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(REGOBJS_OBJ) \
+EVTLOGADM_OBJ	= $(EVTLOGADM_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
 		$(ERRORMAP_OBJ) $(RPC_PARSE_OBJ1) $(LIBSAMBA_OBJ) $(DOSERR_OBJ) \
 		$(SECRETS_OBJ) \
-	        registry/reg_eventlog.o rpc_server/srv_eventlog_lib.o registry/reg_util.o \
-		registry/reg_backend_db.o
+	        registry/reg_eventlog.o rpc_server/srv_eventlog_lib.o
 
 SHARESEC_OBJ0 = utils/sharesec.o
-SHARESEC_OBJ  = $(SHARESEC_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(REGOBJS_OBJ) \
+SHARESEC_OBJ  = $(SHARESEC_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
 		$(ERRORMAP_OBJ) $(RPC_PARSE_OBJ1) $(LIBSAMBA_OBJ) $(DOSERR_OBJ) \
                 $(POPT_LIB_OBJ) $(SECRETS_OBJ)
 
 TALLOCTORT_OBJ = @tallocdir@/testsuite.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
-                 $(RPC_PARSE_OBJ1) $(DOSERR_OBJ) $(LIBSAMBA_OBJ) $(SECRETS_OBJ)
+                 $(RPC_PARSE_OBJ1) $(DOSERR_OBJ) $(LIBSAMBA_OBJ) $(SECRETS_OBJ) \
+		 $(ERRORMAP_OBJ)
 
 REPLACETORT_OBJ = lib/replace/test/testsuite.o \
 		lib/replace/test/os2_delete.o \
@@ -911,7 +922,8 @@ REPLACETORT_OBJ = lib/replace/test/testsuite.o \
 NDRDUMP_OBJ = librpc/tools/ndrdump.o \
 			  $(PARAM_OBJ) $(LIBNDR_GEN_OBJ) \
 			  $(LIBSAMBA_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
-			  $(RPC_PARSE_OBJ1) $(DOSERR_OBJ) $(SECRETS_OBJ)
+			  $(RPC_PARSE_OBJ1) $(DOSERR_OBJ) $(SECRETS_OBJ) \
+			  $(ERRORMAP_OBJ)
 
 DEBUG2HTML_OBJ = utils/debug2html.o utils/debugparse.o
 
@@ -924,7 +936,7 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) $(LIBNDR_OBJ) $(LIBNDR_GEN_OBJ) \
 	    $(LIBMSRPC_OBJ) \
 	    $(LIB_WITH_PROTO_OBJ) \
 	    $(RPC_PIPE_OBJ) $(RPC_PARSE_OBJ) $(KRBCLIENT_OBJ) \
-	    $(AUTH_OBJ) $(PARAM_OBJ) $(LOCKING_OBJ) $(SECRETS_OBJ) \
+	    $(AUTH_OBJ) $(PARAM_WITHOUT_REG_OBJ) $(LOCKING_OBJ) $(SECRETS_OBJ) \
 	    $(PRINTING_OBJ) $(PRINTBACKEND_OBJ) $(OPLOCK_OBJ) $(NOTIFY_OBJ) \
 	    $(PASSDB_OBJ) $(GROUPDB_OBJ) \
 	    $(READLINE_OBJ) $(PROFILE_OBJ) $(LIBADS_OBJ) $(LIBADS_SERVER_OBJ) \
@@ -935,7 +947,8 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) $(LIBNDR_OBJ) $(LIBNDR_GEN_OBJ) \
             $(IDMAP_OBJ) libsmb/spnego.o $(PASSCHANGE_OBJ) $(RPC_UNIXINFO_OBJ) \
 	    $(RPC_NTSVCS_OBJ) $(RPC_INITSHUTDOWN_OBJ) \
 	    utils/passwd_util.o $(LIBGPO_OBJ) $(NSS_INFO_OBJ) \
-	    $(RPCCLIENT_NDR_OBJ) $(DISPLAY_DSDCINFO_OBJ)
+	    $(RPCCLIENT_NDR_OBJ) $(DISPLAY_DSDCINFO_OBJ) \
+	    $(PRIVILEGES_BASIC_OBJ)
 
 WINBIND_WINS_NSS_OBJ = nsswitch/wins.o $(PARAM_OBJ) \
 	$(LIBSMB_OBJ) $(LIB_NONSMBD_OBJ) $(NSSWINS_OBJ) $(KRBCLIENT_OBJ) $(SECRETS_OBJ)
@@ -988,7 +1001,8 @@ WINBINDD_OBJ = \
 
 WBINFO_OBJ = nsswitch/wbinfo.o $(LIBSAMBA_OBJ) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
 		$(SECRETS_OBJ) $(POPT_LIB_OBJ) $(AFS_SETTOKEN_OBJ) $(RPC_PARSE_OBJ1) \
-		$(DOSERR_OBJ) lib/winbind_util.o $(WBCOMMON_OBJ) @LIBWBCLIENT_STATIC@
+		$(DOSERR_OBJ) lib/winbind_util.o $(WBCOMMON_OBJ) @LIBWBCLIENT_STATIC@ \
+		$(ERRORMAP_OBJ)
 
 WINBIND_NSS_OBJ = $(WBCOMMON_OBJ) $(LIBREPLACE_OBJ) @WINBIND_NSS_EXTRA_OBJS@
 
diff --git a/source/libnet/libnet_conf.c b/source/libnet/libnet_conf.c
index c3872b6..688097b 100644
--- a/source/libnet/libnet_conf.c
+++ b/source/libnet/libnet_conf.c
@@ -482,6 +482,19 @@ void libnet_conf_close(struct libnet_conf_ctx *ctx)
 }
 
 /**
+ * Get the change sequence number of the given service/parameter.
+ *
+ * NOTE: Currently, for registry configuration, this is independent
+ * of the service and parameter, it returns the registry-sequence
+ * number.
+ */
+uint64_t libnet_conf_get_seqnum(struct libnet_conf_ctx *ctx,
+				const char *service, const char *param)
+{
+	return (uint64_t)regdb_get_seqnum();
+}
+
+/**
  * Drop the whole configuration (restarting empty).
  */
 WERROR libnet_conf_drop(struct libnet_conf_ctx *ctx)
diff --git a/source/param/loadparm.c b/source/param/loadparm.c
index 29de336..4d067af 100644
--- a/source/param/loadparm.c
+++ b/source/param/loadparm.c
@@ -52,6 +52,7 @@
  */
 
 #include "includes.h"
+#include "libnet/libnet.h"
 
 bool in_client = False;		/* Not in the client by default */
 bool bLoaded = False;
@@ -71,7 +72,8 @@ extern userdom_struct current_user_info;
 #define HOMES_NAME "homes"
 #endif
 
-static int regdb_last_seqnum = 0;
+static uint64_t conf_last_seqnum = 0;
+static struct libnet_conf_ctx *conf_ctx = NULL;
 
 #define CONFIG_BACKEND_FILE 0
 #define CONFIG_BACKEND_REGISTRY 1
@@ -3378,241 +3380,46 @@ bool service_ok(int iService)
 }
 
 /*
- * lp_regdb_open - regdb helper function 
- *
- * this should be considered an interim solution that becomes
- * superfluous once the registry code has been rewritten
- * do allow use of the tdb portion of the registry alone.
- *
- * in the meanwhile this provides a lean access
- * to the registry globals.
- */
-
-static struct tdb_wrap *lp_regdb_open(void)
-{
-	struct tdb_wrap *reg_tdb = NULL;
-	const char *vstring = "INFO/version";
-	uint32 vers_id;
-
-	become_root();
-	reg_tdb = tdb_wrap_open(NULL, state_path("registry.tdb"), 0, 
-				REG_TDB_FLAGS, O_RDWR, 0600);
-	unbecome_root();
-	if (!reg_tdb) {
-		DEBUG(1, ("lp_regdb_open: failed to open %s: %s\n",
-			 state_path("registry.tdb"), strerror(errno)));
-		goto done;
-	}
-	else {
-		DEBUG(10, ("lp_regdb_open: reg tdb opened.\n"));
-	}
-
-	vers_id = tdb_fetch_int32(reg_tdb->tdb, vstring);
-	if (vers_id != REGVER_V1) {
-		DEBUG(10, ("lp_regdb_open: INFO: registry tdb %s has wrong "
-			  "INFO/version (got %d, expected %d)\n",
-			  state_path("registry.tdb"), vers_id, REGVER_V1));
-		/* this is apparently not implemented in the tdb */
-	}
-
-done:
-	return reg_tdb;
-}
-
-/*
  * process_registry_globals
- *
- * this is the interim version of process_registry globals
- *
- * until we can do it as we would like using the api and only
- * using the tdb portion of the registry (see below),
- * this just provides the needed functionality of regdb_fetch_values
- * and regdb_unpack_values, circumventing any fancy stuff, to
- * give us access to the registry globals.
  */
 static bool process_registry_globals(bool (*pfunc)(const char *, const char *))
 {
-	bool ret = False;
-	struct tdb_wrap *reg_tdb = NULL;
-	WERROR err;
-	char *keystr;
-	TDB_DATA data;
-	/* vars for the tdb unpack loop */
-	int len = 0;
-	int i;
-	int buflen;
-	uint8 *buf;
-	uint32 type;
-	uint32 size;
-	uint32 num_values = 0;
-	uint8 *data_p;
-	char * valstr;
-	struct registry_value *value = NULL;
-
-	ZERO_STRUCT(data);
-
-	reg_tdb = lp_regdb_open();
-	if (!reg_tdb) {
-		DEBUG(1, ("Error opening the registry!\n"));
-		goto done;
-	}
-
-	/* reg_tdb is from now on used as talloc ctx.
-	 * freeing it closes the tdb (if refcount is 0) */
-
-	keystr = talloc_asprintf(reg_tdb,"%s/%s/%s", REG_VALUE_PREFIX,
-				 KEY_SMBCONF, GLOBAL_NAME);
-	normalize_dbkey(keystr);
-
-	DEBUG(10, ("process_registry_globals: fetching key '%s'\n",
-		   keystr));
-
-	data = tdb_fetch_bystring(reg_tdb->tdb, keystr);
-	if (!data.dptr) {
-		ret = True;
-		goto done;
-	}
-
-	buf = data.dptr;
-	buflen = data.dsize;
-
-	/* unpack number of values */
-	len = tdb_unpack(buf, buflen, "d", &num_values);
-	DEBUG(10, ("process_registry_globals: got %d values from tdb\n",
-		   num_values));
-
-	/* unpack the values */
-	for (i=0; i < num_values; i++) {
-		fstring valname;
-		type = REG_NONE;
-		size = 0;
-		data_p = NULL;
-		len += tdb_unpack(buf+len, buflen-len, "fdB",
-				  valname,
-				  &type,
-				  &size,
-				  &data_p);
-		if (registry_smbconf_valname_forbidden(valname)) {
-			DEBUG(10, ("process_registry_globals: Ignoring "
-				   "parameter '%s' in registry.\n", valname));
-			continue;
-		}
-		DEBUG(10, ("process_registry_globals: got value '%s'\n",
-			   valname));
-		if (size && data_p) {
-			err = registry_pull_value(reg_tdb,
-						  &value,
-						  (enum winreg_Type)type,
-						  data_p,
-						  size,
-						  size);
-			SAFE_FREE(data_p);
-			if (!W_ERROR_IS_OK(err)) {
-				goto done;
-			}
-			switch(type) {
-			case REG_DWORD:
-				valstr = talloc_asprintf(reg_tdb, "%d",
-							 value->v.dword);
-				pfunc(valname, valstr);
-				break;
-			case REG_SZ:
-				pfunc(valname, value->v.sz.str);
-				break;
-			default:
-				/* ignore other types */
-				break;
-			}
+	WERROR werr;
+	char **param_names;
+	char **param_values;
+	uint32_t num_params;
+	uint32_t count;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
+	bool ret = false;
+
+	if (conf_ctx == NULL) {
+		/* first time */
+		werr = libnet_conf_open(NULL, &conf_ctx);
+		if (!W_ERROR_IS_OK(werr)) {
+			goto done;
 		}
 	}
 
-	ret = pfunc("registry shares", "yes");
-	regdb_last_seqnum = tdb_get_seqnum(reg_tdb->tdb);
-
-done:
-	TALLOC_FREE(reg_tdb);
-	SAFE_FREE(data.dptr);
-	return ret;
-}
-
-#if 0
-/*
- * this is process_registry_globals as it _should_ be (roughly)
- * using the reg_api functions...
- *
- * We are *not* currently doing it like this due to the large
- * linker dependecies of the registry code (see above).
- */
-static bool process_registry_globals(bool (*pfunc)(const char *, const char *))
-{
-	bool ret = False;
-	TALLOC_CTX *ctx = NULL;
-	char *regpath = NULL;
-	WERROR werr = WERR_OK;
-	struct registry_key *key = NULL;
-	struct registry_value *value = NULL;
-	char *valname = NULL;
-	char *valstr = NULL;
-	uint32 idx = 0;
-	NT_USER_TOKEN *token = NULL;
-
-	ctx = talloc_init("process_registry_globals");
-	if (!ctx) {
-		smb_panic("Failed to create talloc context!");
-	}
-
-	if (!registry_init_smbconf()) {
-		DEBUG(1, ("Error initializing the registry.\n"));
-		goto done;
-	}
-
-	werr = ntstatus_to_werror(registry_create_admin_token(ctx, &token));
+	werr = libnet_conf_get_share(mem_ctx, conf_ctx, GLOBAL_NAME,
+				     &num_params, &param_names, &param_values);
 	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(1, ("Error creating admin token: %s\n",dos_errstr(werr)));
 		goto done;
 	}
 
-	regpath = talloc_asprintf(ctx,"%s\\%s", KEY_SMBCONF, GLOBAL_NAME);
-	werr = reg_open_path(ctx, regpath, REG_KEY_READ, token, &key);
-	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(1, ("Registry smbconf global section does not exist.\n"));
-		DEBUGADD(1, ("Error opening registry path '%s\\%s: %s\n",
-			     KEY_SMBCONF, GLOBAL_NAME, dos_errstr(werr)));
-		goto done;
-	}
-
-	for (idx = 0;
-	     W_ERROR_IS_OK(werr = reg_enumvalue(ctx, key, idx, &valname,
-			     			&value));
-	     idx++)
-	{
-		DEBUG(5, ("got global registry parameter '%s'\n", valname));
-		switch(value->type) {
-		case REG_DWORD:
-			valstr = talloc_asprintf(ctx, "%d", value->v.dword);
-			pfunc(valname, valstr);
-			TALLOC_FREE(valstr);
-			break;
-		case REG_SZ:
-			pfunc(valname, value->v.sz.str);
-			break;
-		default:
-			/* ignore other types */
-			break;
+	for (count = 0; count < num_params; count++) {
+		ret = pfunc(param_names[count], param_values[count]);
+		if (ret != true) {
+			goto done;
 		}
-		TALLOC_FREE(value);
-		TALLOC_FREE(valstr);
 	}
 
 	ret = pfunc("registry shares", "yes");
-
-	regdb_last_seqnum = regdb_get_seqnum();
+	conf_last_seqnum = libnet_conf_get_seqnum(conf_ctx, NULL, NULL);
 
 done:
-	talloc_destroy(ctx);
+	TALLOC_FREE(mem_ctx);
 	return ret;
 }
-#endif /* if 0 */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list