The branch, master has been updated
       via  e858ec6 s3-rpc_server: Removed no longer used functions.
       via  0b1ba88 s3-rpc_client: Migrate to 
dcerpc_winreg_delete_subkeys_recursive().
       via  a336cc4 s3-rpc_client: Migrate to dcerpc_winreg_enumvals() function.
       via  4558225 s3-rpc_client: Added 
dcerpc_winreg_delete_subkeys_recursive() function.
       via  8b3eff8 s3-rpc_client: Added dcerpc_winreg_enumvals() function.
      from  c6ece60 dynconfig: rework the logic to support --enable-fhs

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


- Log -----------------------------------------------------------------
commit e858ec6e92c0232bbf82dc117c03b71e9a413be3
Author: Vicentiu Ciorbaru <cvicen...@gmail.com>
Date:   Tue Jul 12 19:54:45 2011 +0300

    s3-rpc_server: Removed no longer used functions.
    
    Removed winreg_printer_delete_subkeys().
    Removed winreg_printer_enumvalues().
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    
    Autobuild-User: Andreas Schneider <a...@cryptomilk.org>
    Autobuild-Date: Wed Jul 13 12:42:02 CEST 2011 on sn-devel-104

commit 0b1ba88f228592bd7ced01025a4045c946096ab4
Author: Vicentiu Ciorbaru <cvicen...@gmail.com>
Date:   Tue Jul 12 19:50:57 2011 +0300

    s3-rpc_client: Migrate to dcerpc_winreg_delete_subkeys_recursive().
    
    Functions now use dcerpc_winreg_delete_subkeys_recursive() instead of the 
more
    specific printer function winreg_printer_delete_subkeys().
    
    Signed-off-by: Andreas Schneider <a...@samba.org>

commit a336cc44d94532d064cb272f3c2ff3c5b9230039
Author: Vicentiu Ciorbaru <cvicen...@gmail.com>
Date:   Tue Jul 12 19:42:15 2011 +0300

    s3-rpc_client: Migrate to dcerpc_winreg_enumvals() function.
    
    The functions that called winreg_printer_enumvalues() function now use
    dcerpc_winreg_enumvals().
    
    Signed-off-by: Andreas Schneider <a...@samba.org>

commit 4558225cdd9c29a4b683101f39f627bf61a580af
Author: Vicentiu Ciorbaru <cvicen...@gmail.com>
Date:   Tue Jul 12 19:38:14 2011 +0300

    s3-rpc_client: Added dcerpc_winreg_delete_subkeys_recursive() function.
    
    This function is set to replace the more specific printer function
    winreg_printer_delete_subkeys().
    
    Signed-off-by: Andreas Schneider <a...@samba.org>

commit 8b3eff8b36129d9920685a84a902cdf109e27354
Author: Vicentiu Ciorbaru <cvicen...@gmail.com>
Date:   Tue Jul 12 19:37:31 2011 +0300

    s3-rpc_client: Added dcerpc_winreg_enumvals() function.
    
    The function is set to replace the more specific printer function
    winreg_printer_enumvalues() function.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>

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

Summary of changes:
 source3/rpc_client/cli_winreg.c         |  280 ++++++++++++++++++
 source3/rpc_client/cli_winreg.h         |   65 ++++
 source3/rpc_client/cli_winreg_spoolss.c |  486 +++++++++++--------------------
 3 files changed, 518 insertions(+), 313 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpc_client/cli_winreg.c b/source3/rpc_client/cli_winreg.c
index 69982da..9fa2d31 100644
--- a/source3/rpc_client/cli_winreg.c
+++ b/source3/rpc_client/cli_winreg.c
@@ -702,4 +702,284 @@ NTSTATUS dcerpc_winreg_enum_keys(TALLOC_CTX *mem_ctx,
        return status;
 }
 
