summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2011-07-05 00:55:35 +0200
committerGünther Deschner <gd@samba.org>2011-07-07 18:06:02 +0200
commit72b1f8be5619ed778c4aa0b967f6a4f34d7e9de8 (patch)
tree9b82a9252c69476d80b1bfe30a6a2747aa7bb473
parent0a1ec73b965f66977a90fb7febb3b56b52ebab20 (diff)
downloadsamba-72b1f8be5619ed778c4aa0b967f6a4f34d7e9de8.tar.gz
samba-72b1f8be5619ed778c4aa0b967f6a4f34d7e9de8.tar.bz2
samba-72b1f8be5619ed778c4aa0b967f6a4f34d7e9de8.zip
s3-printing: safe a ton of roundtrips by reusing existing winreg binding_handles.
Guenther Pair-Programmed-With: David Disseldorp <ddiss@suse.de>
-rw-r--r--source3/printing/nt_printing.c33
-rw-r--r--source3/printing/nt_printing_ads.c13
-rw-r--r--source3/rpc_server/spoolss/srv_spoolss_nt.c339
3 files changed, 229 insertions, 156 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 1887a61119..fd2ab2a197 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -32,6 +32,7 @@
#include "auth.h"
#include "messages.h"
#include "rpc_server/spoolss/srv_spoolss_nt.h"
+#include "rpc_client/cli_winreg_spoolss.h"
/* Map generic permissions to printer object specific permissions */
@@ -1182,6 +1183,7 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
bool in_use = False;
struct spoolss_PrinterInfo2 *pinfo2 = NULL;
WERROR result;
+ struct dcerpc_binding_handle *b = NULL;
if (!r) {
return false;
@@ -1196,7 +1198,17 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
continue;
}
- result = winreg_get_printer_internal(mem_ctx, session_info, msg_ctx,
+ if (b == NULL) {
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return false;
+ }
+ }
+
+ result = winreg_get_printer(mem_ctx, b,
lp_servicename(snum),
&pinfo2);
if (!W_ERROR_IS_OK(result)) {
@@ -1222,18 +1234,18 @@ bool printer_driver_in_use(TALLOC_CTX *mem_ctx,
"Windows NT x86" version 2 or 3 left */
if (!strequal("Windows NT x86", r->architecture)) {
- werr = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+ werr = winreg_get_driver(mem_ctx, b,
"Windows NT x86",
r->driver_name,
DRIVER_ANY_VERSION,
&driver);
} else if (r->version == 2) {
- werr = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+ werr = winreg_get_driver(mem_ctx, b,
"Windows NT x86",
r->driver_name,
3, &driver);
} else if (r->version == 3) {
- werr = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+ werr = winreg_get_driver(mem_ctx, b,
"Windows NT x86",
r->driver_name,
2, &driver);
@@ -1412,6 +1424,7 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
uint32_t num_drivers;
const char **drivers;
WERROR result;
+ struct dcerpc_binding_handle *b;
if ( !info )
return False;
@@ -1424,7 +1437,15 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
/* get the list of drivers */
- result = winreg_get_driver_list_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return false;
+ }
+
+ result = winreg_get_driver_list(mem_ctx, b,
info->architecture, version,
&num_drivers, &drivers);
if (!W_ERROR_IS_OK(result)) {
@@ -1441,7 +1462,7 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
driver = NULL;
- result = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_get_driver(mem_ctx, b,
info->architecture, drivers[i],
version, &driver);
if (!W_ERROR_IS_OK(result)) {
diff --git a/source3/printing/nt_printing_ads.c b/source3/printing/nt_printing_ads.c
index c5e3f99fb6..beb5240423 100644
--- a/source3/printing/nt_printing_ads.c
+++ b/source3/printing/nt_printing_ads.c
@@ -399,8 +399,17 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
uint32_t data_size;
WERROR result;
NTSTATUS status;
+ struct dcerpc_binding_handle *b;
- result = winreg_get_printer_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return false;
+ }
+
+ result = winreg_get_printer(mem_ctx, b,
printer, &pinfo2);
if (!W_ERROR_IS_OK(result)) {
return false;
@@ -417,7 +426,7 @@ bool is_printer_published(TALLOC_CTX *mem_ctx,
/* fetching printer guids really ought to be a separate function. */
- result = winreg_get_printer_dataex_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_get_printer_dataex(mem_ctx, b,
printer,
SPOOL_DSSPOOLER_KEY, "objectGUID",
&type, &data, &data_size);
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index 19a7d78673..0bf678780b 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -1543,6 +1543,7 @@ void do_drv_upgrade_printer(struct messaging_context *msg,
const char *drivername;
int snum;
int n_services = lp_numservices();
+ struct dcerpc_binding_handle *b = NULL;
tmp_ctx = talloc_new(NULL);
if (!tmp_ctx) return;
@@ -1575,7 +1576,17 @@ void do_drv_upgrade_printer(struct messaging_context *msg,
continue;
}
- result = winreg_get_printer_internal(tmp_ctx, session_info, msg,
+ if (b == NULL) {
+ result = winreg_printer_binding_handle(tmp_ctx,
+ session_info,
+ msg,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ break;
+ }
+ }
+
+ result = winreg_get_printer(tmp_ctx, b,
lp_const_servicename(snum),
&pinfo2);
@@ -1594,9 +1605,7 @@ void do_drv_upgrade_printer(struct messaging_context *msg,
DEBUG(6,("Updating printer [%s]\n", pinfo2->printername));
/* all we care about currently is the change_id */
- result = winreg_printer_update_changeid_internal(tmp_ctx,
- session_info,
- msg,
+ result = winreg_printer_update_changeid(tmp_ctx, b,
pinfo2->printername);
if (!W_ERROR_IS_OK(result)) {
@@ -2077,6 +2086,7 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
struct spoolss_DriverInfo8 *info_win2k = NULL;
int version;
WERROR status;
+ struct dcerpc_binding_handle *b;
/* if the user is not root, doesn't have SE_PRINT_OPERATOR privilege,
and not a printer admin, then fail */
@@ -2098,9 +2108,15 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
if ((version = get_version_id(r->in.architecture)) == -1)
return WERR_INVALID_ENVIRONMENT;
- status = winreg_get_driver_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
+ status = winreg_get_driver(p->mem_ctx, b,
r->in.architecture, r->in.driver,
version, &info);
if (!W_ERROR_IS_OK(status)) {
@@ -2109,9 +2125,7 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
if ( version == 2 ) {
version = 3;
- status = winreg_get_driver_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_get_driver(p->mem_ctx, b,
r->in.architecture,
r->in.driver,
version, &info);
@@ -2137,18 +2151,14 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
}
if (version == 2) {
- status = winreg_get_driver_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_get_driver(p->mem_ctx, b,
r->in.architecture,
r->in.driver, 3, &info_win2k);
if (W_ERROR_IS_OK(status)) {
/* if we get to here, we now have 2 driver info structures to remove */
/* remove the Win2k driver first*/
- status = winreg_del_driver_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_del_driver(p->mem_ctx, b,
info_win2k, 3);
talloc_free(info_win2k);
@@ -2159,9 +2169,7 @@ WERROR _spoolss_DeletePrinterDriver(struct pipes_struct *p,
}
}
- status = winreg_del_driver_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_del_driver(p->mem_ctx, b,
info, version);
done:
@@ -2182,6 +2190,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
int version;
bool delete_files;
WERROR status;
+ struct dcerpc_binding_handle *b;
/* if the user is not root, doesn't have SE_PRINT_OPERATOR privilege,
and not a printer admin, then fail */
@@ -2206,9 +2215,15 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
if (r->in.delete_flags & DPD_DELETE_SPECIFIC_VERSION)
version = r->in.version;
- status = winreg_get_driver_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
+ status = winreg_get_driver(p->mem_ctx, b,
r->in.architecture,
r->in.driver,
version,
@@ -2228,9 +2243,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
/* try for Win2k driver if "Windows NT x86" */
version = 3;
- status = winreg_get_driver_internal(info,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_get_driver(info, b,
r->in.architecture,
r->in.driver,
version, &info);
@@ -2279,9 +2292,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
/* also check for W32X86/3 if necessary; maybe we already have? */
if ( (version == 2) && ((r->in.delete_flags & DPD_DELETE_SPECIFIC_VERSION) != DPD_DELETE_SPECIFIC_VERSION) ) {
- status = winreg_get_driver_internal(info,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_get_driver(info, b,
r->in.architecture,
r->in.driver, 3, &info_win2k);
if (W_ERROR_IS_OK(status)) {
@@ -2301,9 +2312,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
/* if we get to here, we now have 2 driver info structures to remove */
/* remove the Win2k driver first*/
- status = winreg_del_driver_internal(info,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_del_driver(info, b,
info_win2k,
3);
@@ -2325,9 +2334,7 @@ WERROR _spoolss_DeletePrinterDriverEx(struct pipes_struct *p,
}
}
- status = winreg_del_driver_internal(info,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_del_driver(info, b,
info,
version);
if (!W_ERROR_IS_OK(status)) {
@@ -4305,6 +4312,7 @@ static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
union spoolss_PrinterInfo *info = NULL;
uint32_t count = 0;
WERROR result = WERR_OK;
+ struct dcerpc_binding_handle *b = NULL;
*count_p = 0;
*info_p = NULL;
@@ -4323,9 +4331,17 @@ static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
DEBUG(4,("Found a printer in smb.conf: %s[%x]\n",
printer, snum));
- result = winreg_create_printer_internal(mem_ctx,
- session_info,
- msg_ctx,
+ if (b == NULL) {
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ goto out;
+ }
+ }
+
+ result = winreg_create_printer(mem_ctx, b,
printer);
if (!W_ERROR_IS_OK(result)) {
goto out;
@@ -4339,7 +4355,7 @@ static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
goto out;
}
- result = winreg_get_printer_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_get_printer(mem_ctx, b,
printer, &info2);
if (!W_ERROR_IS_OK(result)) {
goto out;
@@ -5529,14 +5545,21 @@ static WERROR construct_printer_driver_info_level(TALLOC_CTX *mem_ctx,
struct spoolss_PrinterInfo2 *pinfo2 = NULL;
struct spoolss_DriverInfo8 *driver;
WERROR result;
+ struct dcerpc_binding_handle *b;
if (level == 101) {
return WERR_UNKNOWN_LEVEL;
}
- result = winreg_get_printer_internal(mem_ctx,
- session_info,
- msg_ctx,
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return result;
+ }
+
+ result = winreg_get_printer(mem_ctx, b,
lp_const_servicename(snum),
&pinfo2);
@@ -5547,7 +5570,7 @@ static WERROR construct_printer_driver_info_level(TALLOC_CTX *mem_ctx,
return WERR_INVALID_PRINTER_NAME;
}
- result = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_get_driver(mem_ctx, b,
architecture,
pinfo2->drivername, version, &driver);
@@ -5566,7 +5589,7 @@ static WERROR construct_printer_driver_info_level(TALLOC_CTX *mem_ctx,
/* Yes - try again with a WinNT driver. */
version = 2;
- result = winreg_get_driver_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_get_driver(mem_ctx, b,
architecture,
pinfo2->drivername,
version, &driver);
@@ -5966,8 +5989,8 @@ static WERROR update_printer_sec(struct policy_handle *handle,
const char *printer;
WERROR result;
int snum;
-
struct printer_handle *Printer = find_printer_index_by_hnd(p, handle);
+ struct dcerpc_binding_handle *b;
if (!Printer || !get_printer_snum(p, handle, &snum, NULL)) {
DEBUG(2,("update_printer_sec: Invalid handle (%s:%u:%u)\n",
@@ -5995,11 +6018,17 @@ static WERROR update_printer_sec(struct policy_handle *handle,
goto done;
}
+ result = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ goto done;
+ }
+
/* NT seems to like setting the security descriptor even though
nothing may have actually changed. */
- result = winreg_get_printer_secdesc_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_get_printer_secdesc(p->mem_ctx, b,
printer,
&old_secdesc);
if (!W_ERROR_IS_OK(result)) {
@@ -6049,9 +6078,7 @@ static WERROR update_printer_sec(struct policy_handle *handle,
goto done;
}
- result = winreg_set_printer_secdesc_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_set_printer_secdesc(p->mem_ctx, b,
printer,
new_secdesc);
@@ -6257,12 +6284,19 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
const char *spooling;
DATA_BLOB buffer;
WERROR result = WERR_OK;
+ struct dcerpc_binding_handle *b;
+
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return result;
+ }
if (force_update || !strequal(printer->drivername, old_printer->drivername)) {
push_reg_sz(mem_ctx, &buffer, printer->drivername);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_DRIVERNAME,
@@ -6282,9 +6316,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || !strequal(printer->comment, old_printer->comment)) {
push_reg_sz(mem_ctx, &buffer, printer->comment);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_DESCRIPTION,
@@ -6301,9 +6333,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || !strequal(printer->sharename, old_printer->sharename)) {
push_reg_sz(mem_ctx, &buffer, printer->sharename);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTSHARENAME,
@@ -6330,9 +6360,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
}
push_reg_sz(mem_ctx, &buffer, p);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTERNAME,
@@ -6348,9 +6376,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || !strequal(printer->portname, old_printer->portname)) {
push_reg_sz(mem_ctx, &buffer, printer->portname);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PORTNAME,
@@ -6367,9 +6393,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || !strequal(printer->location, old_printer->location)) {
push_reg_sz(mem_ctx, &buffer, printer->location);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_LOCATION,
@@ -6387,9 +6411,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || !strequal(printer->sepfile, old_printer->sepfile)) {
push_reg_sz(mem_ctx, &buffer, printer->sepfile);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTSEPARATORFILE,
@@ -6408,9 +6430,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || printer->starttime != old_printer->starttime) {
buffer = data_blob_talloc(mem_ctx, NULL, 4);
SIVAL(buffer.data, 0, printer->starttime);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTSTARTTIME,
@@ -6422,9 +6442,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || printer->untiltime != old_printer->untiltime) {
buffer = data_blob_talloc(mem_ctx, NULL, 4);
SIVAL(buffer.data, 0, printer->untiltime);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTENDTIME,
@@ -6436,9 +6454,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
if (force_update || printer->priority != old_printer->priority) {
buffer = data_blob_talloc(mem_ctx, NULL, 4);
SIVAL(buffer.data, 0, printer->priority);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRIORITY,
@@ -6451,9 +6467,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
buffer = data_blob_talloc(mem_ctx, NULL, 4);
SIVAL(buffer.data, 0, (printer->attributes &
PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS));
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTKEEPPRINTEDJOBS,
@@ -6475,9 +6489,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
spooling = "unknown";
}
push_reg_sz(mem_ctx, &buffer, spooling);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_PRINTSPOOLING,
@@ -6487,9 +6499,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
}
push_reg_sz(mem_ctx, &buffer, lp_netbios_name());
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_SHORTSERVERNAME,
@@ -6509,9 +6519,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
}
push_reg_sz(mem_ctx, &buffer, longname);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_SERVERNAME,
@@ -6522,9 +6530,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx,
uncname = talloc_asprintf(mem_ctx, "\\\\%s\\%s",
lp_netbios_name(), printer->sharename);
push_reg_sz(mem_ctx, &buffer, uncname);
- winreg_set_printer_dataex_internal(mem_ctx,
- session_info,
- msg_ctx,
+ winreg_set_printer_dataex(mem_ctx, b,
printer->sharename,
SPOOL_DSSPOOLER_KEY,
SPOOL_REG_UNCNAME,
@@ -6553,6 +6559,7 @@ static WERROR update_printer(struct pipes_struct *p,
int snum;
WERROR result = WERR_OK;
TALLOC_CTX *tmp_ctx;
+ struct dcerpc_binding_handle *b;
DEBUG(8,("update_printer\n"));
@@ -6571,9 +6578,15 @@ static WERROR update_printer(struct pipes_struct *p,
goto done;
}
- result = winreg_get_printer_internal(tmp_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_printer_binding_handle(tmp_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ goto done;
+ }
+
+ result = winreg_get_printer(tmp_ctx, b,
lp_const_servicename(snum),
&old_printer);
if (!W_ERROR_IS_OK(result)) {
@@ -6635,9 +6648,7 @@ static WERROR update_printer(struct pipes_struct *p,
if (devmode == NULL) {
printer_mask &= ~SPOOLSS_PRINTER_INFO_DEVMODE;
}
- result = winreg_update_printer_internal(tmp_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_update_printer(tmp_ctx, b,
printer->sharename,
printer_mask,
printer,
@@ -7324,12 +7335,21 @@ static WERROR enumprinterdrivers_level_by_architecture(TALLOC_CTX *mem_ctx,
WERROR result = WERR_OK;
uint32_t num_drivers;
const char **drivers;
+ struct dcerpc_binding_handle *b;
*count_p = 0;
*info_p = NULL;
+ result = winreg_printer_binding_handle(mem_ctx,
+ session_info,
+ msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ goto out;
+ }
+
for (version=0; version<DRIVER_MAX_VERSION; version++) {
- result = winreg_get_driver_list_internal(mem_ctx, session_info, msg_ctx,
+ result = winreg_get_driver_list(mem_ctx, b,
architecture, version,
&num_drivers, &drivers);
if (!W_ERROR_IS_OK(result)) {
@@ -7354,8 +7374,7 @@ static WERROR enumprinterdrivers_level_by_architecture(TALLOC_CTX *mem_ctx,
for (i = 0; i < num_drivers; i++) {
DEBUG(5, ("\tdriver: [%s]\n", drivers[i]));
- result = winreg_get_driver_internal(mem_ctx, session_info,
- msg_ctx,
+ result = winreg_get_driver(mem_ctx, b,
architecture, drivers[i],
version, &driver);
if (!W_ERROR_IS_OK(result)) {
@@ -8517,8 +8536,8 @@ WERROR _spoolss_AddForm(struct pipes_struct *p,
struct spoolss_AddFormInfo1 *form = r->in.info.info1;
int snum = -1;
WERROR status = WERR_OK;
-
struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
+ struct dcerpc_binding_handle *b;
DEBUG(5,("_spoolss_AddForm\n"));
@@ -8551,9 +8570,15 @@ WERROR _spoolss_AddForm(struct pipes_struct *p,
return WERR_INVALID_PARAM;
}
- status = winreg_printer_addform1_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
+ status = winreg_printer_addform1(p->mem_ctx, b,
form);
if (!W_ERROR_IS_OK(status)) {
return status;
@@ -8567,9 +8592,7 @@ WERROR _spoolss_AddForm(struct pipes_struct *p,
return WERR_BADFID;
}
- status = winreg_printer_update_changeid_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_update_changeid(p->mem_ctx, b,
lp_const_servicename(snum));
if (!W_ERROR_IS_OK(status)) {
return status;
@@ -8590,6 +8613,7 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
int snum = -1;
WERROR status = WERR_OK;
+ struct dcerpc_binding_handle *b;
DEBUG(5,("_spoolss_DeleteForm\n"));
@@ -8610,9 +8634,15 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
return WERR_ACCESS_DENIED;
}
- status = winreg_printer_deleteform1_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
+ status = winreg_printer_deleteform1(p->mem_ctx, b,
form_name);
if (!W_ERROR_IS_OK(status)) {
return status;
@@ -8626,9 +8656,7 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
return WERR_BADFID;
}
- status = winreg_printer_update_changeid_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_update_changeid(p->mem_ctx, b,
lp_const_servicename(snum));
if (!W_ERROR_IS_OK(status)) {
return status;
@@ -8649,6 +8677,7 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
const char *form_name = r->in.form_name;
int snum = -1;
WERROR status = WERR_OK;
+ struct dcerpc_binding_handle *b;
struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
@@ -8674,9 +8703,15 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
return WERR_ACCESS_DENIED;
}
- status = winreg_printer_setform1_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
+ status = winreg_printer_setform1(p->mem_ctx, b,
form_name,
form);
if (!W_ERROR_IS_OK(status)) {
@@ -8691,9 +8726,7 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
return WERR_BADFID;
}
- status = winreg_printer_update_changeid_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_update_changeid(p->mem_ctx, b,
lp_const_servicename(snum));
if (!W_ERROR_IS_OK(status)) {
return status;
@@ -9250,7 +9283,7 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
enum winreg_Type val_type = REG_NONE;
uint8_t *val_data = NULL;
uint32_t val_size = 0;
-
+ struct dcerpc_binding_handle *b;
DEBUG(4,("_spoolss_GetPrinterDataEx\n"));
@@ -9308,6 +9341,14 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
return WERR_INVALID_PARAM;
}
+ result = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return result;
+ }
+
/* XP sends this and wants the ChangeID value from PRINTER_INFO_0 */
if (strequal(r->in.key_name, SPOOL_PRINTERDATA_KEY) &&
strequal(r->in.value_name, "ChangeId")) {
@@ -9316,9 +9357,7 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
if (r->in.offered >= *r->out.needed) {
uint32_t changeid = 0;
- result = winreg_printer_get_changeid_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_printer_get_changeid(p->mem_ctx, b,
printer,
&changeid);
if (!W_ERROR_IS_OK(result)) {
@@ -9331,9 +9370,7 @@ WERROR _spoolss_GetPrinterDataEx(struct pipes_struct *p,
goto done;
}
- result = winreg_get_printer_dataex_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_get_printer_dataex(p->mem_ctx, b,
printer,
r->in.key_name,
r->in.value_name,
@@ -9370,6 +9407,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
WERROR result = WERR_OK;
struct printer_handle *Printer = find_printer_index_by_hnd(p, r->in.handle);
char *oid_string;
+ struct dcerpc_binding_handle *b;
DEBUG(4,("_spoolss_SetPrinterDataEx\n"));
@@ -9406,9 +9444,15 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
return WERR_ACCESS_DENIED;
}
- result = winreg_get_printer_internal(Printer,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(result)) {
+ return result;
+ }
+
+ result = winreg_get_printer(Printer, b,
lp_servicename(snum),
&pinfo2);
if (!W_ERROR_IS_OK(result)) {
@@ -9425,9 +9469,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
/* save the registry data */
- result = winreg_set_printer_dataex_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_set_printer_dataex(p->mem_ctx, b,
pinfo2->sharename,
r->in.key_name,
r->in.value_name,
@@ -9451,9 +9493,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
* previous set_printer_dataex() call. I have no idea if
* this is right. --jerry
*/
- winreg_set_printer_dataex_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ winreg_set_printer_dataex(p->mem_ctx, b,
pinfo2->sharename,
str,
r->in.value_name,
@@ -9462,9 +9502,7 @@ WERROR _spoolss_SetPrinterDataEx(struct pipes_struct *p,
strlen(oid_string) + 1);
}
- result = winreg_printer_update_changeid_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ result = winreg_printer_update_changeid(p->mem_ctx, b,
lp_const_servicename(snum));
}
@@ -9600,6 +9638,7 @@ WERROR _spoolss_DeletePrinterKey(struct pipes_struct *p,
int snum=0;
WERROR status;
const char *printer;
+ struct dcerpc_binding_handle *b;
DEBUG(5,("_spoolss_DeletePrinterKey\n"));
@@ -9625,16 +9664,20 @@ WERROR _spoolss_DeletePrinterKey(struct pipes_struct *p,
printer = lp_const_servicename(snum);
+ status = winreg_printer_binding_handle(p->mem_ctx,
+ get_session_info_system(),
+ p->msg_ctx,
+ &b);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
/* delete the key and all subkeys */
- status = winreg_delete_printer_key_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_delete_printer_key(p->mem_ctx, b,
printer,
r->in.key_name);
if (W_ERROR_IS_OK(status)) {
- status = winreg_printer_update_changeid_internal(p->mem_ctx,
- get_session_info_system(),
- p->msg_ctx,
+ status = winreg_printer_update_changeid(p->mem_ctx, b,
printer);
}