s3-spoolss: Added a delete_printer_dataex function using the winreg pipe.
authorAndreas Schneider <asn@redhat.com>
Mon, 15 Mar 2010 11:30:05 +0000 (12:30 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 7 Apr 2010 13:16:52 +0000 (15:16 +0200)
Signed-off-by: Günther Deschner <gd@samba.org>
source3/rpc_server/srv_spoolss_util.c
source3/rpc_server/srv_spoolss_util.h

index 4c5f78526f62aad7612e1897938430fbea056deb..4837c1c3db7808b4d16f4bf97f3a75b535fb42ab 100644 (file)
@@ -549,9 +549,6 @@ WERROR winreg_enum_printer_dataex(struct pipes_struct *p,
                return WERR_NOMEM;
        }
 
-       ZERO_STRUCT(hive_hnd);
-       ZERO_STRUCT(key_hnd);
-
        result = winreg_printer_openkey(tmp_ctx,
                                        p->server_info,
                                        &winreg_pipe,
@@ -597,3 +594,72 @@ done:
        TALLOC_FREE(tmp_ctx);
        return result;
 }
+
+/* Delete printer data over a winreg pipe. */
+WERROR winreg_delete_printer_dataex(struct pipes_struct *p,
+                                   const char *printer,
+                                   const char *key,
+                                   const char *value)
+{
+       uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       struct rpc_pipe_client *winreg_pipe = NULL;
+       struct policy_handle hive_hnd, key_hnd;
+       struct winreg_String wvalue;
+       WERROR result = WERR_OK;
+       NTSTATUS status;
+
+       TALLOC_CTX *tmp_ctx;
+
+       tmp_ctx = talloc_new(p->mem_ctx);
+       if (tmp_ctx == NULL) {
+               return WERR_NOMEM;
+       }
+
+       ZERO_STRUCT(hive_hnd);
+       ZERO_STRUCT(key_hnd);
+
+       result = winreg_printer_openkey(tmp_ctx,
+                                       p->server_info,
+                                       &winreg_pipe,
+                                       printer,
+                                       key,
+                                       false,
+                                       access_mask,
+                                       &hive_hnd,
+                                       &key_hnd);
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("winreg_delete_printer_dataex: Could not open key %s: %s\n",
+                         key, win_errstr(result)));
+               goto done;
+       }
+
+       wvalue.name = value;
+       status = rpccli_winreg_DeleteValue(winreg_pipe,
+                                          tmp_ctx,
+                                          &key_hnd,
+                                          wvalue,
+                                          &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("winreg_delete_printer_dataex: Could not delete value %s: %s\n",
+                         value, nt_errstr(status)));
+               if (!W_ERROR_IS_OK(result)) {
+                       goto done;
+               }
+               result = ntstatus_to_werror(status);
+               goto done;
+       }
+
+       result = WERR_OK;
+done:
+       if (winreg_pipe != NULL) {
+               if (is_valid_policy_hnd(&key_hnd)) {
+                       rpccli_winreg_CloseKey(winreg_pipe, tmp_ctx, &key_hnd, NULL);
+               }
+               if (is_valid_policy_hnd(&hive_hnd)) {
+                       rpccli_winreg_CloseKey(winreg_pipe, tmp_ctx, &hive_hnd, NULL);
+               }
+       }
+
+       TALLOC_FREE(tmp_ctx);
+       return result;
+}
index 9be4a2be5de63f1ba4c8e533346dfed9d02917cc..2e6aa903f017340c0b25c61348d3369e6b8d05c6 100644 (file)
@@ -106,4 +106,25 @@ WERROR winreg_enum_printer_dataex(struct pipes_struct *p,
                                  uint32_t *pnum_values,
                                  struct spoolss_PrinterEnumValues **penum_values);
 
+/**
+ * @internal
+ *
+ * @brief Delete printer data over a winreg pipe.
+ *
+ * @param[in]  p        The pipes structure to be able to open a new pipe.
+ *
+ * @param[in]  printer  The printer name.
+ *
+ * @param[in]  key      The key of the printer data to delete.
+ *
+ * @param[in]  value    The name of the value to delete.
+ *
+ * @return              On success WERR_OK, a corresponding DOS error is
+ *                      something went wrong.
+ */
+WERROR winreg_delete_printer_dataex(struct pipes_struct *p,
+                                   const char *printer,
+                                   const char *key,
+                                   const char *value);
+
 #endif /* _SRV_SPOOLSS_UITL_H */