The branch, master has been updated
       via  cb17fcc s3-spoolss: add winreg_del_driver_package_internal()
       via  dceb6dc s3-rpc_cli: add winreg_del_driver_package()
       via  1e81178 s3-spoolss: add winreg_get_driver_package_internal()
       via  7ced1c3 s3-rpc_cli: add winreg_get_driver_package()
       via  5a3b99b s3-spoolss: add winreg_add_driver_package_internal()
       via  1494e94 s3-rpc_cli: add winreg_add_driver_package()
       via  48e65a1 s3-spoolss: add winreg_add_core_driver_internal()
       via  f22c5f1 s3-rpc_cli: add winreg_add_core_driver()
       via  5eeb178 s3-spoolss: add winreg_get_core_driver_internal()
       via  071faf5 s3-rpc_cli: add winreg_get_core_driver()
      from  547524d s3: popt: Change to NULL from talloc_autofree_context() now 
we correctly free on exit.

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


- Log -----------------------------------------------------------------
commit cb17fcc5f53f336d802f6105e6bf3239ac2106a4
Author: Günther Deschner <g...@samba.org>
Date:   Wed Nov 2 18:17:58 2016 +0100

    s3-spoolss: add winreg_del_driver_package_internal()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    
    Autobuild-User(master): Günther Deschner <g...@samba.org>
    Autobuild-Date(master): Tue May  9 20:44:17 CEST 2017 on sn-devel-144

commit dceb6dc3864206a6562d02499f066e21a61e60d0
Author: Günther Deschner <g...@samba.org>
Date:   Wed Nov 2 18:17:37 2016 +0100

    s3-rpc_cli: add winreg_del_driver_package()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 1e81178e2bf48470f3e5866b70f0f9d305db6438
Author: Günther Deschner <g...@samba.org>
Date:   Wed Nov 2 14:37:02 2016 +0100

    s3-spoolss: add winreg_get_driver_package_internal()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 7ced1c30fcadfcab239a8796292f736a74a4357a
Author: Günther Deschner <g...@samba.org>
Date:   Wed Nov 2 14:36:45 2016 +0100

    s3-rpc_cli: add winreg_get_driver_package()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 5a3b99b7ce6a7342a8a427b941268a6a302ee158
Author: Günther Deschner <g...@samba.org>
Date:   Wed Nov 2 13:43:34 2016 +0100

    s3-spoolss: add winreg_add_driver_package_internal()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 1494e94700be68d8c07753371dc8d09b120584fc
Author: Günther Deschner <g...@samba.org>
Date:   Wed Nov 2 13:40:00 2016 +0100

    s3-rpc_cli: add winreg_add_driver_package()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 48e65a15ac306051c0f37520a86d38f254b04321
Author: Günther Deschner <g...@samba.org>
Date:   Mon Oct 31 18:07:50 2016 +0100

    s3-spoolss: add winreg_add_core_driver_internal()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit f22c5f1b9aaac39fea7b58817f67654595f74658
Author: Günther Deschner <g...@samba.org>
Date:   Mon Oct 31 18:07:33 2016 +0100

    s3-rpc_cli: add winreg_add_core_driver()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 5eeb178fe8942b0a4c41dee4ed1195ffa4ab524e
Author: Günther Deschner <g...@samba.org>
Date:   Mon Oct 31 17:43:58 2016 +0100

    s3-spoolss: add winreg_get_core_driver_internal()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 071faf59dc528a78f724a48b20754318da252968
Author: Günther Deschner <g...@samba.org>
Date:   Mon Oct 31 17:43:28 2016 +0100

    s3-rpc_cli: add winreg_get_core_driver()
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

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

Summary of changes:
 source3/include/registry.h                    |   1 +
 source3/registry/reg_backend_db.c             |   1 +
 source3/registry/reg_init_full.c              |   1 +
 source3/rpc_client/cli_winreg_spoolss.c       | 728 ++++++++++++++++++++++++++
 source3/rpc_client/cli_winreg_spoolss.h       | 114 ++++
 source3/rpc_server/spoolss/srv_spoolss_util.c | 160 ++++++
 source3/rpc_server/spoolss/srv_spoolss_util.h |  30 ++
 7 files changed, 1035 insertions(+)


