The branch, v3-6-test has been updated
       via  8b14b88 s3-waf: add net.
       via  6561289 s3-waf: Build libwbclient as dynamic library (cherry picked 
from commit dbfb42c1b50e9372184ad170f10ba75b87565965)
       via  d9be9ea s3-waf: add libnetapi (cherry picked from commit 
99d898938c7d656d852e4c91f7534e2cba99c5f8)
       via  6028aac s3-waf: fix the file locations of gen_ndr'ed files.
       via  2328105 s3-waf: fix the build after reg_api changes.
       via  9300480 s3-registry: move regf based reg_api calls into own file.
       via  328ee6a s3-registry: add reg_querymultiplevalues to reg_api 
matching table.
       via  bb4f37d s3-waf: add rpcclient to the waf build.
       via  de59fea s3-rpcclient: add some winreg commands.
      from  5742ccf lib/tdb: fix c++ build warning in tdb_header_hash().

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


- Log -----------------------------------------------------------------
commit 8b14b883b2c29f1804060ddee0d931993eaf6f90
Author: Günther Deschner <[email protected]>
Date:   Sun Sep 19 22:35:26 2010 +0200

    s3-waf: add net.
    
    Guenther
    (cherry picked from commit c9e17edfc6f9dc7f3ae251102dbb7bfcf08a770d)

commit 65612896705c1f8f903eec5ab3d9474137b266da
Author: Kai Blin <[email protected]>
Date:   Sun Sep 19 15:41:45 2010 -0700

    s3-waf: Build libwbclient as dynamic library
    (cherry picked from commit dbfb42c1b50e9372184ad170f10ba75b87565965)

commit d9be9ea4092b8018476c12153e129f0203d3d643
Author: Günther Deschner <[email protected]>
Date:   Mon Sep 20 09:47:21 2010 -0700

    s3-waf: add libnetapi
    (cherry picked from commit 99d898938c7d656d852e4c91f7534e2cba99c5f8)

commit 6028aac67b800a0a5a5b73618c9da95c0d006954
Author: Günther Deschner <[email protected]>
Date:   Mon Sep 20 03:18:49 2010 +0200

    s3-waf: fix the file locations of gen_ndr'ed files.
    
    Guenther
    (cherry picked from commit c1a6820c85334da43ad47fcc1975a9b4c9577479)

commit 232810567fbc046c23ef05ffea39cdbcf3dfe4b1
Author: Günther Deschner <[email protected]>
Date:   Mon Sep 20 03:10:43 2010 +0200

    s3-waf: fix the build after reg_api changes.
    
    Guenther
    (cherry picked from commit ad8533c0b0cffa037f1395d586381d8db642e93a)

commit 9300480fd458d4793eef9a6d397f94c5c8ec19ae
Author: Günther Deschner <[email protected]>
Date:   Mon Sep 20 02:10:43 2010 +0200

    s3-registry: move regf based reg_api calls into own file.
    
    Guenther
    (cherry picked from commit 91e8f8ded2f78bdd5b1db11562a575488a024322)

commit 328ee6ad3b915d0deb1d06c4fbd553b3aebd1af6
Author: Günther Deschner <[email protected]>
Date:   Mon Sep 20 01:51:54 2010 +0200

    s3-registry: add reg_querymultiplevalues to reg_api matching table.
    
    Guenther
    (cherry picked from commit 323f729df07794da6b79db5e72b1389fb79b8bde)

commit bb4f37d4ac6d6330775321a78a998b9b24f17a66
Author: Günther Deschner <[email protected]>
Date:   Thu Aug 12 15:42:16 2010 +0200

    s3-waf: add rpcclient to the waf build.
    
    Guenther
    (cherry picked from commit 3f55c2ee7ac89f96e902b1f1b782e3e033e42f43)

commit de59fea8f4ea8fbd2888a947a897d41592373754
Author: Günther Deschner <[email protected]>
Date:   Fri Sep 17 13:17:12 2010 +0200

    s3-rpcclient: add some winreg commands.
    
    Guenther
    (cherry picked from commit 9e058c6e7292b628ca08bb34b5930d0f4a77ef27)

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

