summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/rpc_server/srv_spoolss.c22
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c111
3 files changed, 39 insertions, 95 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 4ce5ed695f..8395e2ad4d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6123,7 +6123,6 @@ WERROR add_port_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, const char *portname
bool add_printer_hook(TALLOC_CTX *ctx, NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer);
WERROR _spoolss_enumjobs( pipes_struct *p, SPOOL_Q_ENUMJOBS *q_u, SPOOL_R_ENUMJOBS *r_u);
WERROR _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, SPOOL_R_ENUMPRINTERDRIVERS *r_u);
-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_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, SPOOL_R_ENUMPRINTERDATA *r_u);
diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c
index ee36f04c6d..d665ebe244 100644
--- a/source3/rpc_server/srv_spoolss.c
+++ b/source3/rpc_server/srv_spoolss.c
@@ -431,27 +431,7 @@ static bool api_spoolss_getform(pipes_struct *p)
static bool api_spoolss_enumforms(pipes_struct *p)
{
- SPOOL_Q_ENUMFORMS q_u;
- SPOOL_R_ENUMFORMS 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_enumforms("", &q_u, data, 0)) {
- DEBUG(0,("spoolss_io_q_enumforms: unable to unmarshall SPOOL_Q_ENUMFORMS.\n"));
- return False;
- }
-
- r_u.status = _spoolss_enumforms(p, &q_u, &r_u);
-
- if (!spoolss_io_r_enumforms("",&r_u,rdata,0)) {
- DEBUG(0,("spoolss_io_r_enumforms: unable to marshall SPOOL_R_ENUMFORMS.\n"));
- return False;
- }
-
- return True;
+ return proxy_spoolss_call(p, NDR_SPOOLSS_ENUMFORMS);
}
/****************************************************************************
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 814f406e87..ec19279e0c 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -7277,73 +7277,65 @@ static WERROR fill_form_info_1(TALLOC_CTX *mem_ctx,
return WERR_OK;
}
-/****************************************************************************
-****************************************************************************/
+/****************************************************************
+ _spoolss_EnumForms
+****************************************************************/
-WERROR _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMFORMS *r_u)
+WERROR _spoolss_EnumForms(pipes_struct *p,
+ struct spoolss_EnumForms *r)
{
- uint32 level = q_u->level;
- RPC_BUFFER *buffer = NULL;
- uint32 offered = q_u->offered;
- uint32 *needed = &r_u->needed;
- uint32 *numofforms = &r_u->numofforms;
- uint32 numbuiltinforms;
-
nt_forms_struct *list=NULL;
nt_forms_struct *builtinlist=NULL;
- FORM_1 *forms_1;
- int buffer_size=0;
+ union spoolss_FormInfo *info;
+ uint32_t count;
+ uint32_t numbuiltinforms;
+ size_t buffer_size = 0;
int i;
- /* that's an [in out] buffer */
+ *r->out.count = 0;
- if (!q_u->buffer && (offered!=0) ) {
- return WERR_INVALID_PARAM;
- }
+ /* that's an [in out] buffer */
- if (offered > MAX_RPC_DATA_SIZE) {
+ if (!r->in.buffer && (r->in.offered != 0) ) {
return WERR_INVALID_PARAM;
}
- rpcbuf_move(q_u->buffer, &r_u->buffer);
- buffer = r_u->buffer;
-
- DEBUG(4,("_spoolss_enumforms\n"));
- DEBUGADD(5,("Offered buffer size [%d]\n", offered));
- DEBUGADD(5,("Info level [%d]\n", level));
+ DEBUG(4,("_spoolss_EnumForms\n"));
+ DEBUGADD(5,("Offered buffer size [%d]\n", r->in.offered));
+ DEBUGADD(5,("Info level [%d]\n", r->in.level));
numbuiltinforms = get_builtin_ntforms(&builtinlist);
DEBUGADD(5,("Number of builtin forms [%d]\n", numbuiltinforms));
- *numofforms = get_ntforms(&list);
- DEBUGADD(5,("Number of user forms [%d]\n", *numofforms));
- *numofforms += numbuiltinforms;
+ count = get_ntforms(&list);
+ DEBUGADD(5,("Number of user forms [%d]\n", count));
+ count += numbuiltinforms;
- if (*numofforms == 0) {
+ if (count == 0) {
SAFE_FREE(builtinlist);
SAFE_FREE(list);
return WERR_NO_MORE_ITEMS;
}
- switch (level) {
- case 1:
- if ((forms_1=SMB_MALLOC_ARRAY(FORM_1, *numofforms)) == NULL) {
- SAFE_FREE(builtinlist);
- SAFE_FREE(list);
- *numofforms=0;
- return WERR_NOMEM;
- }
+ info = TALLOC_ARRAY(p->mem_ctx, union spoolss_FormInfo, count);
+ if (!info) {
+ SAFE_FREE(builtinlist);
+ SAFE_FREE(list);
+ return WERR_NOMEM;
+ }
+ switch (r->in.level) {
+ case 1:
/* construct the list of form structures */
for (i=0; i<numbuiltinforms; i++) {
DEBUGADD(6,("Filling form number [%d]\n",i));
- fill_form_1(&forms_1[i], &builtinlist[i]);
+ fill_form_info_1(info, &info[i].info1, &builtinlist[i]);
}
SAFE_FREE(builtinlist);
- for (; i<*numofforms; i++) {
+ for (; i<count; i++) {
DEBUGADD(6,("Filling form number [%d]\n",i));
- fill_form_1(&forms_1[i], &list[i-numbuiltinforms]);
+ fill_form_info_1(info, &info[i].info1, &list[i-numbuiltinforms]);
}
SAFE_FREE(list);
@@ -7351,38 +7343,22 @@ WERROR _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
/* check the required size. */
for (i=0; i<numbuiltinforms; i++) {
DEBUGADD(6,("adding form [%d]'s size\n",i));
- buffer_size += spoolss_size_form_1(&forms_1[i]);
+ buffer_size += ndr_size_spoolss_FormInfo1(&info[i].info1, NULL, 0);
}
- for (; i<*numofforms; i++) {
+ for (; i<count; i++) {
DEBUGADD(6,("adding form [%d]'s size\n",i));
- buffer_size += spoolss_size_form_1(&forms_1[i]);
+ buffer_size += ndr_size_spoolss_FormInfo1(&info[i].info1, NULL, 0);
}
- *needed=buffer_size;
+ *r->out.needed = buffer_size;
- if (*needed > offered) {
- SAFE_FREE(forms_1);
- *numofforms=0;
+ if (*r->out.needed > r->in.offered) {
+ TALLOC_FREE(info);
return WERR_INSUFFICIENT_BUFFER;
}
- if (!rpcbuf_alloc_size(buffer, buffer_size)){
- SAFE_FREE(forms_1);
- *numofforms=0;
- return WERR_NOMEM;
- }
-
- /* fill the buffer with the form structures */
- for (i=0; i<numbuiltinforms; i++) {
- DEBUGADD(6,("adding form [%d] to buffer\n",i));
- smb_io_form_1("", buffer, &forms_1[i], 0);
- }
- for (; i<*numofforms; i++) {
- DEBUGADD(6,("adding form [%d] to buffer\n",i));
- smb_io_form_1("", buffer, &forms_1[i], 0);
- }
-
- SAFE_FREE(forms_1);
+ *r->out.count = count;
+ *r->out.info = info;
return WERR_OK;
@@ -10313,17 +10289,6 @@ WERROR _spoolss_WaitForPrinterChange(pipes_struct *p,
}
/****************************************************************
- _spoolss_EnumForms
-****************************************************************/
-
-WERROR _spoolss_EnumForms(pipes_struct *p,
- struct spoolss_EnumForms *r)
-{
- p->rng_fault_state = true;
- return WERR_NOT_SUPPORTED;
-}
-
-/****************************************************************
_spoolss_EnumPorts
****************************************************************/