Changeset truncated at 500 lines:

diff --git a/source3/include/registry.h b/source3/include/registry.h
index 0de392f..7d2aad9 100644
--- a/source3/include/registry.h
+++ b/source3/include/registry.h
@@ -103,6 +103,7 @@ struct registry_key {
 #define KEY_TCPIP_PARAMS       
"HKLM\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"
 #define KEY_PROD_OPTIONS       
"HKLM\\SYSTEM\\CurrentControlSet\\Control\\ProductOptions"
 #define KEY_PRINTING           
"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print"
+#define KEY_PCC                        "HKLM\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Print\\PackageInstallation"
 #define KEY_PRINTING_2K                "HKLM\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Print\\Printers"
 #define KEY_PRINTING_PORTS     "HKLM\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Ports"
 #define KEY_CURRENT_VERSION    "HKLM\\SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion"
diff --git a/source3/registry/reg_backend_db.c 
b/source3/registry/reg_backend_db.c
index 9d511b4..928572e 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -121,6 +121,7 @@ static WERROR regdb_trans_do(struct db_context *db,
 
 static const char *builtin_registry_paths[] = {
        KEY_PRINTING_2K,
+       KEY_PCC,
        KEY_PRINTING_PORTS,
        KEY_PRINTING,
        KEY_PRINTING "\\Forms",
diff --git a/source3/registry/reg_init_full.c b/source3/registry/reg_init_full.c
index e47b3f6..ca78370 100644
--- a/source3/registry/reg_init_full.c
+++ b/source3/registry/reg_init_full.c
@@ -55,6 +55,7 @@ struct registry_hook reg_hooks[] = {
   { KEY_PRINTING "\\Printers", &printing_ops },
   { KEY_PRINTING_2K,           &regdb_ops },
   { KEY_PRINTING_PORTS,        &regdb_ops },
+  { KEY_PCC,                   &regdb_ops },
   { KEY_SHARES,                &shares_reg_ops },
   { KEY_SMBCONF,               &smbconf_reg_ops },
   { KEY_NETLOGON_PARAMS,       &netlogon_params_reg_ops },
diff --git a/source3/rpc_client/cli_winreg_spoolss.c 
b/source3/rpc_client/cli_winreg_spoolss.c
index 5ec97e6..7a0817a 100644
--- a/source3/rpc_client/cli_winreg_spoolss.c
+++ b/source3/rpc_client/cli_winreg_spoolss.c
@@ -34,6 +34,7 @@
 
 #define TOP_LEVEL_PRINT_KEY "SOFTWARE\\Microsoft\\Windows 
NT\\CurrentVersion\\Print"
 #define TOP_LEVEL_PRINT_PRINTERS_KEY TOP_LEVEL_PRINT_KEY "\\Printers"
+#define TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY TOP_LEVEL_PRINT_KEY 
"\\PackageInstallation"
 #define TOP_LEVEL_CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control\\Print"
 #define TOP_LEVEL_CONTROL_FORMS_KEY TOP_LEVEL_CONTROL_KEY "\\Forms"
 
@@ -315,6 +316,165 @@ static WERROR winreg_printer_openkey(TALLOC_CTX *mem_ctx,
        return WERR_OK;
 }
 
+static WERROR winreg_printer_open_core_driver(TALLOC_CTX *mem_ctx,
+                                             struct dcerpc_binding_handle 
*binding_handle,
+                                             const char *architecture,
+                                             const char *key,
+                                             uint32_t access_mask,
+                                             struct policy_handle *hive_handle,
+                                             struct policy_handle *key_handle)
+{
+       struct winreg_String wkey, wkeyclass;
+       NTSTATUS status;
+       WERROR result = WERR_OK;
+       WERROR ignore;
+       enum winreg_CreateAction action = REG_ACTION_NONE;
+       const char *path;
+
+       status = dcerpc_winreg_OpenHKLM(binding_handle,
+                                       mem_ctx,
+                                       NULL,
+                                       access_mask,
+                                       hive_handle,
+                                       &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("winreg_printer_open_core_driver: Could not open HKLM 
hive: %s\n",
+                         nt_errstr(status)));
+               return ntstatus_to_werror(status);
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0,("winreg_printer_open_core_driver: Could not open HKLM 
hive: %s\n",
+                         win_errstr(result)));
+               return result;
+       }
+
+       ZERO_STRUCT(wkey);
+       wkey.name = TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY;
+
+       ZERO_STRUCT(wkeyclass);
+       wkeyclass.name = "";
+
+       status = dcerpc_winreg_CreateKey(binding_handle,
+                                        mem_ctx,
+                                        hive_handle,
+                                        wkey,
+                                        wkeyclass,
+                                        0,
+                                        access_mask,
+                                        NULL,
+                                        key_handle,
+                                        &action,
+                                        &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       dcerpc_winreg_CloseKey(binding_handle, mem_ctx, key_handle, &ignore);
+
+       path = talloc_asprintf(mem_ctx, "%s\\%s",
+                                       TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY,
+                                       architecture);
+       if (path == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       wkey.name = path;
+
+       status = dcerpc_winreg_CreateKey(binding_handle,
+                                        mem_ctx,
+                                        hive_handle,
+                                        wkey,
+                                        wkeyclass,
+                                        0,
+                                        access_mask,
+                                        NULL,
+                                        key_handle,
+                                        &action,
+                                        &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       dcerpc_winreg_CloseKey(binding_handle, mem_ctx, key_handle, &ignore);
+
+       path = talloc_asprintf(mem_ctx, "%s\\%s\\CorePrinterDrivers",
+                                       TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY,
+                                       architecture);
+       if (path == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       wkey.name = path;
+
+       status = dcerpc_winreg_CreateKey(binding_handle,
+                                        mem_ctx,
+                                        hive_handle,
+                                        wkey,
+                                        wkeyclass,
+                                        0,
+                                        access_mask,
+                                        NULL,
+                                        key_handle,
+                                        &action,
+                                        &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       dcerpc_winreg_CloseKey(binding_handle, mem_ctx, key_handle, &ignore);
+
+       path = talloc_asprintf(mem_ctx, "%s\\%s\\CorePrinterDrivers\\%s",
+                                       TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY,
+                                       architecture,
+                                       key);
+       if (path == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       wkey.name = path;
+
+       status = dcerpc_winreg_CreateKey(binding_handle,
+                                        mem_ctx,
+                                        hive_handle,
+                                        wkey,
+                                        wkeyclass,
+                                        0,
+                                        access_mask,
+                                        NULL,
+                                        key_handle,
+                                        &action,
+                                        &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+ done:
+       if (is_valid_policy_hnd(hive_handle)) {
+               dcerpc_winreg_CloseKey(binding_handle,
+                                      mem_ctx,
+                                      hive_handle,
+                                      &ignore);
+       }
+       ZERO_STRUCTP(hive_handle);
+
+       return result;
+}
+
 /**
  * @brief Create the registry keyname for the given printer.
  *
@@ -3968,3 +4128,571 @@ done:
        TALLOC_FREE(tmp_ctx);
        return result;
 }
+
+WERROR winreg_get_core_driver(TALLOC_CTX *mem_ctx,
+                             struct dcerpc_binding_handle *winreg_handle,
+                             const char *architecture,
+                             const struct GUID *core_driver_guid,
+                             struct spoolss_CorePrinterDriver 
**_core_printer_driver)
+{
+       uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       struct policy_handle hive_hnd, key_hnd;
+       struct spoolss_CorePrinterDriver *c;
+       struct spoolss_PrinterEnumValues *enum_values = NULL;
+       struct spoolss_PrinterEnumValues *v;
+       uint32_t num_values = 0;
+       TALLOC_CTX *tmp_ctx;
+       WERROR result;
+       NTSTATUS status;
+       const char *path;
+       const char *guid_str;
+       uint32_t i;
+       const char **enum_names = NULL;
+       enum winreg_Type *enum_types = NULL;
+       DATA_BLOB *enum_data_blobs = NULL;
+
+       ZERO_STRUCT(hive_hnd);
+       ZERO_STRUCT(key_hnd);
+
+       tmp_ctx = talloc_stackframe();
+       if (tmp_ctx == NULL) {
+               return WERR_NOT_ENOUGH_MEMORY;
+       }
+
+       path = talloc_asprintf(tmp_ctx, "%s\\%s\\CorePrinterDrivers",
+                                       TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY,
+                                       architecture);
+       if (path == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       guid_str = GUID_string2(tmp_ctx, core_driver_guid);
+       if (guid_str == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       result = winreg_printer_openkey(tmp_ctx,
+                                       winreg_handle,
+                                       path,
+                                       guid_str, /* key */
+                                       false,
+                                       access_mask,
+                                       &hive_hnd,
+                                       &key_hnd);
+
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(5, ("winreg_get_core_driver: "
+                         "Could not open core driver key (%s,%s): %s\n",
+                         guid_str, architecture, win_errstr(result)));
+               goto done;
+       }
+
+       status = dcerpc_winreg_enumvals(tmp_ctx,
+                                       winreg_handle,
+                                       &key_hnd,
+                                       &num_values,
+                                       &enum_names,
+                                       &enum_types,
+                                       &enum_data_blobs,
+                                       &result);
+       if (!NT_STATUS_IS_OK(status)){
+               result = ntstatus_to_werror(status);
+       }
+
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("winreg_get_core_driver: "
+                         "Could not enumerate values for (%s,%s): %s\n",
+                         guid_str, architecture, win_errstr(result)));
+               goto done;
+       }
+
+       enum_values = talloc_zero_array(tmp_ctx,
+                                       struct spoolss_PrinterEnumValues,
+                                       num_values);
+       if (enum_values == NULL){
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       for (i = 0; i < num_values; i++){
+               enum_values[i].value_name = enum_names[i];
+               enum_values[i].value_name_len = strlen_m_term(enum_names[i]) * 
2;
+               enum_values[i].type = enum_types[i];
+               enum_values[i].data_length = enum_data_blobs[i].length;
+               enum_values[i].data = NULL;
+               if (enum_values[i].data_length != 0){
+                       enum_values[i].data = &enum_data_blobs[i];
+               }
+       }
+
+       c = talloc_zero(tmp_ctx, struct spoolss_CorePrinterDriver);
+       if (c == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       c->core_driver_guid = *core_driver_guid;
+
+       result = WERR_OK;
+
+       for (i = 0; i < num_values; i++) {
+               const char *tmp_str;
+
+               v = &enum_values[i];
+
+               result = winreg_enumval_to_sz(c, v,
+                                             "InfPath",
+                                             &c->szPackageID);
+               CHECK_ERROR(result);
+
+               result = winreg_enumval_to_sz(c, v,
+                                             "DriverDate",
+                                             &tmp_str);
+               if (W_ERROR_IS_OK(result)) {
+                       result = winreg_printer_date_to_NTTIME(tmp_str,
+                                               &c->driver_date);
+               }
+               CHECK_ERROR(result);
+
+               result = winreg_enumval_to_sz(c, v,
+                                             "DriverVersion",
+                                             &tmp_str);
+               if (W_ERROR_IS_OK(result)) {
+                       result = winreg_printer_ver_to_qword(tmp_str,
+                                               &c->driver_version);
+               }
+               CHECK_ERROR(result);
+       }
+
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("winreg_enumval_to_TYPE() failed "
+                         "for %s: %s\n", v->value_name,
+                         win_errstr(result)));
+               goto done;
+       }
+
+       *_core_printer_driver = talloc_steal(mem_ctx, c);
+       result = WERR_OK;
+done:
+       if (winreg_handle != NULL) {
+               WERROR ignore;
+
+               if (is_valid_policy_hnd(&key_hnd)) {
+                       dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, 
&key_hnd, &ignore);
+               }
+               if (is_valid_policy_hnd(&hive_hnd)) {
+                       dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, 
&hive_hnd, &ignore);
+               }
+       }
+
+       TALLOC_FREE(tmp_ctx);
+       return result;
+}
+
+WERROR winreg_add_core_driver(TALLOC_CTX *mem_ctx,
+                             struct dcerpc_binding_handle *winreg_handle,
+                             const char *architecture,
+                             const struct spoolss_CorePrinterDriver *r)
+{
+       uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       struct policy_handle hive_hnd, key_hnd;
+       TALLOC_CTX *tmp_ctx = NULL;
+       NTSTATUS status;
+       WERROR result;
+       const char *guid_str;
+
+       ZERO_STRUCT(hive_hnd);
+       ZERO_STRUCT(key_hnd);
+
+       tmp_ctx = talloc_stackframe();
+       if (tmp_ctx == NULL) {
+               return WERR_NOT_ENOUGH_MEMORY;
+       }
+
+       guid_str = GUID_string2(tmp_ctx, &r->core_driver_guid);
+       if (guid_str == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       result = winreg_printer_open_core_driver(tmp_ctx,
+                                                winreg_handle,
+                                                architecture,
+                                                guid_str,
+                                                access_mask,
+                                                &hive_hnd,
+                                                &key_hnd);
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("winreg_add_core_driver: "
+                         "Could not open core driver key (%s,%s): %s\n",
+                         guid_str, architecture, win_errstr(result)));
+               goto done;
+       }
+
+       result = winreg_printer_write_date(tmp_ctx, winreg_handle,
+                                          &key_hnd, "DriverDate",
+                                          r->driver_date);
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       result = winreg_printer_write_ver(tmp_ctx, winreg_handle,
+                                         &key_hnd, "DriverVersion",
+                                         r->driver_version);
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       status = dcerpc_winreg_set_sz(tmp_ctx,
+                                     winreg_handle,
+                                     &key_hnd,
+                                     "InfPath",
+                                     r->szPackageID,
+                                     &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               result = ntstatus_to_werror(status);
+       }
+       if (!W_ERROR_IS_OK(result)) {
+               goto done;
+       }
+
+       result = WERR_OK;
+done:
+       if (winreg_handle != NULL) {
+               WERROR ignore;
+
+               if (is_valid_policy_hnd(&key_hnd)) {
+                       dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, 
&key_hnd, &ignore);
+               }
+               if (is_valid_policy_hnd(&hive_hnd)) {
+                       dcerpc_winreg_CloseKey(winreg_handle, tmp_ctx, 
&hive_hnd, &ignore);
+               }
+       }
+
+       TALLOC_FREE(tmp_ctx);
+       return result;
+}
+
+WERROR winreg_add_driver_package(TALLOC_CTX *mem_ctx,
+                                struct dcerpc_binding_handle *winreg_handle,
+                                const char *package_id,
+                                const char *architecture,
+                                const char *driver_store_path,
+                                const char *cab_path)
+{
+       uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+       struct policy_handle hive_hnd, key_hnd;
+       TALLOC_CTX *tmp_ctx = NULL;
+       NTSTATUS status;
+       WERROR result;
+       const char *path;
+
+       ZERO_STRUCT(hive_hnd);
+       ZERO_STRUCT(key_hnd);
+
+       tmp_ctx = talloc_stackframe();
+       if (tmp_ctx == NULL) {
+               return WERR_NOT_ENOUGH_MEMORY;
+       }
+
+       path = talloc_asprintf(tmp_ctx, "%s\\%s\\DriverPackages",
+                                       TOP_LEVEL_PRINT_PACKAGEINSTALLATION_KEY,
+                                       architecture);
+       if (path == NULL) {
+               result = WERR_NOT_ENOUGH_MEMORY;
+               goto done;
+       }
+
+       result = winreg_printer_openkey(tmp_ctx,
+                                       winreg_handle,
+                                       path,
+                                       package_id, /* key */
+                                       true,


-- 
Samba Shared Repository

Reply via email to