[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha6-1014-g6696170
Günther Deschner
gd at samba.org
Thu Feb 19 18:28:25 GMT 2009
The branch, master has been updated
via 669617036eecbbe2fb9b53c15faa76be147d916a (commit)
via 38fde6d5d9abd7faf5053c746acebba342c5d335 (commit)
via 0470feeb7f40e31b9fc899988a55b19bd1290d9e (commit)
from c71fa39c29ee64b80adf92090a61c81f323742b9 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 669617036eecbbe2fb9b53c15faa76be147d916a
Author: Günther Deschner <gd at samba.org>
Date: Thu Feb 19 19:02:48 2009 +0100
s3-spoolss: fix vista fallback in _spoolss_AddPrinterDriverEx.
Martin Zielinski, if you're reading this, please have a look. Vista nicely takes
just a WERR_UNKNOWN_LEVEL here and retries with a level 6 add.
Guenther
commit 38fde6d5d9abd7faf5053c746acebba342c5d335
Author: Günther Deschner <gd at samba.org>
Date: Wed Feb 18 19:00:29 2009 +0100
s3-spoolss: remove old spoolss_AddPrinterDriver{Ex}.
Guenther
commit 0470feeb7f40e31b9fc899988a55b19bd1290d9e
Author: Günther Deschner <gd at samba.org>
Date: Wed Feb 18 18:59:43 2009 +0100
s3-spoolss: use pidl for _spoolss_AddPrinterDriver{Ex}.
Guenther
-----------------------------------------------------------------------
Summary of changes:
source3/include/proto.h | 8 -
source3/include/rpc_spoolss.h | 16 --
source3/rpc_parse/parse_spoolss.c | 185 -----------------------
source3/rpc_server/srv_spoolss.c | 62 +--------
source3/rpc_server/srv_spoolss_nt.c | 283 ++++++++++++++++++++++++++---------
5 files changed, 217 insertions(+), 337 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 63adbf5..3806c96 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5964,12 +5964,6 @@ bool make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src);
bool spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
-bool spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth);
-bool spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth);
-bool uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
- NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc);
-bool uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
- NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc);
bool uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
NT_PRINTER_INFO_LEVEL_2 *d);
bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth);
@@ -6226,8 +6220,6 @@ WERROR _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS
WERROR _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMFORMS *r_u);
WERROR enumports_hook(TALLOC_CTX *ctx, int *count, char ***lines );
WERROR _spoolss_enumports( pipes_struct *p, SPOOL_Q_ENUMPORTS *q_u, SPOOL_R_ENUMPORTS *r_u);
-WERROR _spoolss_addprinterdriver(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVER *q_u, SPOOL_R_ADDPRINTERDRIVER *r_u);
-WERROR _spoolss_addprinterdriverex(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, SPOOL_R_ADDPRINTERDRIVEREX *r_u);
WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, SPOOL_R_ENUMPRINTERDATA *r_u);
WERROR _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SPOOL_R_SETPRINTERDATA *r_u);
WERROR _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, SPOOL_R_ENUMPRINTPROCESSORS *r_u);
diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h
index d7d93e3..99da007 100644
--- a/source3/include/rpc_spoolss.h
+++ b/source3/include/rpc_spoolss.h
@@ -1178,22 +1178,6 @@ typedef struct spool_r_addprinterdriver
}
SPOOL_R_ADDPRINTERDRIVER;
-typedef struct spool_q_addprinterdriverex
-{
- uint32 server_name_ptr;
- UNISTR2 server_name;
- uint32 level;
- SPOOL_PRINTER_DRIVER_INFO_LEVEL info;
- uint32 copy_flags;
-}
-SPOOL_Q_ADDPRINTERDRIVEREX;
-
-typedef struct spool_r_addprinterdriverex
-{
- WERROR status;
-}
-SPOOL_R_ADDPRINTERDRIVEREX;
-
typedef struct spool_q_enumprintprocessors
{
uint32 name_ptr;
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c
index b798eef..577ba73 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -3859,47 +3859,6 @@ bool spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER
}
/*******************************************************************
- convert a buffer of UNICODE strings null terminated
- the buffer is terminated by a NULL
-
- convert to an dos codepage array (null terminated)
-
- dynamically allocate memory
-
-********************************************************************/
-
-static bool uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
-{
- fstring f;
- int n = 0;
- char *src;
-
- if (buf5==NULL)
- return False;
-
- src = (char *)buf5->buffer;
- *ar = SMB_MALLOC_ARRAY(fstring, 1);
- if (!*ar) {
- return False;
- }
-
- while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
- rpcstr_pull(f, src, sizeof(f)-1, -1, STR_TERMINATE);
- src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
- *ar = SMB_REALLOC_ARRAY(*ar, fstring, n+2);
- if (!*ar) {
- return False;
- }
- fstrcpy((*ar)[n], f);
- n++;
- }
-
- fstrcpy((*ar)[n], "");
-
- return True;
-}
-
-/*******************************************************************
read a UNICODE array with null terminated strings
and null terminated array
and size of array at beginning
@@ -4125,152 +4084,8 @@ bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q
}
/*******************************************************************
- fill in the prs_struct for a ADDPRINTERDRIVER request PDU
********************************************************************/
-bool spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
-{
- prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
- depth++;
-
- if(!prs_align(ps))
- return False;
-
- if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
- return False;
- if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
- return False;
-
- if(!prs_align(ps))
- return False;
- if(!prs_uint32("info_level", ps, depth, &q_u->level))
- return False;
-
- if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
- return False;
-
- if(!prs_align(ps))
- return False;
- if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
- return False;
-
- return True;
-}
-
-/*******************************************************************
-********************************************************************/
-
-bool spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
-{
- prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
- depth++;
-
- if(!prs_werror("status", ps, depth, &q_u->status))
- return False;
-
- return True;
-}
-
-/*******************************************************************
-********************************************************************/
-
-bool uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
- NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
-{
- NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
-
- DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
-
- if (*asc==NULL)
- {
- *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
- if(*asc == NULL)
- return False;
- ZERO_STRUCTP(*asc);
- }
-
- d=*asc;
-
- d->cversion=uni->cversion;
-
- unistr2_to_ascii(d->name, &uni->name, sizeof(d->name));
- unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment));
- unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath));
- unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile));
- unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile));
- unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile));
- unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname));
- unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
-
- DEBUGADD(8,( "version: %d\n", d->cversion));
- DEBUGADD(8,( "name: %s\n", d->name));
- DEBUGADD(8,( "environment: %s\n", d->environment));
- DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
- DEBUGADD(8,( "datafile: %s\n", d->datafile));
- DEBUGADD(8,( "configfile: %s\n", d->configfile));
- DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
- DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
- DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
-
- if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
- return True;
-
- SAFE_FREE(*asc);
- return False;
-}
-
-/*******************************************************************
-********************************************************************/
-bool uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
- NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
-{
- NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
-
- DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
-
- if (*asc==NULL)
- {
- *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
- if(*asc == NULL)
- return False;
- ZERO_STRUCTP(*asc);
- }
-
- d=*asc;
-
- d->version=uni->version;
-
- unistr2_to_ascii(d->name, &uni->name, sizeof(d->name));
- unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment));
- unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath));
- unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile));
- unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile));
- unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile));
- unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname));
- unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
-
- DEBUGADD(8,( "version: %d\n", d->version));
- DEBUGADD(8,( "name: %s\n", d->name));
- DEBUGADD(8,( "environment: %s\n", d->environment));
- DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
- DEBUGADD(8,( "datafile: %s\n", d->datafile));
- DEBUGADD(8,( "configfile: %s\n", d->configfile));
- DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
- DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
- DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
-
- if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
- goto error;
- if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
- goto error;
-
- return True;
-
-error:
- SAFE_FREE(*asc);
- return False;
-}
-
bool uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
NT_PRINTER_INFO_LEVEL_2 *d)
{
diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c
index 639dbde..7bb71ab 100644
--- a/source3/rpc_server/srv_spoolss.c
+++ b/source3/rpc_server/srv_spoolss.c
@@ -538,36 +538,7 @@ static bool api_spoolss_addprinterex(pipes_struct *p)
static bool api_spoolss_addprinterdriver(pipes_struct *p)
{
- SPOOL_Q_ADDPRINTERDRIVER q_u;
- SPOOL_R_ADDPRINTERDRIVER r_u;
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if(!spoolss_io_q_addprinterdriver("", &q_u, data, 0)) {
- if (q_u.level != 3 && q_u.level != 6) {
- /* Clever hack from Martin Zielinski <mz at seh.de>
- * to allow downgrade from level 8 (Vista).
- */
- DEBUG(3,("api_spoolss_addprinterdriver: unknown SPOOL_Q_ADDPRINTERDRIVER level %u.\n",
- (unsigned int)q_u.level ));
- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_INVALID_TAG));
- return True;
- }
- DEBUG(0,("spoolss_io_q_addprinterdriver: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVER.\n"));
- return False;
- }
-
- r_u.status = _spoolss_addprinterdriver(p, &q_u, &r_u);
-
- if(!spoolss_io_r_addprinterdriver("", &r_u, rdata, 0)) {
- DEBUG(0,("spoolss_io_r_addprinterdriver: unable to marshall SPOOL_R_ADDPRINTERDRIVER.\n"));
- return False;
- }
-
- return True;
+ return proxy_spoolss_call(p, NDR_SPOOLSS_ADDPRINTERDRIVER);
}
/****************************************************************************
@@ -889,36 +860,7 @@ static bool api_spoolss_deleteprinterkey(pipes_struct *p)
static bool api_spoolss_addprinterdriverex(pipes_struct *p)
{
- SPOOL_Q_ADDPRINTERDRIVEREX q_u;
- SPOOL_R_ADDPRINTERDRIVEREX r_u;
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if(!spoolss_io_q_addprinterdriverex("", &q_u, data, 0)) {
- if (q_u.level != 3 && q_u.level != 6) {
- /* Clever hack from Martin Zielinski <mz at seh.de>
- * to allow downgrade from level 8 (Vista).
- */
- DEBUG(3,("api_spoolss_addprinterdriverex: unknown SPOOL_Q_ADDPRINTERDRIVEREX level %u.\n",
- (unsigned int)q_u.level ));
- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_INVALID_TAG));
- return True;
- }
- DEBUG(0,("spoolss_io_q_addprinterdriverex: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVEREX.\n"));
- return False;
- }
-
- r_u.status = _spoolss_addprinterdriverex(p, &q_u, &r_u);
-
- if(!spoolss_io_r_addprinterdriverex("", &r_u, rdata, 0)) {
- DEBUG(0,("spoolss_io_r_addprinterdriverex: unable to marshall SPOOL_R_ADDPRINTERDRIVEREX.\n"));
- return False;
- }
-
- return True;
+ return proxy_spoolss_call(p, NDR_SPOOLSS_ADDPRINTERDRIVEREX);
}
/****************************************************************************
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 9d7e4d2..7439fe5 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -1800,27 +1800,175 @@ static bool convert_printer_info_new(struct spoolss_SetPrinterInfoCtr *info_ctr,
return false;
}
-static bool convert_printer_driver_info(const SPOOL_PRINTER_DRIVER_INFO_LEVEL *uni,
- NT_PRINTER_DRIVER_INFO_LEVEL *printer, uint32 level)
+/*******************************************************************
+********************************************************************/
+
+static bool string_array_to_fstring_array(const char **sarray, fstring **farray)
{
- bool result = True;
+ int i;
+
+ if (!sarray) {
+ *farray = NULL;
+ return true;
+ }
+
+ *farray = SMB_MALLOC_ARRAY(fstring, 1);
+ if (!*farray) {
+ return false;
+ }
+
+ for (i=0; sarray[i] != NULL; i++) {
+ *farray = SMB_REALLOC_ARRAY(*farray, fstring, i+2);
+ if (!*farray) {
+ return false;
+ }
+ fstrcpy((*farray)[i], sarray[i]);
+ }
+
+ fstrcpy((*farray)[i], "");
+ return true;
+}
+
+/*******************************************************************
+********************************************************************/
+
+static bool driver_info3_to_nt_driver_info3(struct spoolss_AddDriverInfo3 *r,
+ NT_PRINTER_DRIVER_INFO_LEVEL_3 **p)
+{
+ NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
+
+ DEBUG(7,("driver_info3_to_nt_driver_info3: Converting from UNICODE to ASCII\n"));
+
+ if (*p == NULL) {
+ *p = SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
+ if (*p == NULL) {
+ return false;
+ }
+ ZERO_STRUCTP(*p);
+ }
+
+ d = *p;
+
+ d->cversion = r->version;
+
+ fstrcpy(d->name, r->driver_name);
+ fstrcpy(d->environment, r->architecture);
+ fstrcpy(d->driverpath, r->driver_path);
+ fstrcpy(d->datafile, r->data_file);
+ fstrcpy(d->configfile, r->config_file);
+ fstrcpy(d->helpfile, r->help_file);
+ fstrcpy(d->monitorname, r->monitor_name);
+ fstrcpy(d->defaultdatatype, r->default_datatype);
+
+ DEBUGADD(8,( "version: %d\n", d->cversion));
+ DEBUGADD(8,( "name: %s\n", d->name));
+ DEBUGADD(8,( "environment: %s\n", d->environment));
+ DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
+ DEBUGADD(8,( "datafile: %s\n", d->datafile));
+ DEBUGADD(8,( "configfile: %s\n", d->configfile));
+ DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
+ DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
+ DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
+
+ if (r->dependent_files) {
+ if (!string_array_to_fstring_array(r->dependent_files->string,
+ &d->dependentfiles)) {
+ SAFE_FREE(*p);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/*******************************************************************
+********************************************************************/
+
+static bool driver_info6_to_nt_driver_info6(struct spoolss_AddDriverInfo6 *r,
+ NT_PRINTER_DRIVER_INFO_LEVEL_6 **p)
+{
+ NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
+
+ DEBUG(7,("driver_info6_to_nt_driver_info6: Converting from UNICODE to ASCII\n"));
+
+ if (*p == NULL) {
+ *p = SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
+ if (*p == NULL) {
+ return false;
+ }
+ ZERO_STRUCTP(*p);
+ }
+
+ d = *p;
+
+ d->version = r->version;
+
+ fstrcpy(d->name, r->driver_name);
+ fstrcpy(d->environment, r->architecture);
+ fstrcpy(d->driverpath, r->driver_path);
+ fstrcpy(d->datafile, r->data_file);
+ fstrcpy(d->configfile, r->config_file);
+ fstrcpy(d->helpfile, r->help_file);
+ fstrcpy(d->monitorname, r->monitor_name);
+ fstrcpy(d->defaultdatatype, r->default_datatype);
+
+ DEBUGADD(8,( "version: %d\n", d->version));
+ DEBUGADD(8,( "name: %s\n", d->name));
+ DEBUGADD(8,( "environment: %s\n", d->environment));
+ DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
+ DEBUGADD(8,( "datafile: %s\n", d->datafile));
+ DEBUGADD(8,( "configfile: %s\n", d->configfile));
+ DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
+ DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
+ DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
+
+ if (r->dependent_files) {
+ if (!string_array_to_fstring_array(r->dependent_files->string,
+ &d->dependentfiles)) {
+ goto error;
+ }
+ }
+
+ if (r->previous_names) {
+ if (!string_array_to_fstring_array(r->previous_names->string,
+ &d->previousnames)) {
+ goto error;
+ }
+ }
+
+ return true;
+
+ error:
+ SAFE_FREE(*p);
+ return false;
+}
+
+/********************************************************************
+ ********************************************************************/
+
+static bool convert_printer_driver_info(const struct spoolss_AddDriverInfoCtr *r,
+ NT_PRINTER_DRIVER_INFO_LEVEL *printer,
+ uint32_t level)
+{
--
Samba Shared Repository
More information about the samba-cvs
mailing list