Summary of changes:
 source3/Makefile.in             |   11 +-
 source3/build/dynconfig.py      |    4 +-
 source3/build/wscript           |    3 +
 source3/include/registry.h      |    7 +-
 source3/registry/reg_api.c      |  276 +---------------------------------
 source3/registry/reg_api_regf.c |  301 ++++++++++++++++++++++++++++++++++++
 source3/rpcclient/cmd_winreg.c  |  321 +++++++++++++++++++++++++++++++++++++++
 source3/rpcclient/rpcclient.c   |    2 +
 source3/wscript_build           |  214 +++++++++++++++++++++-----
 9 files changed, 818 insertions(+), 321 deletions(-)
 create mode 100644 source3/registry/reg_api_regf.c
 create mode 100644 source3/rpcclient/cmd_winreg.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 0908166..e76ab23 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -616,6 +616,8 @@ REG_INIT_FULL_OBJ = registry/reg_init_full.o
 REGFIO_OBJ = registry/regfio.o \
             $(REG_PARSE_PRS_OBJ)
 
+REG_API_REGF_OBJ = registry/reg_api_regf.o
+
 REGOBJS_OBJ = registry/reg_objects.o
 
 REG_BACKENDS_BASE_OBJ = registry/reg_backend_db.o
@@ -634,7 +636,6 @@ REG_BACKENDS_EXTRA_OBJ = registry/reg_backend_printing.o \
 REG_BASE_OBJ = registry/reg_api.o \
               registry/reg_dispatcher.o \
               registry/reg_cachehook.o \
-              $(REGFIO_OBJ) \
               $(REGOBJS_OBJ) \
               registry/reg_util_internal.o \
               lib/util_nttoken.o \
@@ -750,7 +751,8 @@ PROFILES_OBJ = utils/profiles.o \
               $(LIBSMB_ERR_OBJ) \
               $(PARAM_OBJ) \
                $(LIB_OBJ) $(LIB_DUMMY_OBJ) \
-               $(POPT_LIB_OBJ)
+               $(POPT_LIB_OBJ) \
+              $(REGFIO_OBJ)
 
 OPLOCK_OBJ = smbd/oplock.o smbd/oplock_irix.o smbd/oplock_linux.o \
             smbd/oplock_onefs.o
@@ -897,6 +899,8 @@ SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) 
$(LIBSMB_OBJ) \
                $(SMBLDAP_OBJ) $(LIBNET_OBJ) \
                $(LIBSMBCONF_OBJ) \
                $(PRIVILEGES_BASIC_OBJ) \
+               $(REGFIO_OBJ) \
+               $(REG_API_REGF_OBJ) \
                $(LIBNDR_XATTR_OBJ)
 
 PRINTING_OBJ = printing/pcap.o printing/print_svid.o printing/print_aix.o \
@@ -999,6 +1003,7 @@ RPCCLIENT_OBJ1 = rpcclient/rpcclient.o 
rpcclient/cmd_lsarpc.o \
                 rpcclient/cmd_shutdown.o rpcclient/cmd_test.o \
                 rpcclient/cmd_wkssvc.o rpcclient/cmd_ntsvcs.o \
                 rpcclient/cmd_drsuapi.o rpcclient/cmd_eventlog.o \
+                rpcclient/cmd_winreg.o \
                 $(DISPLAY_SEC_OBJ)
 
 RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \
@@ -1018,6 +1023,7 @@ RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \
             $(LIBCLI_SRVSVC_OBJ) \
             $(LIBCLI_LSA_OBJ) \
             $(LIBCLI_SAMR_OBJ) \
+            $(LIBCLI_WINREG_OBJ) \
             $(LIBCLI_NETLOGON_OBJ) \
             $(RPC_CLIENT_SCHANNEL_OBJ) \
             rpc_client/init_netlogon.o \
