Use linbet_conf code in loadparm's registry handling.
authorMichael Adam <obnox@samba.org>
Tue, 19 Feb 2008 00:22:32 +0000 (01:22 +0100)
committerMichael Adam <obnox@samba.org>
Tue, 19 Feb 2008 08:09:05 +0000 (09:09 +0100)
This replaces the original hand-written tdb code, now that the
linking dependencies have been significantly reduced.

Michael

source/Makefile.in
source/param/loadparm.c

index cebe49b5109741cdcfc078f6f653e59e6502e2be..920d56bec04e535a35e3991c03f7360dd0f89a9e 100644 (file)
@@ -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@
 
index 29de336df5c403fa80089a73c1e45da1f6a647cd..4d067af5a50e770048a207ca00ce554b9dc59d25 100644 (file)
@@ -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
@@ -3377,242 +3379,47 @@ bool service_ok(int iService)
        return (bRetval);
 }
 
-/*
- * 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 */
 
 static struct file_lists {
        struct file_lists *next;
@@ -3675,17 +3482,25 @@ bool lp_config_backend_is_registry(void)
 bool lp_file_list_changed(void)
 {
        struct file_lists *f = file_lists;
-       struct tdb_wrap *reg_tdb = NULL;
 
        DEBUG(6, ("lp_file_list_changed()\n"));
 
        if (lp_config_backend() == CONFIG_BACKEND_REGISTRY) {
-               reg_tdb = lp_regdb_open();
-               if (reg_tdb && (regdb_last_seqnum != tdb_get_seqnum(reg_tdb->tdb)))
+               if (conf_ctx == NULL) {
+                       WERROR werr;
+                       werr = libnet_conf_open(NULL, &conf_ctx);
+                       if (!W_ERROR_IS_OK(werr)) {
+                               DEBUG(0, ("error opening configuration: %s\n",
+                                         dos_errstr(werr)));
+                               return false;
+                       }
+               }
+               if (conf_last_seqnum !=
+                   libnet_conf_get_seqnum(conf_ctx, NULL, NULL))
                {
-                       DEBUGADD(6, ("regdb seqnum changed: old = %d, new = %d\n",
-                                   regdb_last_seqnum, tdb_get_seqnum(reg_tdb->tdb)));
-                       TALLOC_FREE(reg_tdb);
+                       DEBUGADD(6, ("regdb seqnum changed: old = %lu, "
+                                    "new = %lu\n", conf_last_seqnum,
+                                    libnet_conf_get_seqnum(conf_ctx, NULL, NULL)));
                        return true;
                } else {
                        /*