+NTSTATUS dcerpc_winreg_enumvals(TALLOC_CTX *mem_ctx,
+                                       struct dcerpc_binding_handle *h,
+                                       struct policy_handle *key_hnd,
+                                       uint32_t *pnum_values,
+                                       const char ***pnames,
+                                       enum winreg_Type **_type,
+                                       DATA_BLOB **pdata,
+                                       WERROR *pwerr)
+{
+       TALLOC_CTX *tmp_ctx;
+       uint32_t num_subkeys = 0, max_subkeylen = 0, max_classlen = 0;
+       uint32_t num_values = 0, max_valnamelen = 0, max_valbufsize = 0;
+       uint32_t secdescsize = 0;
+       uint32_t i;
+       NTTIME last_changed_time = 0;
+       struct winreg_String classname;
+
+       const char **enum_names = NULL;
+       enum winreg_Type *enum_types = NULL;
+       DATA_BLOB *enum_data_blobs = NULL;
+
+
+       WERROR result = WERR_OK;
+       NTSTATUS status = NT_STATUS_OK;
+
+       tmp_ctx = talloc_stackframe();
+       if (tmp_ctx == NULL) {
+
+               status = NT_STATUS_NO_MEMORY;
+               *pwerr = ntstatus_to_werror(status);
+               return status;
+       }
+
+       ZERO_STRUCT(classname);
+
+       status = dcerpc_winreg_QueryInfoKey(h,
+                                           tmp_ctx,
+                                           key_hnd,
+                                           &classname,
+                                           &num_subkeys,
+                                           &max_subkeylen,
+                                           &max_classlen,
+                                           &num_values,
+                                           &max_valnamelen,
+                                           &max_valbufsize,
+                                           &secdescsize,
+                                           &last_changed_time,
+                                           &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("dcerpc_winreg_enumvals: Could not query info: %s\n",
+                         nt_errstr(status)));
+               goto error;
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("dcerpc_winreg_enumvals: Could not query info: %s\n",
+                         win_errstr(result)));
+               *pwerr = result;
+               goto error;
+       }
+
+       if (num_values == 0) {
+               *pnum_values = 0;
+               TALLOC_FREE(tmp_ctx);
+               *pwerr = WERR_OK;
+               return status;
+       }
+
+       enum_names = talloc_zero_array(tmp_ctx, const char *, num_values);
+
+       if (enum_names == NULL) {
+               *pwerr = WERR_NOMEM;
+               goto error;
+       }
+
+       enum_types = talloc_zero_array(tmp_ctx, enum winreg_Type, num_values);
+
+       if (enum_types == NULL) {
+               *pwerr = WERR_NOMEM;
+               goto error;
+       }
+
+       enum_data_blobs = talloc_zero_array(tmp_ctx, DATA_BLOB, num_values);
+
+       if (enum_data_blobs == NULL) {
+               *pwerr = WERR_NOMEM;
+               goto error;
+       }
+
+       for (i = 0; i < num_values; i++) {
+               const char *name;
+               struct winreg_ValNameBuf name_buf;
+               enum winreg_Type type = REG_NONE;
+               uint8_t *data;
+               uint32_t data_size;
+               uint32_t length;
+               char n = '\0';
+
+
+               name_buf.name = &n;
+               name_buf.size = max_valnamelen + 2;
+               name_buf.length = 0;
+
+               data_size = max_valbufsize;
+               data = NULL;
+               if (data_size) {
+                       data = (uint8_t *) TALLOC(tmp_ctx, data_size);
+               }
+               length = 0;
+
+               status = dcerpc_winreg_EnumValue(h,
+                                                tmp_ctx,
+                                                key_hnd,
+                                                i,
+                                                &name_buf,
+                                                &type,
+                                                data,
+                                                data_size ? &data_size : NULL,
+                                                &length,
+                                                &result);
+               if (W_ERROR_EQUAL(result, WERR_NO_MORE_ITEMS) ) {
+                       result = WERR_OK;
+                       status = NT_STATUS_OK;
+                       break;
+               }
+
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0, ("dcerpc_winreg_enumvals: Could not enumerate 
values: %s\n",
+                                 nt_errstr(status)));
+                       goto error;
+               }
+               if (!W_ERROR_IS_OK(result)) {
+                       DEBUG(0, ("dcerpc_winreg_enumvals: Could not enumerate 
values: %s\n",
+                                 win_errstr(result)));
+                       *pwerr = result;
+                       goto error;
+               }
+
+               if (name_buf.name == NULL) {
+                       result = WERR_INVALID_PARAMETER;
+                       *pwerr = result;
+                       goto error;
+               }
+
+               name = talloc_strdup(enum_names, name_buf.name);
+               if (name == NULL) {
+                       result = WERR_NOMEM;
+                       *pwerr = result;
+                       goto error;
+               }
+       /* place name, type and datablob in the enum return params */
+
+               enum_data_blobs[i] = data_blob_talloc(enum_data_blobs, data, 
length);
+               enum_names[i] = name;
+               enum_types[i] = type;
+
+       }
+       /* move to the main mem context */
+       *pnum_values = num_values;
+       if (pnames) {
+               *pnames = talloc_move(mem_ctx, &enum_names);
+       }
+       /* can this fail in any way? */
+       if (_type) {
+               *_type = talloc_move(mem_ctx, &enum_types);
+       }
+
+       if (pdata){
+               *pdata = talloc_move(mem_ctx, &enum_data_blobs);
+       }
+
+
+       result = WERR_OK;
+
+ error:
+       TALLOC_FREE(tmp_ctx);
+       *pwerr = result;
+
+       return status;
+}
+
+NTSTATUS dcerpc_winreg_delete_subkeys_recursive(TALLOC_CTX *mem_ctx,
+                                               struct dcerpc_binding_handle *h,
+                                               struct policy_handle 
*hive_handle,
+                                               uint32_t access_mask,
+                                               const char *key,
+                                               WERROR *pwerr)
+{
+       const char **subkeys = NULL;
+       uint32_t num_subkeys = 0;
+       struct policy_handle key_hnd;
+       struct winreg_String wkey = { 0, };
+       WERROR result = WERR_OK;
+       NTSTATUS status = NT_STATUS_OK;
+       uint32_t i;
+
+       ZERO_STRUCT(key_hnd);
+       wkey.name = key;
+
+       DEBUG(2, ("dcerpc_winreg_delete_subkeys_recursive: delete key %s\n", 
key));
+       /* open the key */
+       status = dcerpc_winreg_OpenKey(h,
+                                      mem_ctx,
+                                      hive_handle,
+                                      wkey,
+                                      0,
+                                      access_mask,
+                                      &key_hnd,
+                                      &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("dcerpc_winreg_delete_subkeys_recursive: Could not 
open key %s: %s\n",
+                         wkey.name, nt_errstr(status)));
+               goto done;
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("dcerpc_winreg_delete_subkeys_recursive: Could not 
open key %s: %s\n",
+                         wkey.name, win_errstr(result)));
+               *pwerr = result;
+               goto done;
+       }
+
+       status = dcerpc_winreg_enum_keys(mem_ctx,
+                                        h,
+                                        &key_hnd,
+                                        &num_subkeys,
+                                        &subkeys,
+                                        &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       for (i = 0; i < num_subkeys; i++) {
+               /* create key + subkey */
+               char *subkey = talloc_asprintf(mem_ctx, "%s\\%s", key, 
subkeys[i]);
+               if (subkey == NULL) {
+                       goto done;
+               }
+
+               DEBUG(2, ("dcerpc_winreg_delete_subkeys_recursive: delete 
subkey %s\n", subkey));
+               status = dcerpc_winreg_delete_subkeys_recursive(mem_ctx,
+                                                               h,
+                                                               hive_handle,
+                                                               access_mask,
+                                                               subkey,
+                                                               &result);
+               if (!W_ERROR_IS_OK(result)) {
+                       goto done;
+               }
+       }
+
+       if (is_valid_policy_hnd(&key_hnd)) {
+               WERROR ignore;
+               dcerpc_winreg_CloseKey(h, mem_ctx, &key_hnd, &ignore);
+       }
+
+       wkey.name = key;
+
+       status = dcerpc_winreg_DeleteKey(h,
+                                        mem_ctx,
+                                        hive_handle,
+                                        wkey,
+                                        &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               *pwerr = result;
+               goto done;
+       }
+
+done:
+       if (is_valid_policy_hnd(&key_hnd)) {
+               WERROR ignore;
+
+               dcerpc_winreg_CloseKey(h, mem_ctx, &key_hnd, &ignore);
+       }
+
+       *pwerr = result;
+       return status;
+}
+
 /* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */
diff --git a/source3/rpc_client/cli_winreg.h b/source3/rpc_client/cli_winreg.h
index 413aba5..a516263 100644
--- a/source3/rpc_client/cli_winreg.h
+++ b/source3/rpc_client/cli_winreg.h
@@ -378,6 +378,71 @@ NTSTATUS dcerpc_winreg_enum_keys(TALLOC_CTX *mem_ctx,
                                 uint32_t *pnum_subkeys,
                                 const char ***psubkeys,
                                 WERROR *pwerr);
+/**
+ * @internal
+ *
+ * @brief Enumerate values of an opened key handle and retrieve the data.
+ *
+ * @param[in]  mem_ctx  The memory context to use.
+ *
+ * @param[in]  winreg_handle The binding handle for the rpc connection.
+ *
+ * @param[in]  key_hnd  The opened key handle.
+ *
+ * @param[out] pnum_values A pointer to store the number of values we found.
+ *
+ * @param[out] pnames A pointer to store all the names of the values we found.
+ *
+ * @param[out] _type A pointer to store all the types coresponding with the
+ *                  values found.
+ * @param[out] pdata A pointer to store the data coresponding to the values.
+ *
+ * @param[out] pwerr A pointer to the WERROR. WERR_OK on success
+ *                  WERR_OK on success, the corresponding DOS error
+ *                  code if something's gone wrong.
+ *
+ * @return              NT_STATUS_OK on success or a corresponding error if
+ *                      there was a problem on the connection.
+ */
+
+NTSTATUS dcerpc_winreg_enumvals(TALLOC_CTX *mem_ctx,
+                                       struct dcerpc_binding_handle *h,
+                                       struct policy_handle *key_hnd,
+                                       uint32_t *pnum_values,
+                                       const char ***pnames,
+                                       enum winreg_Type **_type,
+                                       DATA_BLOB **pdata,
+                                       WERROR *pwerr);
+
+/**
+ * @internal
+ *
+ * @brief A function to delete a key and its subkeys recurively.
+ *
+ * @param[in]  mem_ctx  The memory context to use.
+ *
+ * @param[in]  winreg_handle The binding handle for the rpc connection.
+ *
+ * @param[in]  hive_handle A opened hive handle to the key.
+ *
+ * @param[in]  access_mask The access mask to access the key.
+ *
+ * @param[in]  key      The key to delete
+ *
+ * @param[out]          WERR_OK on success, the corresponding DOS error
+ *                      code if something gone wrong.
+ *
+ * @return              NT_STATUS_OK on success or a corresponding error if
+ *                      there was a problem on the connection.
+ */
+
+NTSTATUS dcerpc_winreg_delete_subkeys_recursive(TALLOC_CTX *mem_ctx,
+                                               struct dcerpc_binding_handle *h,
+                                               struct policy_handle 
*hive_handle,
+                                               uint32_t access_mask,
+                                               const char *key,
+                                               WERROR *pwerr);
+
 
 #endif /* CLI_WINREG_H */
 
diff --git a/source3/rpc_client/cli_winreg_spoolss.c 
b/source3/rpc_client/cli_winreg_spoolss.c
index f742a47..9b7c724 100644
--- a/source3/rpc_client/cli_winreg_spoolss.c
+++ b/source3/rpc_client/cli_winreg_spoolss.c
@@ -320,287 +320,6 @@ static char *winreg_printer_data_keyname(TALLOC_CTX 
*mem_ctx, const char *printe
        return talloc_asprintf(mem_ctx, "%s\\%s", TOP_LEVEL_PRINT_PRINTERS_KEY, 
printer);
 }
 
-/**
- * @internal
- *
- * @brief Enumerate values of an opened key handle and retrieve the data.
- *
- * @param[in]  mem_ctx  The memory context to use.
- *
- * @param[in]  winreg_handle The binding handle for the rpc connection.
- *
- * @param[in]  key_hnd  The opened key handle.
- *
- * @param[out] pnum_values A pointer to store he number of values found.
- *
- * @param[out] pnum_values A pointer to store the number of values we found.
- *
- * @return                   WERR_OK on success, the corresponding DOS error
- *                           code if something gone wrong.
- */
-static WERROR winreg_printer_enumvalues(TALLOC_CTX *mem_ctx,
-                                       struct dcerpc_binding_handle 
*winreg_handle,
-                                       struct policy_handle *key_hnd,
-                                       uint32_t *pnum_values,
-                                       struct spoolss_PrinterEnumValues 
**penum_values)
-{
-       TALLOC_CTX *tmp_ctx;
-       uint32_t num_subkeys, max_subkeylen, max_classlen;
-       uint32_t num_values, max_valnamelen, max_valbufsize;
-       uint32_t secdescsize;
-       uint32_t i;
-       NTTIME last_changed_time;
-       struct winreg_String classname;
-
-       struct spoolss_PrinterEnumValues *enum_values;
-
-       WERROR result = WERR_OK;
-       NTSTATUS status;
-
-       tmp_ctx = talloc_stackframe();
-       if (tmp_ctx == NULL) {
-               return WERR_NOMEM;
-       }
-
-       ZERO_STRUCT(classname);
-
-       status = dcerpc_winreg_QueryInfoKey(winreg_handle,
-                                           tmp_ctx,
-                                           key_hnd,
-                                           &classname,
-                                           &num_subkeys,
-                                           &max_subkeylen,
-                                           &max_classlen,
-                                           &num_values,
-                                           &max_valnamelen,
-                                           &max_valbufsize,
-                                           &secdescsize,
-                                           &last_changed_time,
-                                           &result);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0, ("winreg_printer_enumvalues: Could not query info: 
%s\n",
-                         nt_errstr(status)));
-               result = ntstatus_to_werror(status);
-               goto error;
-       }
-       if (!W_ERROR_IS_OK(result)) {
-               DEBUG(0, ("winreg_printer_enumvalues: Could not query info: 
%s\n",
-                         win_errstr(result)));
-               goto error;
-       }
-
-       if (num_values == 0) {
-               *pnum_values = 0;
-               TALLOC_FREE(tmp_ctx);
-               return WERR_OK;
-       }
-
-       enum_values = talloc_array(tmp_ctx, struct spoolss_PrinterEnumValues, 
num_values);
-       if (enum_values == NULL) {
-               result = WERR_NOMEM;
-               goto error;
-       }
-
-       for (i = 0; i < num_values; i++) {
-               struct spoolss_PrinterEnumValues val;
-               struct winreg_ValNameBuf name_buf;
-               enum winreg_Type type = REG_NONE;
-               uint8_t *data;
-               uint32_t data_size;
-               uint32_t length;
-               char n = '\0';
-
-               name_buf.name = &n;
-               name_buf.size = max_valnamelen + 2;
-               name_buf.length = 0;
-
-               data_size = max_valbufsize;
-               data = NULL;
-               if (data_size) {
-                       data = (uint8_t *) talloc_zero_size(tmp_ctx, data_size);
-               }
-               length = 0;
-
-               status = dcerpc_winreg_EnumValue(winreg_handle,
-                                                tmp_ctx,
-                                                key_hnd,
-                                                i,
-                                                &name_buf,
-                                                &type,
-                                                data,
-                                                data_size ? &data_size : NULL,
-                                                &length,
-                                                &result);
-               if (W_ERROR_EQUAL(result, WERR_NO_MORE_ITEMS) ) {
-                       result = WERR_OK;
-                       status = NT_STATUS_OK;
-                       break;
-               }
-
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("winreg_printer_enumvalues: Could not 
enumerate values: %s\n",
-                                 nt_errstr(status)));
-                       result = ntstatus_to_werror(status);
-                       goto error;
-               }
-               if (!W_ERROR_IS_OK(result)) {
-                       DEBUG(0, ("winreg_printer_enumvalues: Could not 
enumerate values: %s\n",
-                                 win_errstr(result)));
-                       goto error;


-- 
Samba Shared Repository

Reply via email to