@@ -1154,6 +1160,7 @@ NET_OBJ = $(NET_OBJ1) \
          $(REG_SMBCONF_OBJ) \
          $(LIBNET_OBJ) $(LIBNET_DSSYNC_OBJ) $(LIBNET_SAMSYNC_OBJ) \
          $(LIBSMBCONF_OBJ) \
+         $(REGFIO_OBJ) \
          $(PRIVILEGES_BASIC_OBJ) \
          $(LIB_EVENTLOG_OBJ) localedir.o
 
diff --git a/source3/build/dynconfig.py b/source3/build/dynconfig.py
index 65798a3..7382516 100644
--- a/source3/build/dynconfig.py
+++ b/source3/build/dynconfig.py
@@ -10,7 +10,8 @@ dir_options = {
     'with-lockdir'                        : [ '${PREFIX}/var/locks', 'where to 
put lock files' ],
     'with-codepagedir'                    : [ '${PREFIX}/lib/samba', 'where to 
put codepages' ],
     'with-privatedir'                     : [ '${PREFIX}/private', 'where to 
put smbpasswd' ],
-    'with-cachedir'                       : [ '${PREFIX}/var/locks', 'where to 
put temporary cache files' ]
+    'with-cachedir'                       : [ '${PREFIX}/var/locks', 'where to 
put temporary cache files' ],
+    'with-localedir'                      : [ '${PREFIX}/share/locale', 'Where 
to put po files' ]
     }
 
 # list of cflags to use for dynconfig.c
@@ -37,6 +38,7 @@ dyn_cflags = {
     'NTP_SIGND_SOCKET_DIR'           : '${NTP_SIGND_SOCKET_DIR}',
     'CODEPAGEDIR'                    : '${CODEPAGEDIR}',
     'CACHEDIR'                       : '${CACHEDIR}',
+    'LOCALEDIR'                      : '${LOCALEDIR}',
     'SMB_PASSWD_FILE'                : '${PRIVATEDIR}/smbpasswd',
     }
 
diff --git a/source3/build/wscript b/source3/build/wscript
index f27e279..2cbcbe6 100644
--- a/source3/build/wscript
+++ b/source3/build/wscript
@@ -43,6 +43,9 @@ def build(bld):
                         '../dynconfig.c',
                         deps='replace talloc tdb popt',
                         cflags=cflags)
+    bld.SAMBA_SUBSYSTEM('LOCALE_DIR',
+                        '../localedir.c',
+                        cflags=cflags)
 
 def dynconfig_cflags(bld):
     '''work out the extra CFLAGS for dynconfig.c'''
diff --git a/source3/include/registry.h b/source3/include/registry.h
index ca3a1d0..7543ffb 100644
--- a/source3/include/registry.h
+++ b/source3/include/registry.h
@@ -169,8 +169,6 @@ WERROR reg_getkeysecurity(TALLOC_CTX *mem_ctx, struct 
registry_key *key,
 WERROR reg_setkeysecurity(struct registry_key *key,
                          struct security_descriptor *psecdesc);
 WERROR reg_getversion(uint32_t *version);
-WERROR reg_restorekey(struct registry_key *key, const char *fname);
-WERROR reg_savekey(struct registry_key *key, const char *fname);
 WERROR reg_deleteallvalues(struct registry_key *key);
 WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path,
                     uint32 desired_access, const struct nt_user_token *token,
@@ -189,6 +187,11 @@ WERROR reg_create_path(TALLOC_CTX *mem_ctx, const char 
*orig_path,
 WERROR reg_delete_path(const struct nt_user_token *token,
                       const char *orig_path);
 
+/* The following definitions come from registry/reg_api_regf.c  */
+
+WERROR reg_restorekey(struct registry_key *key, const char *fname);
+WERROR reg_savekey(struct registry_key *key, const char *fname);
+
 /* The following definitions come from registry/reg_init_basic.c  */
 
 WERROR registry_init_common(void);
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c
index 4e3d871..7a6f10c 100644
--- a/source3/registry/reg_api.c
+++ b/source3/registry/reg_api.c
@@ -53,19 +53,18 @@
  * 0x1a                winreg_GetVersion                       reg_getversion
  * 0x1b                winreg_OpenHKCC
  * 0x1c                winreg_OpenHKDD
- * 0x1d                winreg_QueryMultipleValues
+ * 0x1d                winreg_QueryMultipleValues              
reg_querymultiplevalues
  * 0x1e                winreg_InitiateSystemShutdownEx
  * 0x1f                winreg_SaveKeyEx
  * 0x20                winreg_OpenHKPT
  * 0x21                winreg_OpenHKPN
- * 0x22                winreg_QueryMultipleValues2
+ * 0x22                winreg_QueryMultipleValues2             
reg_querymultiplevalues
  *
  */
 
 #include "includes.h"
 #include "registry.h"
 #include "reg_cachehook.h"
-#include "regfio.h"
 #include "reg_util_internal.h"
 #include "reg_backend_db.h"
 #include "reg_dispatcher.h"
@@ -748,277 +747,6 @@ WERROR reg_getversion(uint32_t *version)
        return WERR_OK;
 }
 
-/*******************************************************************
- Note: topkeypat is the *full* path that this *key will be
- loaded into (including the name of the key)
- ********************************************************************/
-
-static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath,
-                           REGF_NK_REC *key)
-{
-       REGF_NK_REC *subkey;
-       struct registry_key_handle registry_key;
-       struct regval_ctr *values;
-       struct regsubkey_ctr *subkeys;
-       int i;
-       char *path = NULL;
-       WERROR result = WERR_OK;
-
-       /* initialize the struct registry_key_handle structure */
-
-       registry_key.ops = reghook_cache_find(topkeypath);
-       if (!registry_key.ops) {
-               DEBUG(0, ("reg_load_tree: Failed to assign registry_ops "
-                         "to [%s]\n", topkeypath));
-               return WERR_BADFILE;
-       }
-
-       registry_key.name = talloc_strdup(regfile->mem_ctx, topkeypath);
-       if (!registry_key.name) {
-               DEBUG(0, ("reg_load_tree: Talloc failed for reg_key.name!\n"));
-               return WERR_NOMEM;
-       }
-
-       /* now start parsing the values and subkeys */
-
-       result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys);
-       W_ERROR_NOT_OK_RETURN(result);
-
-       result = regval_ctr_init(subkeys, &values);
-       W_ERROR_NOT_OK_RETURN(result);
-
-       /* copy values into the struct regval_ctr */
-
-       for (i=0; i<key->num_values; i++) {
-               regval_ctr_addvalue(values, key->values[i].valuename,
-                                   key->values[i].type,
-                                   key->values[i].data,
-                                   (key->values[i].data_size & 
~VK_DATA_IN_OFFSET));
-       }
-
-       /* copy subkeys into the struct regsubkey_ctr */
-
-       key->subkey_index = 0;
-       while ((subkey = regfio_fetch_subkey( regfile, key ))) {
-               result = regsubkey_ctr_addkey(subkeys, subkey->keyname);
-               if (!W_ERROR_IS_OK(result)) {
-                       TALLOC_FREE(subkeys);
-                       return result;
-               }
-       }
-
-       /* write this key and values out */
-
-       if (!store_reg_values(&registry_key, values)
-           || !store_reg_keys(&registry_key, subkeys))
-       {
-               DEBUG(0,("reg_load_tree: Failed to load %s!\n", topkeypath));
-               result = WERR_REG_IO_FAILURE;
-       }
-
-       TALLOC_FREE(subkeys);
-
-       if (!W_ERROR_IS_OK(result)) {
-               return result;
-       }
-
-       /* now continue to load each subkey registry tree */
-
-       key->subkey_index = 0;
-       while ((subkey = regfio_fetch_subkey(regfile, key))) {
-               path = talloc_asprintf(regfile->mem_ctx,
-                                      "%s\\%s",
-                                      topkeypath,
-                                      subkey->keyname);
-               if (path == NULL) {
-                       return WERR_NOMEM;
-               }
-               result = reg_load_tree(regfile, path, subkey);
-               if (!W_ERROR_IS_OK(result)) {
-                       break;
-               }
-       }
-
-       return result;
-}
-
-/*******************************************************************
- ********************************************************************/
-
-static WERROR restore_registry_key(struct registry_key_handle *krecord,
-                                  const char *fname)
-{
-       REGF_FILE *regfile;
-       REGF_NK_REC *rootkey;
-       WERROR result;
-
-       /* open the registry file....fail if the file already exists */
-
-       regfile = regfio_open(fname, (O_RDONLY), 0);
-       if (regfile == NULL) {
-               DEBUG(0, ("restore_registry_key: failed to open \"%s\" (%s)\n",
-                         fname, strerror(errno)));
-               return ntstatus_to_werror(map_nt_error_from_unix(errno));
-       }
-
-       /* get the rootkey from the regf file and then load the tree
-          via recursive calls */
-
-       if (!(rootkey = regfio_rootkey(regfile))) {
-               regfio_close(regfile);
-               return WERR_REG_FILE_INVALID;
-       }
-
-       result = reg_load_tree(regfile, krecord->name, rootkey);
-
-       /* cleanup */
-
-       regfio_close(regfile);
-
-       return result;
-}
-
-WERROR reg_restorekey(struct registry_key *key, const char *fname)
-{
-       return restore_registry_key(key->key, fname);
-}
-
-/********************************************************************
-********************************************************************/
-
-static WERROR reg_write_tree(REGF_FILE *regfile, const char *keypath,
-                            REGF_NK_REC *parent)
-{
-       REGF_NK_REC *key;
-       struct regval_ctr *values;
-       struct regsubkey_ctr *subkeys;
-       int i, num_subkeys;
-       char *key_tmp = NULL;
-       char *keyname, *parentpath;
-       char *subkeypath = NULL;
-       char *subkeyname;
-       struct registry_key_handle registry_key;
-       WERROR result = WERR_OK;
-       struct security_descriptor *sec_desc = NULL;
-
-       if (!regfile) {
-               return WERR_GENERAL_FAILURE;
-       }
-
-       if (!keypath) {
-               return WERR_OBJECT_PATH_INVALID;
-       }
-
-       /* split up the registry key path */
-
-       key_tmp = talloc_strdup(regfile->mem_ctx, keypath);
-       if (!key_tmp) {
-               return WERR_NOMEM;
-       }
-       if (!reg_split_key(key_tmp, &parentpath, &keyname)) {
-               return WERR_OBJECT_PATH_INVALID;
-       }
-
-       if (!keyname) {
-               keyname = parentpath;
-       }
-
-       /* we need a registry_key_handle object here to enumerate subkeys and 
values */
-
-       ZERO_STRUCT(registry_key);
-
-       registry_key.name = talloc_strdup(regfile->mem_ctx, keypath);
-       if (registry_key.name == NULL) {
-               return WERR_NOMEM;
-       }
-
-       registry_key.ops = reghook_cache_find(registry_key.name);
-       if (registry_key.ops == NULL) {
-               return WERR_BADFILE;
-       }
-
-       /* lookup the values and subkeys */
-
-       result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys);
-       W_ERROR_NOT_OK_RETURN(result);
-
-       result = regval_ctr_init(subkeys, &values); 
-       W_ERROR_NOT_OK_RETURN(result);
-
-       fetch_reg_keys(&registry_key, subkeys);
-       fetch_reg_values(&registry_key, values);
-
-       result = regkey_get_secdesc(regfile->mem_ctx, &registry_key, &sec_desc);
-       if (!W_ERROR_IS_OK(result)) {
-               goto done;
-       }
-
-       /* write out this key */
-
-       key = regfio_write_key(regfile, keyname, values, subkeys, sec_desc,
-                              parent);
-       if (key == NULL) {
-               result = WERR_CAN_NOT_COMPLETE;
-               goto done;
-       }
-
-       /* write each one of the subkeys out */
-
-       num_subkeys = regsubkey_ctr_numkeys(subkeys);
-       for (i=0; i<num_subkeys; i++) {
-               subkeyname = regsubkey_ctr_specific_key(subkeys, i);
-               subkeypath = talloc_asprintf(regfile->mem_ctx, "%s\\%s",
-                                            keypath, subkeyname);
-               if (subkeypath == NULL) {
-                       result = WERR_NOMEM;
-                       goto done;
-               }
-               result = reg_write_tree(regfile, subkeypath, key);
-               if (!W_ERROR_IS_OK(result))
-                       goto done;
-       }
-
-       DEBUG(6, ("reg_write_tree: wrote key [%s]\n", keypath));
-
-done:
-       TALLOC_FREE(subkeys);
-       TALLOC_FREE(registry_key.name);
-
-       return result;
-}
-
-static WERROR backup_registry_key(struct registry_key_handle *krecord,
-                                 const char *fname)
-{
-       REGF_FILE *regfile;
-       WERROR result;
-
-       /* open the registry file....fail if the file already exists */
-
-       regfile = regfio_open(fname, (O_RDWR|O_CREAT|O_EXCL),
-                             (S_IREAD|S_IWRITE));
-       if (regfile == NULL) {
-               DEBUG(0,("backup_registry_key: failed to open \"%s\" (%s)\n",
-                        fname, strerror(errno) ));
-               return ntstatus_to_werror(map_nt_error_from_unix(errno));
-       }
-
-       /* write the registry tree to the file  */
-
-       result = reg_write_tree(regfile, krecord->name, NULL);
-
-       /* cleanup */
-
-       regfio_close(regfile);
-
-       return result;
-}
-
-WERROR reg_savekey(struct registry_key *key, const char *fname)
-{
-       return backup_registry_key(key->key, fname);
-}
-
 /**********************************************************************
  * Higher level utility functions
  **********************************************************************/
diff --git a/source3/registry/reg_api_regf.c b/source3/registry/reg_api_regf.c
new file mode 100644
index 0000000..8f249b5
--- /dev/null
+++ b/source3/registry/reg_api_regf.c
@@ -0,0 +1,301 @@
+/*
+ *  Unix SMB/CIFS implementation.
+ *  Virtual Windows Registry Layer
+ *  Copyright (C) Volker Lendecke 2006
+ *  Copyright (C) Michael Adam 2007-2008
+ *
+ *  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/>.
+ */
+
+#include "includes.h"
+#include "registry.h"
+#include "reg_cachehook.h"
+#include "regfio.h"
+#include "reg_util_internal.h"
+#include "reg_dispatcher.h"
+#include "reg_objects.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_REGISTRY
+
+/*******************************************************************
+ Note: topkeypat is the *full* path that this *key will be
+ loaded into (including the name of the key)
+ ********************************************************************/
+
+static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath,
+                           REGF_NK_REC *key)
+{
+       REGF_NK_REC *subkey;
+       struct registry_key_handle registry_key;
+       struct regval_ctr *values;
+       struct regsubkey_ctr *subkeys;
+       int i;
+       char *path = NULL;
+       WERROR result = WERR_OK;
+
+       /* initialize the struct registry_key_handle structure */
+
+       registry_key.ops = reghook_cache_find(topkeypath);
+       if (!registry_key.ops) {
+               DEBUG(0, ("reg_load_tree: Failed to assign registry_ops "
+                         "to [%s]\n", topkeypath));
+               return WERR_BADFILE;
+       }
+
+       registry_key.name = talloc_strdup(regfile->mem_ctx, topkeypath);
+       if (!registry_key.name) {
+               DEBUG(0, ("reg_load_tree: Talloc failed for reg_key.name!\n"));
+               return WERR_NOMEM;
+       }
+
+       /* now start parsing the values and subkeys */
+
+       result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys);


-- 
Samba Shared Repository

Reply via email to