summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c91
1 files changed, 70 insertions, 21 deletions
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index f01de4570c..90147c868a 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -41,7 +41,7 @@ extern pstring global_myname;
typedef struct _Printer{
BOOL document_started;
BOOL page_started;
- int jobid; /* jobid in printing backend */
+ int jobid; /* jobid in printing backend */
BOOL printer_type;
union {
fstring handlename;
@@ -5230,8 +5230,10 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
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;
int i;
@@ -5244,8 +5246,11 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
DEBUGADD(5,("Offered buffer size [%d]\n", offered));
DEBUGADD(5,("Info level [%d]\n", level));
+ numbuiltinforms = get_builtin_ntforms(&builtinlist);
+ DEBUGADD(5,("Number of builtin forms [%d]\n", numbuiltinforms));
*numofforms = get_ntforms(&list);
- DEBUGADD(5,("Number of forms [%d]\n", *numofforms));
+ DEBUGADD(5,("Number of user forms [%d]\n", *numofforms));
+ *numofforms += numbuiltinforms;
if (*numofforms == 0) return ERROR_NO_MORE_ITEMS;
@@ -5257,15 +5262,26 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
}
/* construct the list of form structures */
- for (i=0; i<*numofforms; i++) {
+ for (i=0; i<numbuiltinforms; i++) {
DEBUGADD(6,("Filling form number [%d]\n",i));
- fill_form_1(&forms_1[i], &list[i]);
+ fill_form_1(&forms_1[i], &builtinlist[i]);
+ }
+
+ safe_free(builtinlist);
+
+ for (; i<*numofforms; i++) {
+ DEBUGADD(6,("Filling form number [%d]\n",i));
+ fill_form_1(&forms_1[i], &list[i-numbuiltinforms]);
}
safe_free(list);
/* check the required size. */
- for (i=0; i<*numofforms; i++) {
+ for (i=0; i<numbuiltinforms; i++) {
+ DEBUGADD(6,("adding form [%d]'s size\n",i));
+ buffer_size += spoolss_size_form_1(&forms_1[i]);
+ }
+ for (; i<*numofforms; i++) {
DEBUGADD(6,("adding form [%d]'s size\n",i));
buffer_size += spoolss_size_form_1(&forms_1[i]);
}
@@ -5278,7 +5294,11 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
}
/* fill the buffer with the form structures */
- for (i=0; i<*numofforms; i++) {
+ 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);
}
@@ -5294,6 +5314,7 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF
default:
safe_free(list);
+ safe_free(builtinlist);
return ERROR_INVALID_LEVEL;
}
@@ -5312,6 +5333,8 @@ uint32 _spoolss_getform(pipes_struct *p, SPOOL_Q_GETFORM *q_u, SPOOL_R_GETFORM *
uint32 *needed = &r_u->needed;
nt_forms_struct *list=NULL;
+ nt_forms_struct builtin_form;
+ BOOL foundBuiltin;
FORM_1 form_1;
fstring form_name;
int buffer_size=0;
@@ -5327,29 +5350,38 @@ uint32 _spoolss_getform(pipes_struct *p, SPOOL_Q_GETFORM *q_u, SPOOL_R_GETFORM *
DEBUGADD(5,("Offered buffer size [%d]\n", offered));
DEBUGADD(5,("Info level [%d]\n", level));
- numofforms = get_ntforms(&list);
- DEBUGADD(5,("Number of forms [%d]\n", numofforms));
+ foundBuiltin = get_a_builtin_ntform(uni_formname,&builtin_form);
+ if (!foundBuiltin) {
+ numofforms = get_ntforms(&list);
+ DEBUGADD(5,("Number of forms [%d]\n", numofforms));
- if (numofforms == 0)
- return ERROR_NO_MORE_ITEMS;
+ if (numofforms == 0)
+ return ERROR_INVALID_HANDLE;
+ }
switch (level) {
case 1:
+ if (foundBuiltin) {
+ fill_form_1(&form_1, &builtin_form);
+ } else {
- /* Check if the requested name is in the list of form structures */
- for (i=0; i<numofforms; i++) {
+ /* Check if the requested name is in the list of form structures */
+ for (i=0; i<numofforms; i++) {
- DEBUG(4,("_spoolss_getform: checking form %s (want %s)\n", list[i].name, form_name));
+ DEBUG(4,("_spoolss_getform: checking form %s (want %s)\n", list[i].name, form_name));
- if (strequal(form_name, list[i].name)) {
- DEBUGADD(6,("Found form %s number [%d]\n", form_name, i));
- fill_form_1(&form_1, &list[i]);
- break;
+ if (strequal(form_name, list[i].name)) {
+ DEBUGADD(6,("Found form %s number [%d]\n", form_name, i));
+ fill_form_1(&form_1, &list[i]);
+ break;
+ }
+ }
+
+ safe_free(list);
+ if (i == numofforms) {
+ return ERROR_INVALID_HANDLE;
}
}
-
- safe_free(list);
-
/* check the required size. */
*needed=spoolss_size_form_1(&form_1);
@@ -6135,6 +6167,7 @@ uint32 _spoolss_addform( pipes_struct *p, SPOOL_Q_ADDFORM *q_u, SPOOL_R_ADDFORM
POLICY_HND *handle = &q_u->handle;
/* uint32 level = q_u->level; - notused. */
FORM *form = &q_u->form;
+ nt_forms_struct tmpForm;
int count=0;
nt_forms_struct *list=NULL;
@@ -6147,6 +6180,11 @@ uint32 _spoolss_addform( pipes_struct *p, SPOOL_Q_ADDFORM *q_u, SPOOL_R_ADDFORM
return ERROR_INVALID_HANDLE;
}
+ /* can't add if builtin */
+ if (get_a_builtin_ntform(&form->name,&tmpForm)) {
+ return ERROR_INVALID_PARAMETER;
+ }
+
count=get_ntforms(&list);
if(!add_a_form(&list, form, &count))
return ERROR_NOT_ENOUGH_MEMORY;
@@ -6164,7 +6202,7 @@ uint32 _spoolss_deleteform( pipes_struct *p, SPOOL_Q_DELETEFORM *q_u, SPOOL_R_DE
{
POLICY_HND *handle = &q_u->handle;
UNISTR2 *form_name = &q_u->name;
-
+ nt_forms_struct tmpForm;
int count=0;
uint32 ret = 0;
nt_forms_struct *list=NULL;
@@ -6177,6 +6215,11 @@ uint32 _spoolss_deleteform( pipes_struct *p, SPOOL_Q_DELETEFORM *q_u, SPOOL_R_DE
return ERROR_INVALID_HANDLE;
}
+ /* can't delete if builtin */
+ if (get_a_builtin_ntform(form_name,&tmpForm)) {
+ return ERROR_INVALID_PARAMETER;
+ }
+
count = get_ntforms(&list);
if(!delete_a_form(&list, form_name, &count, &ret))
return ERROR_INVALID_PARAMETER;
@@ -6195,6 +6238,7 @@ uint32 _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM *
/* UNISTR2 *uni_name = &q_u->name; - notused. */
/* uint32 level = q_u->level; - notused. */
FORM *form = &q_u->form;
+ nt_forms_struct tmpForm;
int count=0;
nt_forms_struct *list=NULL;
@@ -6206,6 +6250,11 @@ uint32 _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM *
DEBUG(0,("_spoolss_setform: Invalid handle (%s).\n", OUR_HANDLE(handle)));
return ERROR_INVALID_HANDLE;
}
+ /* can't set if builtin */
+ if (get_a_builtin_ntform(&form->name,&tmpForm)) {
+ return ERROR_INVALID_PARAMETER;
+ }
+
count=get_ntforms(&list);
update_a_form(&list, form, count);
write_ntforms(&list, count);