2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000,
7 * Copyright (C) Gerald Carter 2000-2002,
8 * Copyright (C) Tim Potter 2001-2002.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_PARSE
30 /*******************************************************************
31 return the length of a UNISTR string.
32 ********************************************************************/
34 static uint32
str_len_uni(UNISTR
*source
)
41 while (source
->buffer
[i
])
47 /*******************************************************************
48 This should be moved in a more generic lib.
49 ********************************************************************/
51 BOOL
spoolss_io_system_time(char *desc
, prs_struct
*ps
, int depth
, SYSTEMTIME
*systime
)
53 if(!prs_uint16("year", ps
, depth
, &systime
->year
))
55 if(!prs_uint16("month", ps
, depth
, &systime
->month
))
57 if(!prs_uint16("dayofweek", ps
, depth
, &systime
->dayofweek
))
59 if(!prs_uint16("day", ps
, depth
, &systime
->day
))
61 if(!prs_uint16("hour", ps
, depth
, &systime
->hour
))
63 if(!prs_uint16("minute", ps
, depth
, &systime
->minute
))
65 if(!prs_uint16("second", ps
, depth
, &systime
->second
))
67 if(!prs_uint16("milliseconds", ps
, depth
, &systime
->milliseconds
))
73 /*******************************************************************
74 ********************************************************************/
76 BOOL
make_systemtime(SYSTEMTIME
*systime
, struct tm
*unixtime
)
78 systime
->year
=unixtime
->tm_year
+1900;
79 systime
->month
=unixtime
->tm_mon
+1;
80 systime
->dayofweek
=unixtime
->tm_wday
;
81 systime
->day
=unixtime
->tm_mday
;
82 systime
->hour
=unixtime
->tm_hour
;
83 systime
->minute
=unixtime
->tm_min
;
84 systime
->second
=unixtime
->tm_sec
;
85 systime
->milliseconds
=0;
90 /*******************************************************************
91 reads or writes an DOC_INFO structure.
92 ********************************************************************/
94 static BOOL
smb_io_doc_info_1(char *desc
, DOC_INFO_1
*info_1
, prs_struct
*ps
, int depth
)
96 if (info_1
== NULL
) return False
;
98 prs_debug(ps
, depth
, desc
, "smb_io_doc_info_1");
104 if(!prs_uint32("p_docname", ps
, depth
, &info_1
->p_docname
))
106 if(!prs_uint32("p_outputfile", ps
, depth
, &info_1
->p_outputfile
))
108 if(!prs_uint32("p_datatype", ps
, depth
, &info_1
->p_datatype
))
111 if(!smb_io_unistr2("", &info_1
->docname
, info_1
->p_docname
, ps
, depth
))
113 if(!smb_io_unistr2("", &info_1
->outputfile
, info_1
->p_outputfile
, ps
, depth
))
115 if(!smb_io_unistr2("", &info_1
->datatype
, info_1
->p_datatype
, ps
, depth
))
121 /*******************************************************************
122 reads or writes an DOC_INFO structure.
123 ********************************************************************/
125 static BOOL
smb_io_doc_info(char *desc
, DOC_INFO
*info
, prs_struct
*ps
, int depth
)
127 uint32 useless_ptr
=0;
129 if (info
== NULL
) return False
;
131 prs_debug(ps
, depth
, desc
, "smb_io_doc_info");
137 if(!prs_uint32("switch_value", ps
, depth
, &info
->switch_value
))
140 if(!prs_uint32("doc_info_X ptr", ps
, depth
, &useless_ptr
))
143 switch (info
->switch_value
)
146 if(!smb_io_doc_info_1("",&info
->doc_info_1
, ps
, depth
))
151 this is just a placeholder
153 MSDN July 1998 says doc_info_2 is only on
154 Windows 95, and as Win95 doesn't do RPC to print
155 this case is nearly impossible
157 Maybe one day with Windows for dishwasher 2037 ...
160 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
163 DEBUG(0,("Something is obviously wrong somewhere !\n"));
170 /*******************************************************************
171 reads or writes an DOC_INFO_CONTAINER structure.
172 ********************************************************************/
174 static BOOL
smb_io_doc_info_container(char *desc
, DOC_INFO_CONTAINER
*cont
, prs_struct
*ps
, int depth
)
176 if (cont
== NULL
) return False
;
178 prs_debug(ps
, depth
, desc
, "smb_io_doc_info_container");
184 if(!prs_uint32("level", ps
, depth
, &cont
->level
))
187 if(!smb_io_doc_info("",&cont
->docinfo
, ps
, depth
))
193 /*******************************************************************
194 reads or writes an NOTIFY OPTION TYPE structure.
195 ********************************************************************/
197 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
198 structure. The _TYPE structure is really the deferred referrants (i.e
199 the notify fields array) of the _TYPE structure. -tpot */
201 static BOOL
smb_io_notify_option_type(char *desc
, SPOOL_NOTIFY_OPTION_TYPE
*type
, prs_struct
*ps
, int depth
)
203 prs_debug(ps
, depth
, desc
, "smb_io_notify_option_type");
209 if(!prs_uint16("type", ps
, depth
, &type
->type
))
211 if(!prs_uint16("reserved0", ps
, depth
, &type
->reserved0
))
213 if(!prs_uint32("reserved1", ps
, depth
, &type
->reserved1
))
215 if(!prs_uint32("reserved2", ps
, depth
, &type
->reserved2
))
217 if(!prs_uint32("count", ps
, depth
, &type
->count
))
219 if(!prs_uint32("fields_ptr", ps
, depth
, &type
->fields_ptr
))
225 /*******************************************************************
226 reads or writes an NOTIFY OPTION TYPE DATA.
227 ********************************************************************/
229 static BOOL
smb_io_notify_option_type_data(char *desc
, SPOOL_NOTIFY_OPTION_TYPE
*type
, prs_struct
*ps
, int depth
)
233 prs_debug(ps
, depth
, desc
, "smb_io_notify_option_type_data");
236 /* if there are no fields just return */
237 if (type
->fields_ptr
==0)
243 if(!prs_uint32("count2", ps
, depth
, &type
->count2
))
246 if (type
->count2
!= type
->count
)
247 DEBUG(4,("What a mess, count was %x now is %x !\n", type
->count
, type
->count2
));
249 /* parse the option type data */
250 for(i
=0;i
<type
->count2
;i
++)
251 if(!prs_uint16("fields",ps
,depth
,&type
->fields
[i
]))
256 /*******************************************************************
257 reads or writes an NOTIFY OPTION structure.
258 ********************************************************************/
260 static BOOL
smb_io_notify_option_type_ctr(char *desc
, SPOOL_NOTIFY_OPTION_TYPE_CTR
*ctr
, prs_struct
*ps
, int depth
)
264 prs_debug(ps
, depth
, desc
, "smb_io_notify_option_type_ctr");
267 if(!prs_uint32("count", ps
, depth
, &ctr
->count
))
271 if (UNMARSHALLING(ps
))
272 if((ctr
->type
=(SPOOL_NOTIFY_OPTION_TYPE
*)prs_alloc_mem(ps
,ctr
->count
*sizeof(SPOOL_NOTIFY_OPTION_TYPE
))) == NULL
)
275 /* the option type struct */
276 for(i
=0;i
<ctr
->count
;i
++)
277 if(!smb_io_notify_option_type("", &ctr
->type
[i
] , ps
, depth
))
280 /* the type associated with the option type struct */
281 for(i
=0;i
<ctr
->count
;i
++)
282 if(!smb_io_notify_option_type_data("", &ctr
->type
[i
] , ps
, depth
))
288 /*******************************************************************
289 reads or writes an NOTIFY OPTION structure.
290 ********************************************************************/
292 static BOOL
smb_io_notify_option(char *desc
, SPOOL_NOTIFY_OPTION
*option
, prs_struct
*ps
, int depth
)
294 prs_debug(ps
, depth
, desc
, "smb_io_notify_option");
297 if(!prs_uint32("version", ps
, depth
, &option
->version
))
299 if(!prs_uint32("flags", ps
, depth
, &option
->flags
))
301 if(!prs_uint32("count", ps
, depth
, &option
->count
))
303 if(!prs_uint32("option_type_ptr", ps
, depth
, &option
->option_type_ptr
))
306 /* marshalling or unmarshalling, that would work */
307 if (option
->option_type_ptr
!=0) {
308 if(!smb_io_notify_option_type_ctr("", &option
->ctr
,ps
, depth
))
312 option
->ctr
.type
=NULL
;
319 /*******************************************************************
320 reads or writes an NOTIFY INFO DATA structure.
321 ********************************************************************/
323 static BOOL
smb_io_notify_info_data(char *desc
,SPOOL_NOTIFY_INFO_DATA
*data
, prs_struct
*ps
, int depth
)
325 uint32 useless_ptr
=0x0FF0ADDE;
327 prs_debug(ps
, depth
, desc
, "smb_io_notify_info_data");
332 if(!prs_uint16("type", ps
, depth
, &data
->type
))
334 if(!prs_uint16("field", ps
, depth
, &data
->field
))
337 if(!prs_uint32("how many words", ps
, depth
, &data
->size
))
339 if(!prs_uint32("id", ps
, depth
, &data
->id
))
341 if(!prs_uint32("how many words", ps
, depth
, &data
->size
))
344 switch (data
->enc_type
) {
346 /* One and two value data has two uint32 values */
348 case NOTIFY_ONE_VALUE
:
349 case NOTIFY_TWO_VALUE
:
351 if(!prs_uint32("value[0]", ps
, depth
, &data
->notify_data
.value
[0]))
353 if(!prs_uint32("value[1]", ps
, depth
, &data
->notify_data
.value
[1]))
357 /* Pointers and strings have a string length and a
358 pointer. For a string the length is expressed as
359 the number of uint16 characters plus a trailing
364 if(!prs_uint32("string length", ps
, depth
, &data
->notify_data
.data
.length
))
366 if(!prs_uint32("pointer", ps
, depth
, &useless_ptr
))
373 if(!prs_uint32("string length", ps
, depth
, &data
->notify_data
.data
.length
))
376 if(!prs_uint32("pointer", ps
, depth
, &useless_ptr
))
382 if( !prs_uint32( "sd size", ps
, depth
, &data
->notify_data
.sd
.size
) )
384 if( !prs_uint32( "pointer", ps
, depth
, &useless_ptr
) )
390 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
398 /*******************************************************************
399 reads or writes an NOTIFY INFO DATA structure.
400 ********************************************************************/
402 BOOL
smb_io_notify_info_data_strings(char *desc
,SPOOL_NOTIFY_INFO_DATA
*data
,
403 prs_struct
*ps
, int depth
)
405 prs_debug(ps
, depth
, desc
, "smb_io_notify_info_data_strings");
411 switch(data
->enc_type
) {
413 /* No data for values */
415 case NOTIFY_ONE_VALUE
:
416 case NOTIFY_TWO_VALUE
:
420 /* Strings start with a length in uint16s */
424 if (UNMARSHALLING(ps
)) {
425 data
->notify_data
.data
.string
=
426 (uint16
*)prs_alloc_mem(ps
, data
->notify_data
.data
.length
);
428 if (!data
->notify_data
.data
.string
)
433 data
->notify_data
.data
.length
/= 2;
435 if(!prs_uint32("string length", ps
, depth
, &data
->notify_data
.data
.length
))
438 if (!prs_uint16uni(True
, "string", ps
, depth
, data
->notify_data
.data
.string
,
439 data
->notify_data
.data
.length
))
443 data
->notify_data
.data
.length
*= 2;
449 if (UNMARSHALLING(ps
)) {
450 data
->notify_data
.data
.string
=
451 (uint16
*)prs_alloc_mem(ps
, data
->notify_data
.data
.length
);
453 if (!data
->notify_data
.data
.string
)
457 if(!prs_uint8s(True
,"buffer",ps
,depth
,(uint8
*)data
->notify_data
.data
.string
,data
->notify_data
.data
.length
))
463 if( !prs_uint32("secdesc size ", ps
, depth
, &data
->notify_data
.sd
.size
) )
465 if ( !sec_io_desc( "sec_desc", &data
->notify_data
.sd
.desc
, ps
, depth
) )
470 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
476 if (isvalue
==False
) {
478 /* length of string in unicode include \0 */
479 x
=data
->notify_data
.data
.length
+1;
481 if (data
->field
!= 16)
482 if(!prs_uint32("string length", ps
, depth
, &x
))
485 if (MARSHALLING(ps
)) {
486 /* These are already in little endian format. Don't byte swap. */
489 /* No memory allocated for this string
490 therefore following the data.string
491 pointer is a bad idea. Use a pointer to
492 the uint32 length union member to
493 provide a source for a unicode NULL */
495 if(!prs_uint8s(True
,"string",ps
,depth
, (uint8
*)&data
->notify_data
.data
.length
,x
*2))
499 if (data
->field
== 16)
502 if(!prs_uint16uni(True
,"string",ps
,depth
,data
->notify_data
.data
.string
,x
))
507 /* Tallocate memory for string */
509 data
->notify_data
.data
.string
= (uint16
*)prs_alloc_mem(ps
, x
* 2);
510 if (!data
->notify_data
.data
.string
)
513 if(!prs_uint16uni(True
,"string",ps
,depth
,data
->notify_data
.data
.string
,x
))
521 /* Win2k does not seem to put this parse align here */
529 /*******************************************************************
530 reads or writes an NOTIFY INFO structure.
531 ********************************************************************/
533 static BOOL
smb_io_notify_info(char *desc
, SPOOL_NOTIFY_INFO
*info
, prs_struct
*ps
, int depth
)
537 prs_debug(ps
, depth
, desc
, "smb_io_notify_info");
543 if(!prs_uint32("count", ps
, depth
, &info
->count
))
545 if(!prs_uint32("version", ps
, depth
, &info
->version
))
547 if(!prs_uint32("flags", ps
, depth
, &info
->flags
))
549 if(!prs_uint32("count", ps
, depth
, &info
->count
))
552 for (i
=0;i
<info
->count
;i
++) {
553 if(!smb_io_notify_info_data(desc
, &info
->data
[i
], ps
, depth
))
557 /* now do the strings at the end of the stream */
558 for (i
=0;i
<info
->count
;i
++) {
559 if(!smb_io_notify_info_data_strings(desc
, &info
->data
[i
], ps
, depth
))
566 /*******************************************************************
567 ********************************************************************/
569 static BOOL
spool_io_user_level_1(char *desc
, SPOOL_USER_1
*q_u
, prs_struct
*ps
, int depth
)
571 prs_debug(ps
, depth
, desc
, "");
575 if (UNMARSHALLING(ps
))
580 if (!prs_uint32("size", ps
, depth
, &q_u
->size
))
582 if (!prs_uint32("client_name_ptr", ps
, depth
, &q_u
->client_name_ptr
))
584 if (!prs_uint32("user_name_ptr", ps
, depth
, &q_u
->user_name_ptr
))
586 if (!prs_uint32("build", ps
, depth
, &q_u
->build
))
588 if (!prs_uint32("major", ps
, depth
, &q_u
->major
))
590 if (!prs_uint32("minor", ps
, depth
, &q_u
->minor
))
592 if (!prs_uint32("processor", ps
, depth
, &q_u
->processor
))
595 if (!smb_io_unistr2("", &q_u
->client_name
, q_u
->client_name_ptr
, ps
, depth
))
599 if (!smb_io_unistr2("", &q_u
->user_name
, q_u
->user_name_ptr
, ps
, depth
))
605 /*******************************************************************
606 ********************************************************************/
608 static BOOL
spool_io_user_level(char *desc
, SPOOL_USER_CTR
*q_u
, prs_struct
*ps
, int depth
)
613 prs_debug(ps
, depth
, desc
, "spool_io_user_level");
618 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
620 if (!prs_uint32("ptr", ps
, depth
, &q_u
->ptr
))
623 switch (q_u
->level
) {
625 if (!spool_io_user_level_1("", &q_u
->user1
, ps
, depth
))
635 /*******************************************************************
636 * read or write a DEVICEMODE struct.
637 * on reading allocate memory for the private member
638 ********************************************************************/
640 #define DM_NUM_OPTIONAL_FIELDS 8
642 BOOL
spoolss_io_devmode(char *desc
, prs_struct
*ps
, int depth
, DEVICEMODE
*devmode
)
644 uint32 available_space
; /* size of the device mode left to parse */
645 /* only important on unmarshalling */
648 struct optional_fields
{
651 } opt_fields
[DM_NUM_OPTIONAL_FIELDS
] = {
652 { "icmmethod", NULL
},
653 { "icmintent", NULL
},
654 { "mediatype", NULL
},
655 { "dithertype", NULL
},
656 { "reserved1", NULL
},
657 { "reserved2", NULL
},
658 { "panningwidth", NULL
},
659 { "panningheight", NULL
}
662 /* assign at run time to keep non-gcc compilers happy */
664 opt_fields
[0].field
= &devmode
->icmmethod
;
665 opt_fields
[1].field
= &devmode
->icmintent
;
666 opt_fields
[2].field
= &devmode
->mediatype
;
667 opt_fields
[3].field
= &devmode
->dithertype
;
668 opt_fields
[4].field
= &devmode
->reserved1
;
669 opt_fields
[5].field
= &devmode
->reserved2
;
670 opt_fields
[6].field
= &devmode
->panningwidth
;
671 opt_fields
[7].field
= &devmode
->panningheight
;
674 prs_debug(ps
, depth
, desc
, "spoolss_io_devmode");
677 if (UNMARSHALLING(ps
)) {
678 devmode
->devicename
.buffer
= (uint16
*)prs_alloc_mem(ps
, 32 * sizeof(uint16
) );
679 if (devmode
->devicename
.buffer
== NULL
)
683 if (!prs_uint16uni(True
,"devicename", ps
, depth
, devmode
->devicename
.buffer
, 32))
686 if (!prs_uint16("specversion", ps
, depth
, &devmode
->specversion
))
689 /* Sanity Check - look for unknown specversions, but don't fail if we see one.
690 Let the size determine that */
692 switch (devmode
->specversion
) {
693 /* list of observed spec version's */
701 DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
702 devmode
->specversion
));
703 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
708 if (!prs_uint16("driverversion", ps
, depth
, &devmode
->driverversion
))
710 if (!prs_uint16("size", ps
, depth
, &devmode
->size
))
712 if (!prs_uint16("driverextra", ps
, depth
, &devmode
->driverextra
))
714 if (!prs_uint32("fields", ps
, depth
, &devmode
->fields
))
716 if (!prs_uint16("orientation", ps
, depth
, &devmode
->orientation
))
718 if (!prs_uint16("papersize", ps
, depth
, &devmode
->papersize
))
720 if (!prs_uint16("paperlength", ps
, depth
, &devmode
->paperlength
))
722 if (!prs_uint16("paperwidth", ps
, depth
, &devmode
->paperwidth
))
724 if (!prs_uint16("scale", ps
, depth
, &devmode
->scale
))
726 if (!prs_uint16("copies", ps
, depth
, &devmode
->copies
))
728 if (!prs_uint16("defaultsource", ps
, depth
, &devmode
->defaultsource
))
730 if (!prs_uint16("printquality", ps
, depth
, &devmode
->printquality
))
732 if (!prs_uint16("color", ps
, depth
, &devmode
->color
))
734 if (!prs_uint16("duplex", ps
, depth
, &devmode
->duplex
))
736 if (!prs_uint16("yresolution", ps
, depth
, &devmode
->yresolution
))
738 if (!prs_uint16("ttoption", ps
, depth
, &devmode
->ttoption
))
740 if (!prs_uint16("collate", ps
, depth
, &devmode
->collate
))
743 if (UNMARSHALLING(ps
)) {
744 devmode
->formname
.buffer
= (uint16
*)prs_alloc_mem(ps
, 32 * sizeof(uint16
) );
745 if (devmode
->formname
.buffer
== NULL
)
749 if (!prs_uint16uni(True
, "formname", ps
, depth
, devmode
->formname
.buffer
, 32))
751 if (!prs_uint16("logpixels", ps
, depth
, &devmode
->logpixels
))
753 if (!prs_uint32("bitsperpel", ps
, depth
, &devmode
->bitsperpel
))
755 if (!prs_uint32("pelswidth", ps
, depth
, &devmode
->pelswidth
))
757 if (!prs_uint32("pelsheight", ps
, depth
, &devmode
->pelsheight
))
759 if (!prs_uint32("displayflags", ps
, depth
, &devmode
->displayflags
))
761 if (!prs_uint32("displayfrequency", ps
, depth
, &devmode
->displayfrequency
))
764 * every device mode I've ever seen on the wire at least has up
765 * to the displayfrequency field. --jerry (05-09-2002)
768 /* add uint32's + uint16's + two UNICODE strings */
770 available_space
= devmode
->size
- (sizeof(uint32
)*6 + sizeof(uint16
)*18 + sizeof(uint16
)*64);
772 /* Sanity check - we only have uint32's left tp parse */
774 if ( available_space
&& ((available_space
% sizeof(uint32
)) != 0) ) {
775 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
776 available_space
, devmode
->size
));
777 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
782 * Conditional parsing. Assume that the DeviceMode has been
783 * zero'd by the caller.
786 while ((available_space
> 0) && (i
< DM_NUM_OPTIONAL_FIELDS
))
788 DEBUG(10, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space
));
789 if (!prs_uint32(opt_fields
[i
].name
, ps
, depth
, opt_fields
[i
].field
))
791 available_space
-= sizeof(uint32
);
795 /* Sanity Check - we should no available space at this point unless
796 MS changes the device mode structure */
798 if (available_space
) {
799 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
800 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
801 available_space
, devmode
->size
));
802 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
807 if (devmode
->driverextra
!=0) {
808 if (UNMARSHALLING(ps
)) {
809 devmode
->private=(uint8
*)prs_alloc_mem(ps
, devmode
->driverextra
*sizeof(uint8
));
810 if(devmode
->private == NULL
)
812 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode
->driverextra
));
815 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode
->driverextra
));
816 if (!prs_uint8s(False
, "private", ps
, depth
,
817 devmode
->private, devmode
->driverextra
))
824 /*******************************************************************
825 Read or write a DEVICEMODE container
826 ********************************************************************/
828 static BOOL
spoolss_io_devmode_cont(char *desc
, DEVMODE_CTR
*dm_c
, prs_struct
*ps
, int depth
)
833 prs_debug(ps
, depth
, desc
, "spoolss_io_devmode_cont");
839 if (!prs_uint32("size", ps
, depth
, &dm_c
->size
))
842 if (!prs_uint32("devmode_ptr", ps
, depth
, &dm_c
->devmode_ptr
))
845 if (dm_c
->size
==0 || dm_c
->devmode_ptr
==0) {
846 if (UNMARSHALLING(ps
))
847 /* if while reading there is no DEVMODE ... */
852 /* so we have a DEVICEMODE to follow */
853 if (UNMARSHALLING(ps
)) {
854 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
855 dm_c
->devmode
=(DEVICEMODE
*)prs_alloc_mem(ps
,sizeof(DEVICEMODE
));
856 if(dm_c
->devmode
== NULL
)
860 /* this is bad code, shouldn't be there */
861 if (!prs_uint32("size", ps
, depth
, &dm_c
->size
))
864 if (!spoolss_io_devmode(desc
, ps
, depth
, dm_c
->devmode
))
870 /*******************************************************************
871 ********************************************************************/
873 static BOOL
spoolss_io_printer_default(char *desc
, PRINTER_DEFAULT
*pd
, prs_struct
*ps
, int depth
)
878 prs_debug(ps
, depth
, desc
, "spoolss_io_printer_default");
881 if (!prs_uint32("datatype_ptr", ps
, depth
, &pd
->datatype_ptr
))
884 if (!smb_io_unistr2("datatype", &pd
->datatype
, pd
->datatype_ptr
, ps
,depth
))
890 if (!spoolss_io_devmode_cont("", &pd
->devmode_cont
, ps
, depth
))
896 if (!prs_uint32("access_required", ps
, depth
, &pd
->access_required
))
902 /*******************************************************************
904 ********************************************************************/
906 BOOL
make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX
*q_u
,
907 const fstring printername
,
908 const fstring datatype
,
909 uint32 access_required
,
910 const fstring clientname
,
911 const fstring user_name
)
913 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
914 q_u
->printername_ptr
= (printername
!=NULL
)?1:0;
915 init_unistr2(&q_u
->printername
, printername
, strlen(printername
)+1);
917 q_u
->printer_default
.datatype_ptr
= 0;
919 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
920 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
922 q_u
->printer_default
.devmode_cont
.size
=0;
923 q_u
->printer_default
.devmode_cont
.devmode_ptr
=0;
924 q_u
->printer_default
.devmode_cont
.devmode
=NULL
;
925 q_u
->printer_default
.access_required
=access_required
;
927 q_u
->user_ctr
.level
=1;
929 q_u
->user_ctr
.user1
.size
=strlen(clientname
)+strlen(user_name
)+10;
930 q_u
->user_ctr
.user1
.client_name_ptr
= (clientname
!=NULL
)?1:0;
931 q_u
->user_ctr
.user1
.user_name_ptr
= (user_name
!=NULL
)?1:0;
932 q_u
->user_ctr
.user1
.build
=1381;
933 q_u
->user_ctr
.user1
.major
=2;
934 q_u
->user_ctr
.user1
.minor
=0;
935 q_u
->user_ctr
.user1
.processor
=0;
936 init_unistr2(&q_u
->user_ctr
.user1
.client_name
, clientname
, strlen(clientname
)+1);
937 init_unistr2(&q_u
->user_ctr
.user1
.user_name
, user_name
, strlen(user_name
)+1);
942 /*******************************************************************
944 ********************************************************************/
946 BOOL
make_spoolss_q_addprinterex(
948 SPOOL_Q_ADDPRINTEREX
*q_u
,
949 const char *srv_name
,
950 const char* clientname
,
951 const char* user_name
,
953 PRINTER_INFO_CTR
*ctr
)
955 DEBUG(5,("make_spoolss_q_addprinterex\n"));
957 if (!ctr
) return False
;
961 q_u
->server_name_ptr
= (srv_name
!=NULL
)?1:0;
962 init_unistr2(&q_u
->server_name
, srv_name
, strlen(srv_name
));
966 q_u
->info
.level
= level
;
967 q_u
->info
.info_ptr
= (ctr
->printers_2
!=NULL
)?1:0;
970 /* init q_u->info.info2 from *info */
971 if (!make_spoolss_printer_info_2(mem_ctx
, &q_u
->info
.info_2
, ctr
->printers_2
)) {
972 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
982 q_u
->user_ctr
.level
=1;
984 q_u
->user_ctr
.user1
.client_name_ptr
= (clientname
!=NULL
)?1:0;
985 q_u
->user_ctr
.user1
.user_name_ptr
= (user_name
!=NULL
)?1:0;
986 q_u
->user_ctr
.user1
.build
=1381;
987 q_u
->user_ctr
.user1
.major
=2;
988 q_u
->user_ctr
.user1
.minor
=0;
989 q_u
->user_ctr
.user1
.processor
=0;
990 init_unistr2(&q_u
->user_ctr
.user1
.client_name
, clientname
, strlen(clientname
)+1);
991 init_unistr2(&q_u
->user_ctr
.user1
.user_name
, user_name
, strlen(user_name
)+1);
992 q_u
->user_ctr
.user1
.size
=q_u
->user_ctr
.user1
.user_name
.uni_str_len
+
993 q_u
->user_ctr
.user1
.client_name
.uni_str_len
+ 2;
998 /*******************************************************************
999 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
1000 *******************************************************************/
1002 BOOL
make_spoolss_printer_info_2(TALLOC_CTX
*mem_ctx
, SPOOL_PRINTER_INFO_LEVEL_2
**spool_info2
,
1003 PRINTER_INFO_2
*info
)
1006 SPOOL_PRINTER_INFO_LEVEL_2
*inf
;
1008 /* allocate the necessary memory */
1009 if (!(inf
=(SPOOL_PRINTER_INFO_LEVEL_2
*)talloc(mem_ctx
, sizeof(SPOOL_PRINTER_INFO_LEVEL_2
)))) {
1010 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
1014 inf
->servername_ptr
= (info
->servername
.buffer
!=NULL
)?1:0;
1015 inf
->printername_ptr
= (info
->printername
.buffer
!=NULL
)?1:0;
1016 inf
->sharename_ptr
= (info
->sharename
.buffer
!=NULL
)?1:0;
1017 inf
->portname_ptr
= (info
->portname
.buffer
!=NULL
)?1:0;
1018 inf
->drivername_ptr
= (info
->drivername
.buffer
!=NULL
)?1:0;
1019 inf
->comment_ptr
= (info
->comment
.buffer
!=NULL
)?1:0;
1020 inf
->location_ptr
= (info
->location
.buffer
!=NULL
)?1:0;
1021 inf
->devmode_ptr
= (info
->devmode
!=NULL
)?1:0;
1022 inf
->sepfile_ptr
= (info
->sepfile
.buffer
!=NULL
)?1:0;
1023 inf
->printprocessor_ptr
= (info
->printprocessor
.buffer
!=NULL
)?1:0;
1024 inf
->datatype_ptr
= (info
->datatype
.buffer
!=NULL
)?1:0;
1025 inf
->parameters_ptr
= (info
->parameters
.buffer
!=NULL
)?1:0;
1026 inf
->secdesc_ptr
= (info
->secdesc
!=NULL
)?1:0;
1027 inf
->attributes
= info
->attributes
;
1028 inf
->priority
= info
->priority
;
1029 inf
->default_priority
= info
->defaultpriority
;
1030 inf
->starttime
= info
->starttime
;
1031 inf
->untiltime
= info
->untiltime
;
1032 inf
->cjobs
= info
->cjobs
;
1033 inf
->averageppm
= info
->averageppm
;
1034 init_unistr2_from_unistr(&inf
->servername
, &info
->servername
);
1035 init_unistr2_from_unistr(&inf
->printername
, &info
->printername
);
1036 init_unistr2_from_unistr(&inf
->sharename
, &info
->sharename
);
1037 init_unistr2_from_unistr(&inf
->portname
, &info
->portname
);
1038 init_unistr2_from_unistr(&inf
->drivername
, &info
->drivername
);
1039 init_unistr2_from_unistr(&inf
->comment
, &info
->comment
);
1040 init_unistr2_from_unistr(&inf
->location
, &info
->location
);
1041 init_unistr2_from_unistr(&inf
->sepfile
, &info
->sepfile
);
1042 init_unistr2_from_unistr(&inf
->printprocessor
, &info
->printprocessor
);
1043 init_unistr2_from_unistr(&inf
->datatype
, &info
->datatype
);
1044 init_unistr2_from_unistr(&inf
->parameters
, &info
->parameters
);
1045 init_unistr2_from_unistr(&inf
->datatype
, &info
->datatype
);
1053 /*******************************************************************
1055 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1056 ********************************************************************/
1058 BOOL
spoolss_io_q_open_printer(char *desc
, SPOOL_Q_OPEN_PRINTER
*q_u
, prs_struct
*ps
, int depth
)
1063 prs_debug(ps
, depth
, desc
, "spoolss_io_q_open_printer");
1069 if (!prs_uint32("printername_ptr", ps
, depth
, &q_u
->printername_ptr
))
1071 if (!smb_io_unistr2("", &q_u
->printername
, q_u
->printername_ptr
, ps
,depth
))
1077 if (!spoolss_io_printer_default("", &q_u
->printer_default
, ps
, depth
))
1083 /*******************************************************************
1084 * write a structure.
1085 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1086 * called from spoolss_open_printer_ex (cli_spoolss.c)
1087 ********************************************************************/
1089 BOOL
spoolss_io_r_open_printer(char *desc
, SPOOL_R_OPEN_PRINTER
*r_u
, prs_struct
*ps
, int depth
)
1091 if (r_u
== NULL
) return False
;
1093 prs_debug(ps
, depth
, desc
, "spoolss_io_r_open_printer");
1099 if (!smb_io_pol_hnd("printer handle",&(r_u
->handle
),ps
,depth
))
1102 if (!prs_werror("status code", ps
, depth
, &(r_u
->status
)))
1109 /*******************************************************************
1111 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1112 ********************************************************************/
1114 BOOL
spoolss_io_q_open_printer_ex(char *desc
, SPOOL_Q_OPEN_PRINTER_EX
*q_u
, prs_struct
*ps
, int depth
)
1119 prs_debug(ps
, depth
, desc
, "spoolss_io_q_open_printer_ex");
1125 if (!prs_uint32("printername_ptr", ps
, depth
, &q_u
->printername_ptr
))
1127 if (!smb_io_unistr2("", &q_u
->printername
, q_u
->printername_ptr
, ps
,depth
))
1133 if (!spoolss_io_printer_default("", &q_u
->printer_default
, ps
, depth
))
1136 if (!prs_uint32("user_switch", ps
, depth
, &q_u
->user_switch
))
1138 if (!spool_io_user_level("", &q_u
->user_ctr
, ps
, depth
))
1144 /*******************************************************************
1145 * write a structure.
1146 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1147 * called from spoolss_open_printer_ex (cli_spoolss.c)
1148 ********************************************************************/
1150 BOOL
spoolss_io_r_open_printer_ex(char *desc
, SPOOL_R_OPEN_PRINTER_EX
*r_u
, prs_struct
*ps
, int depth
)
1152 if (r_u
== NULL
) return False
;
1154 prs_debug(ps
, depth
, desc
, "spoolss_io_r_open_printer_ex");
1160 if (!smb_io_pol_hnd("printer handle",&(r_u
->handle
),ps
,depth
))
1163 if (!prs_werror("status code", ps
, depth
, &(r_u
->status
)))
1169 /*******************************************************************
1171 ********************************************************************/
1172 BOOL
make_spoolss_q_deleteprinterdriver(
1173 TALLOC_CTX
*mem_ctx
,
1174 SPOOL_Q_DELETEPRINTERDRIVER
*q_u
,
1180 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1182 q_u
->server_ptr
= (server
!=NULL
)?1:0;
1184 /* these must be NULL terminated or else NT4 will
1185 complain about invalid parameters --jerry */
1186 init_unistr2(&q_u
->server
, server
, strlen(server
)+1);
1187 init_unistr2(&q_u
->arch
, arch
, strlen(arch
)+1);
1188 init_unistr2(&q_u
->driver
, driver
, strlen(driver
)+1);
1195 /*******************************************************************
1197 ********************************************************************/
1199 BOOL
make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA
*q_u
,
1200 const POLICY_HND
*handle
,
1201 char *valuename
, uint32 size
)
1203 if (q_u
== NULL
) return False
;
1205 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1207 q_u
->handle
= *handle
;
1208 init_unistr2(&q_u
->valuename
, valuename
, strlen(valuename
) + 1);
1214 /*******************************************************************
1216 ********************************************************************/
1218 BOOL
make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX
*q_u
,
1219 const POLICY_HND
*handle
,
1220 char *keyname
, char *valuename
, uint32 size
)
1222 if (q_u
== NULL
) return False
;
1224 DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
1226 q_u
->handle
= *handle
;
1227 init_unistr2(&q_u
->valuename
, valuename
, strlen(valuename
) + 1);
1228 init_unistr2(&q_u
->keyname
, keyname
, strlen(keyname
) + 1);
1234 /*******************************************************************
1236 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1237 ********************************************************************/
1239 BOOL
spoolss_io_q_getprinterdata(char *desc
, SPOOL_Q_GETPRINTERDATA
*q_u
, prs_struct
*ps
, int depth
)
1244 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getprinterdata");
1249 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1253 if (!smb_io_unistr2("valuename", &q_u
->valuename
,True
,ps
,depth
))
1257 if (!prs_uint32("size", ps
, depth
, &q_u
->size
))
1263 /*******************************************************************
1265 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1266 ********************************************************************/
1268 BOOL
spoolss_io_q_deleteprinterdata(char *desc
, SPOOL_Q_DELETEPRINTERDATA
*q_u
, prs_struct
*ps
, int depth
)
1273 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteprinterdata");
1278 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1282 if (!smb_io_unistr2("valuename", &q_u
->valuename
,True
,ps
,depth
))
1288 /*******************************************************************
1289 * write a structure.
1290 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1291 ********************************************************************/
1293 BOOL
spoolss_io_r_deleteprinterdata(char *desc
, SPOOL_R_DELETEPRINTERDATA
*r_u
, prs_struct
*ps
, int depth
)
1295 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteprinterdata");
1297 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1303 /*******************************************************************
1305 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1306 ********************************************************************/
1308 BOOL
spoolss_io_q_deleteprinterdataex(char *desc
, SPOOL_Q_DELETEPRINTERDATAEX
*q_u
, prs_struct
*ps
, int depth
)
1313 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteprinterdataex");
1318 if (!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
1321 if (!smb_io_unistr2("keyname ", &q_u
->keyname
, True
, ps
, depth
))
1323 if (!smb_io_unistr2("valuename", &q_u
->valuename
, True
, ps
, depth
))
1329 /*******************************************************************
1330 * write a structure.
1331 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1332 ********************************************************************/
1334 BOOL
spoolss_io_r_deleteprinterdataex(char *desc
, SPOOL_R_DELETEPRINTERDATAEX
*r_u
, prs_struct
*ps
, int depth
)
1336 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteprinterdataex");
1339 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1345 /*******************************************************************
1346 * write a structure.
1347 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1348 ********************************************************************/
1350 BOOL
spoolss_io_r_getprinterdata(char *desc
, SPOOL_R_GETPRINTERDATA
*r_u
, prs_struct
*ps
, int depth
)
1355 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getprinterdata");
1360 if (!prs_uint32("type", ps
, depth
, &r_u
->type
))
1362 if (!prs_uint32("size", ps
, depth
, &r_u
->size
))
1365 if (UNMARSHALLING(ps
) && r_u
->size
) {
1366 r_u
->data
= prs_alloc_mem(ps
, r_u
->size
);
1371 if (!prs_uint8s(False
,"data", ps
, depth
, r_u
->data
, r_u
->size
))
1377 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
1379 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
1385 /*******************************************************************
1387 ********************************************************************/
1389 BOOL
make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER
*q_u
, POLICY_HND
*hnd
)
1391 if (q_u
== NULL
) return False
;
1393 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1395 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
1400 /*******************************************************************
1402 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1403 * called from spoolss_abortprinter (cli_spoolss.c)
1404 ********************************************************************/
1406 BOOL
spoolss_io_q_abortprinter(char *desc
, SPOOL_Q_ABORTPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1408 if (q_u
== NULL
) return False
;
1410 prs_debug(ps
, depth
, desc
, "spoolss_io_q_abortprinter");
1416 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1422 /*******************************************************************
1423 * write a structure.
1424 * called from spoolss_r_abortprinter (srv_spoolss.c)
1425 ********************************************************************/
1427 BOOL
spoolss_io_r_abortprinter(char *desc
, SPOOL_R_ABORTPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1429 prs_debug(ps
, depth
, desc
, "spoolss_io_r_abortprinter");
1431 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1437 /*******************************************************************
1439 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1440 * called from spoolss_deleteprinter (cli_spoolss.c)
1441 ********************************************************************/
1443 BOOL
spoolss_io_q_deleteprinter(char *desc
, SPOOL_Q_DELETEPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1445 if (q_u
== NULL
) return False
;
1447 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteprinter");
1453 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1459 /*******************************************************************
1460 * write a structure.
1461 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1462 * called from spoolss_deleteprinter (cli_spoolss.c)
1463 ********************************************************************/
1465 BOOL
spoolss_io_r_deleteprinter(char *desc
, SPOOL_R_DELETEPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1467 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteprinter");
1473 if (!smb_io_pol_hnd("printer handle",&r_u
->handle
,ps
,depth
))
1475 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
1482 /*******************************************************************
1484 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1485 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1486 ********************************************************************/
1488 BOOL
spoolss_io_q_deleteprinterdriver(char *desc
, SPOOL_Q_DELETEPRINTERDRIVER
*q_u
, prs_struct
*ps
, int depth
)
1490 if (q_u
== NULL
) return False
;
1492 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteprinterdriver");
1498 if(!prs_uint32("server_ptr", ps
, depth
, &q_u
->server_ptr
))
1500 if(!smb_io_unistr2("server", &q_u
->server
, q_u
->server_ptr
, ps
, depth
))
1502 if(!smb_io_unistr2("arch", &q_u
->arch
, True
, ps
, depth
))
1504 if(!smb_io_unistr2("driver", &q_u
->driver
, True
, ps
, depth
))
1512 /*******************************************************************
1513 * write a structure.
1514 ********************************************************************/
1515 BOOL
spoolss_io_r_deleteprinterdriver(char *desc
, SPOOL_R_DELETEPRINTERDRIVER
*r_u
, prs_struct
*ps
, int depth
)
1517 if (r_u
== NULL
) return False
;
1519 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteprinterdriver");
1525 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
1532 /*******************************************************************
1534 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1535 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1536 ********************************************************************/
1538 BOOL
spoolss_io_q_deleteprinterdriverex(char *desc
, SPOOL_Q_DELETEPRINTERDRIVEREX
*q_u
, prs_struct
*ps
, int depth
)
1540 if (q_u
== NULL
) return False
;
1542 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteprinterdriverex");
1548 if(!prs_uint32("server_ptr", ps
, depth
, &q_u
->server_ptr
))
1550 if(!smb_io_unistr2("server", &q_u
->server
, q_u
->server_ptr
, ps
, depth
))
1552 if(!smb_io_unistr2("arch", &q_u
->arch
, True
, ps
, depth
))
1554 if(!smb_io_unistr2("driver", &q_u
->driver
, True
, ps
, depth
))
1560 if(!prs_uint32("delete_flags ", ps
, depth
, &q_u
->delete_flags
))
1562 if(!prs_uint32("version ", ps
, depth
, &q_u
->version
))
1570 /*******************************************************************
1571 * write a structure.
1572 ********************************************************************/
1573 BOOL
spoolss_io_r_deleteprinterdriverex(char *desc
, SPOOL_R_DELETEPRINTERDRIVEREX
*r_u
, prs_struct
*ps
, int depth
)
1575 if (r_u
== NULL
) return False
;
1577 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteprinterdriverex");
1583 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
1591 /*******************************************************************
1593 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1594 * called from spoolss_closeprinter (cli_spoolss.c)
1595 ********************************************************************/
1597 BOOL
spoolss_io_q_closeprinter(char *desc
, SPOOL_Q_CLOSEPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1599 if (q_u
== NULL
) return False
;
1601 prs_debug(ps
, depth
, desc
, "spoolss_io_q_closeprinter");
1607 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1613 /*******************************************************************
1614 * write a structure.
1615 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1616 * called from spoolss_closeprinter (cli_spoolss.c)
1617 ********************************************************************/
1619 BOOL
spoolss_io_r_closeprinter(char *desc
, SPOOL_R_CLOSEPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1621 prs_debug(ps
, depth
, desc
, "spoolss_io_r_closeprinter");
1627 if (!smb_io_pol_hnd("printer handle",&r_u
->handle
,ps
,depth
))
1629 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
1635 /*******************************************************************
1637 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1638 ********************************************************************/
1640 BOOL
spoolss_io_q_startdocprinter(char *desc
, SPOOL_Q_STARTDOCPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1642 if (q_u
== NULL
) return False
;
1644 prs_debug(ps
, depth
, desc
, "spoolss_io_q_startdocprinter");
1650 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1653 if(!smb_io_doc_info_container("",&q_u
->doc_info_container
, ps
, depth
))
1659 /*******************************************************************
1660 * write a structure.
1661 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1662 ********************************************************************/
1664 BOOL
spoolss_io_r_startdocprinter(char *desc
, SPOOL_R_STARTDOCPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1666 prs_debug(ps
, depth
, desc
, "spoolss_io_r_startdocprinter");
1668 if(!prs_uint32("jobid", ps
, depth
, &r_u
->jobid
))
1670 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1676 /*******************************************************************
1678 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1679 ********************************************************************/
1681 BOOL
spoolss_io_q_enddocprinter(char *desc
, SPOOL_Q_ENDDOCPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1683 if (q_u
== NULL
) return False
;
1685 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enddocprinter");
1691 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1697 /*******************************************************************
1698 * write a structure.
1699 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1700 ********************************************************************/
1702 BOOL
spoolss_io_r_enddocprinter(char *desc
, SPOOL_R_ENDDOCPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1704 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enddocprinter");
1706 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1712 /*******************************************************************
1714 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1715 ********************************************************************/
1717 BOOL
spoolss_io_q_startpageprinter(char *desc
, SPOOL_Q_STARTPAGEPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1719 if (q_u
== NULL
) return False
;
1721 prs_debug(ps
, depth
, desc
, "spoolss_io_q_startpageprinter");
1727 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1733 /*******************************************************************
1734 * write a structure.
1735 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1736 ********************************************************************/
1738 BOOL
spoolss_io_r_startpageprinter(char *desc
, SPOOL_R_STARTPAGEPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1740 prs_debug(ps
, depth
, desc
, "spoolss_io_r_startpageprinter");
1742 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1748 /*******************************************************************
1750 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1751 ********************************************************************/
1753 BOOL
spoolss_io_q_endpageprinter(char *desc
, SPOOL_Q_ENDPAGEPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1755 if (q_u
== NULL
) return False
;
1757 prs_debug(ps
, depth
, desc
, "spoolss_io_q_endpageprinter");
1763 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1769 /*******************************************************************
1770 * write a structure.
1771 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1772 ********************************************************************/
1774 BOOL
spoolss_io_r_endpageprinter(char *desc
, SPOOL_R_ENDPAGEPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1776 prs_debug(ps
, depth
, desc
, "spoolss_io_r_endpageprinter");
1778 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1784 /*******************************************************************
1786 * called from spoolss_q_writeprinter (srv_spoolss.c)
1787 ********************************************************************/
1789 BOOL
spoolss_io_q_writeprinter(char *desc
, SPOOL_Q_WRITEPRINTER
*q_u
, prs_struct
*ps
, int depth
)
1791 if (q_u
== NULL
) return False
;
1793 prs_debug(ps
, depth
, desc
, "spoolss_io_q_writeprinter");
1799 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1801 if(!prs_uint32("buffer_size", ps
, depth
, &q_u
->buffer_size
))
1804 if (q_u
->buffer_size
!=0)
1806 if (UNMARSHALLING(ps
))
1807 q_u
->buffer
=(uint8
*)prs_alloc_mem(ps
,q_u
->buffer_size
*sizeof(uint8
));
1808 if(q_u
->buffer
== NULL
)
1810 if(!prs_uint8s(True
, "buffer", ps
, depth
, q_u
->buffer
, q_u
->buffer_size
))
1815 if(!prs_uint32("buffer_size2", ps
, depth
, &q_u
->buffer_size2
))
1821 /*******************************************************************
1822 * write a structure.
1823 * called from spoolss_r_writeprinter (srv_spoolss.c)
1824 ********************************************************************/
1826 BOOL
spoolss_io_r_writeprinter(char *desc
, SPOOL_R_WRITEPRINTER
*r_u
, prs_struct
*ps
, int depth
)
1828 prs_debug(ps
, depth
, desc
, "spoolss_io_r_writeprinter");
1830 if(!prs_uint32("buffer_written", ps
, depth
, &r_u
->buffer_written
))
1832 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1838 /*******************************************************************
1840 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1841 ********************************************************************/
1843 BOOL
spoolss_io_q_rffpcnex(char *desc
, SPOOL_Q_RFFPCNEX
*q_u
, prs_struct
*ps
, int depth
)
1845 prs_debug(ps
, depth
, desc
, "spoolss_io_q_rffpcnex");
1851 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
1853 if(!prs_uint32("flags", ps
, depth
, &q_u
->flags
))
1855 if(!prs_uint32("options", ps
, depth
, &q_u
->options
))
1857 if(!prs_uint32("localmachine_ptr", ps
, depth
, &q_u
->localmachine_ptr
))
1859 if(!smb_io_unistr2("localmachine", &q_u
->localmachine
, q_u
->localmachine_ptr
, ps
, depth
))
1865 if(!prs_uint32("printerlocal", ps
, depth
, &q_u
->printerlocal
))
1868 if(!prs_uint32("option_ptr", ps
, depth
, &q_u
->option_ptr
))
1871 if (q_u
->option_ptr
!=0) {
1873 if (UNMARSHALLING(ps
))
1874 if((q_u
->option
=(SPOOL_NOTIFY_OPTION
*)prs_alloc_mem(ps
,sizeof(SPOOL_NOTIFY_OPTION
))) == NULL
)
1877 if(!smb_io_notify_option("notify option", q_u
->option
, ps
, depth
))
1884 /*******************************************************************
1885 * write a structure.
1886 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1887 ********************************************************************/
1889 BOOL
spoolss_io_r_rffpcnex(char *desc
, SPOOL_R_RFFPCNEX
*r_u
, prs_struct
*ps
, int depth
)
1891 prs_debug(ps
, depth
, desc
, "spoolss_io_r_rffpcnex");
1894 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1900 /*******************************************************************
1902 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1903 ********************************************************************/
1905 BOOL
spoolss_io_q_rfnpcnex(char *desc
, SPOOL_Q_RFNPCNEX
*q_u
, prs_struct
*ps
, int depth
)
1907 prs_debug(ps
, depth
, desc
, "spoolss_io_q_rfnpcnex");
1913 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
1916 if(!prs_uint32("change", ps
, depth
, &q_u
->change
))
1919 if(!prs_uint32("option_ptr", ps
, depth
, &q_u
->option_ptr
))
1922 if (q_u
->option_ptr
!=0) {
1924 if (UNMARSHALLING(ps
))
1925 if((q_u
->option
=(SPOOL_NOTIFY_OPTION
*)prs_alloc_mem(ps
,sizeof(SPOOL_NOTIFY_OPTION
))) == NULL
)
1928 if(!smb_io_notify_option("notify option", q_u
->option
, ps
, depth
))
1935 /*******************************************************************
1936 * write a structure.
1937 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1938 ********************************************************************/
1940 BOOL
spoolss_io_r_rfnpcnex(char *desc
, SPOOL_R_RFNPCNEX
*r_u
, prs_struct
*ps
, int depth
)
1942 prs_debug(ps
, depth
, desc
, "spoolss_io_r_rfnpcnex");
1948 if (!prs_uint32("info_ptr", ps
, depth
, &r_u
->info_ptr
))
1951 if(!smb_io_notify_info("notify info", &r_u
->info
,ps
,depth
))
1956 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
1962 /*******************************************************************
1963 * return the length of a uint16 (obvious, but the code is clean)
1964 ********************************************************************/
1966 static uint32
size_of_uint16(uint16
*value
)
1968 return (sizeof(*value
));
1971 /*******************************************************************
1972 * return the length of a uint32 (obvious, but the code is clean)
1973 ********************************************************************/
1975 static uint32
size_of_uint32(uint32
*value
)
1977 return (sizeof(*value
));
1980 /*******************************************************************
1981 * return the length of a NTTIME (obvious, but the code is clean)
1982 ********************************************************************/
1984 static uint32
size_of_nttime(NTTIME
*value
)
1986 return (sizeof(*value
));
1989 /*******************************************************************
1990 * return the length of a UNICODE string in number of char, includes:
1991 * - the leading zero
1992 * - the relative pointer size
1993 ********************************************************************/
1995 static uint32
size_of_relative_string(UNISTR
*string
)
1999 size
=str_len_uni(string
); /* the string length */
2000 size
=size
+1; /* add the trailing zero */
2001 size
=size
*2; /* convert in char */
2002 size
=size
+4; /* add the size of the ptr */
2006 * Do not include alignment as Win2k does not align relative
2007 * strings within a buffer --jerry
2009 /* Ensure size is 4 byte multiple (prs_align is being called...). */
2010 /* size += ((4 - (size & 3)) & 3); */
2016 /*******************************************************************
2017 * return the length of a uint32 (obvious, but the code is clean)
2018 ********************************************************************/
2020 static uint32
size_of_device_mode(DEVICEMODE
*devmode
)
2025 return (4+devmode
->size
+devmode
->driverextra
);
2028 /*******************************************************************
2029 * return the length of a uint32 (obvious, but the code is clean)
2030 ********************************************************************/
2032 static uint32
size_of_systemtime(SYSTEMTIME
*systime
)
2037 return (sizeof(SYSTEMTIME
) +4);
2040 /*******************************************************************
2041 * write a UNICODE string and its relative pointer.
2042 * used by all the RPC structs passing a buffer
2044 * As I'm a nice guy, I'm forcing myself to explain this code.
2045 * MS did a good job in the overall spoolss code except in some
2046 * functions where they are passing the API buffer directly in the
2047 * RPC request/reply. That's to maintain compatiility at the API level.
2048 * They could have done it the good way the first time.
2050 * So what happen is: the strings are written at the buffer's end,
2051 * in the reverse order of the original structure. Some pointers to
2052 * the strings are also in the buffer. Those are relative to the
2055 * If you don't understand or want to change that function,
2056 * first get in touch with me: jfm@samba.org
2058 ********************************************************************/
2060 static BOOL
smb_io_relstr(char *desc
, NEW_BUFFER
*buffer
, int depth
, UNISTR
*string
)
2062 prs_struct
*ps
=&buffer
->prs
;
2064 if (MARSHALLING(ps
)) {
2065 uint32 struct_offset
= prs_offset(ps
);
2066 uint32 relative_offset
;
2068 buffer
->string_at_end
-= (size_of_relative_string(string
) - 4);
2069 if(!prs_set_offset(ps
, buffer
->string_at_end
))
2073 * Win2k does not align strings in a buffer
2074 * Tested against WinNT 4.0 SP 6a & 2k SP2 --jerry
2079 buffer
->string_at_end
= prs_offset(ps
);
2081 /* write the string */
2082 if (!smb_io_unistr(desc
, string
, ps
, depth
))
2085 if(!prs_set_offset(ps
, struct_offset
))
2088 relative_offset
=buffer
->string_at_end
- buffer
->struct_start
;
2089 /* write its offset */
2090 if (!prs_uint32("offset", ps
, depth
, &relative_offset
))
2096 /* read the offset */
2097 if (!prs_uint32("offset", ps
, depth
, &(buffer
->string_at_end
)))
2100 if (buffer
->string_at_end
== 0)
2103 old_offset
= prs_offset(ps
);
2104 if(!prs_set_offset(ps
, buffer
->string_at_end
+buffer
->struct_start
))
2107 /* read the string */
2108 if (!smb_io_unistr(desc
, string
, ps
, depth
))
2111 if(!prs_set_offset(ps
, old_offset
))
2117 /*******************************************************************
2118 * write a array of UNICODE strings and its relative pointer.
2119 * used by 2 RPC structs
2120 ********************************************************************/
2122 static BOOL
smb_io_relarraystr(char *desc
, NEW_BUFFER
*buffer
, int depth
, uint16
**string
)
2126 prs_struct
*ps
=&buffer
->prs
;
2128 if (MARSHALLING(ps
)) {
2129 uint32 struct_offset
= prs_offset(ps
);
2130 uint32 relative_offset
;
2137 /* first write the last 0 */
2138 buffer
->string_at_end
-= 2;
2139 if(!prs_set_offset(ps
, buffer
->string_at_end
))
2142 if(!prs_uint16("leading zero", ps
, depth
, &zero
))
2145 while (p
&& (*p
!=0)) {
2149 /* Yes this should be malloc not talloc. Don't change. */
2151 chaine
.buffer
= malloc((q
-p
+1)*sizeof(uint16
));
2152 if (chaine
.buffer
== NULL
)
2155 memcpy(chaine
.buffer
, p
, (q
-p
+1)*sizeof(uint16
));
2157 buffer
->string_at_end
-= (q
-p
+1)*sizeof(uint16
);
2159 if(!prs_set_offset(ps
, buffer
->string_at_end
)) {
2160 SAFE_FREE(chaine
.buffer
);
2164 /* write the string */
2165 if (!smb_io_unistr(desc
, &chaine
, ps
, depth
)) {
2166 SAFE_FREE(chaine
.buffer
);
2172 SAFE_FREE(chaine
.buffer
);
2175 if(!prs_set_offset(ps
, struct_offset
))
2178 relative_offset
=buffer
->string_at_end
- buffer
->struct_start
;
2179 /* write its offset */
2180 if (!prs_uint32("offset", ps
, depth
, &relative_offset
))
2188 uint16
*chaine2
=NULL
;
2191 size_t realloc_size
= 0;
2195 /* read the offset */
2196 if (!prs_uint32("offset", ps
, depth
, &buffer
->string_at_end
))
2199 old_offset
= prs_offset(ps
);
2200 if(!prs_set_offset(ps
, buffer
->string_at_end
+ buffer
->struct_start
))
2204 if (!smb_io_unistr(desc
, &chaine
, ps
, depth
))
2207 l_chaine
=str_len_uni(&chaine
);
2209 /* we're going to add two more bytes here in case this
2210 is the last string in the array and we need to add
2211 an extra NULL for termination */
2216 realloc_size
= (l_chaine2
+l_chaine
+2)*sizeof(uint16
);
2218 /* Yes this should be realloc - it's freed below. JRA */
2220 if((tc2
=(uint16
*)Realloc(chaine2
, realloc_size
)) == NULL
) {
2225 memcpy(chaine2
+l_chaine2
, chaine
.buffer
, (l_chaine
+1)*sizeof(uint16
));
2226 l_chaine2
+=l_chaine
+1;
2229 } while(l_chaine
!=0);
2231 /* the end should be bould NULL terminated so add
2232 the second one here */
2235 chaine2
[l_chaine2
] = '\0';
2236 *string
=(uint16
*)talloc_memdup(prs_get_mem_context(ps
),chaine2
,realloc_size
);
2240 if(!prs_set_offset(ps
, old_offset
))
2246 /*******************************************************************
2247 Parse a DEVMODE structure and its relative pointer.
2248 ********************************************************************/
2250 static BOOL
smb_io_relsecdesc(char *desc
, NEW_BUFFER
*buffer
, int depth
, SEC_DESC
**secdesc
)
2252 prs_struct
*ps
= &buffer
->prs
;
2254 prs_debug(ps
, depth
, desc
, "smb_io_relsecdesc");
2257 if (MARSHALLING(ps
)) {
2258 uint32 struct_offset
= prs_offset(ps
);
2259 uint32 relative_offset
;
2262 relative_offset
= 0;
2263 if (!prs_uint32("offset", ps
, depth
, &relative_offset
))
2268 if (*secdesc
!= NULL
) {
2269 buffer
->string_at_end
-= sec_desc_size(*secdesc
);
2271 if(!prs_set_offset(ps
, buffer
->string_at_end
))
2273 /* write the secdesc */
2274 if (!sec_io_desc(desc
, secdesc
, ps
, depth
))
2277 if(!prs_set_offset(ps
, struct_offset
))
2281 relative_offset
=buffer
->string_at_end
- buffer
->struct_start
;
2282 /* write its offset */
2284 if (!prs_uint32("offset", ps
, depth
, &relative_offset
))
2289 /* read the offset */
2290 if (!prs_uint32("offset", ps
, depth
, &buffer
->string_at_end
))
2293 old_offset
= prs_offset(ps
);
2294 if(!prs_set_offset(ps
, buffer
->string_at_end
+ buffer
->struct_start
))
2298 if (!sec_io_desc(desc
, secdesc
, ps
, depth
))
2301 if(!prs_set_offset(ps
, old_offset
))
2307 /*******************************************************************
2308 Parse a DEVMODE structure and its relative pointer.
2309 ********************************************************************/
2311 static BOOL
smb_io_reldevmode(char *desc
, NEW_BUFFER
*buffer
, int depth
, DEVICEMODE
**devmode
)
2313 prs_struct
*ps
=&buffer
->prs
;
2315 prs_debug(ps
, depth
, desc
, "smb_io_reldevmode");
2318 if (MARSHALLING(ps
)) {
2319 uint32 struct_offset
= prs_offset(ps
);
2320 uint32 relative_offset
;
2322 if (*devmode
== NULL
) {
2324 if (!prs_uint32("offset", ps
, depth
, &relative_offset
))
2326 DEBUG(8, ("boing, the devmode was NULL\n"));
2331 buffer
->string_at_end
-= ((*devmode
)->size
+ (*devmode
)->driverextra
);
2333 if(!prs_set_offset(ps
, buffer
->string_at_end
))
2336 /* write the DEVMODE */
2337 if (!spoolss_io_devmode(desc
, ps
, depth
, *devmode
))
2340 if(!prs_set_offset(ps
, struct_offset
))
2343 relative_offset
=buffer
->string_at_end
- buffer
->struct_start
;
2344 /* write its offset */
2345 if (!prs_uint32("offset", ps
, depth
, &relative_offset
))
2351 /* read the offset */
2352 if (!prs_uint32("offset", ps
, depth
, &buffer
->string_at_end
))
2354 if (buffer
->string_at_end
== 0) {
2359 old_offset
= prs_offset(ps
);
2360 if(!prs_set_offset(ps
, buffer
->string_at_end
+ buffer
->struct_start
))
2363 /* read the string */
2364 if((*devmode
=(DEVICEMODE
*)prs_alloc_mem(ps
,sizeof(DEVICEMODE
))) == NULL
)
2366 if (!spoolss_io_devmode(desc
, ps
, depth
, *devmode
))
2369 if(!prs_set_offset(ps
, old_offset
))
2375 /*******************************************************************
2376 Parse a PRINTER_INFO_0 structure.
2377 ********************************************************************/
2379 BOOL
smb_io_printer_info_0(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_0
*info
, int depth
)
2381 prs_struct
*ps
=&buffer
->prs
;
2383 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_0");
2386 buffer
->struct_start
=prs_offset(ps
);
2388 if (!smb_io_relstr("printername", buffer
, depth
, &info
->printername
))
2390 if (!smb_io_relstr("servername", buffer
, depth
, &info
->servername
))
2393 if(!prs_uint32("cjobs", ps
, depth
, &info
->cjobs
))
2395 if(!prs_uint32("total_jobs", ps
, depth
, &info
->total_jobs
))
2397 if(!prs_uint32("total_bytes", ps
, depth
, &info
->total_bytes
))
2400 if(!prs_uint16("year", ps
, depth
, &info
->year
))
2402 if(!prs_uint16("month", ps
, depth
, &info
->month
))
2404 if(!prs_uint16("dayofweek", ps
, depth
, &info
->dayofweek
))
2406 if(!prs_uint16("day", ps
, depth
, &info
->day
))
2408 if(!prs_uint16("hour", ps
, depth
, &info
->hour
))
2410 if(!prs_uint16("minute", ps
, depth
, &info
->minute
))
2412 if(!prs_uint16("second", ps
, depth
, &info
->second
))
2414 if(!prs_uint16("milliseconds", ps
, depth
, &info
->milliseconds
))
2417 if(!prs_uint32("global_counter", ps
, depth
, &info
->global_counter
))
2419 if(!prs_uint32("total_pages", ps
, depth
, &info
->total_pages
))
2422 if(!prs_uint16("major_version", ps
, depth
, &info
->major_version
))
2424 if(!prs_uint16("build_version", ps
, depth
, &info
->build_version
))
2426 if(!prs_uint32("unknown7", ps
, depth
, &info
->unknown7
))
2428 if(!prs_uint32("unknown8", ps
, depth
, &info
->unknown8
))
2430 if(!prs_uint32("unknown9", ps
, depth
, &info
->unknown9
))
2432 if(!prs_uint32("session_counter", ps
, depth
, &info
->session_counter
))
2434 if(!prs_uint32("unknown11", ps
, depth
, &info
->unknown11
))
2436 if(!prs_uint32("printer_errors", ps
, depth
, &info
->printer_errors
))
2438 if(!prs_uint32("unknown13", ps
, depth
, &info
->unknown13
))
2440 if(!prs_uint32("unknown14", ps
, depth
, &info
->unknown14
))
2442 if(!prs_uint32("unknown15", ps
, depth
, &info
->unknown15
))
2444 if(!prs_uint32("unknown16", ps
, depth
, &info
->unknown16
))
2446 if(!prs_uint32("change_id", ps
, depth
, &info
->change_id
))
2448 if(!prs_uint32("unknown18", ps
, depth
, &info
->unknown18
))
2450 if(!prs_uint32("status" , ps
, depth
, &info
->status
))
2452 if(!prs_uint32("unknown20", ps
, depth
, &info
->unknown20
))
2454 if(!prs_uint32("c_setprinter", ps
, depth
, &info
->c_setprinter
))
2456 if(!prs_uint16("unknown22", ps
, depth
, &info
->unknown22
))
2458 if(!prs_uint16("unknown23", ps
, depth
, &info
->unknown23
))
2460 if(!prs_uint16("unknown24", ps
, depth
, &info
->unknown24
))
2462 if(!prs_uint16("unknown25", ps
, depth
, &info
->unknown25
))
2464 if(!prs_uint16("unknown26", ps
, depth
, &info
->unknown26
))
2466 if(!prs_uint16("unknown27", ps
, depth
, &info
->unknown27
))
2468 if(!prs_uint16("unknown28", ps
, depth
, &info
->unknown28
))
2470 if(!prs_uint16("unknown29", ps
, depth
, &info
->unknown29
))
2476 /*******************************************************************
2477 Parse a PRINTER_INFO_1 structure.
2478 ********************************************************************/
2480 BOOL
smb_io_printer_info_1(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_1
*info
, int depth
)
2482 prs_struct
*ps
=&buffer
->prs
;
2484 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_1");
2487 buffer
->struct_start
=prs_offset(ps
);
2489 if (!prs_uint32("flags", ps
, depth
, &info
->flags
))
2491 if (!smb_io_relstr("description", buffer
, depth
, &info
->description
))
2493 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
2495 if (!smb_io_relstr("comment", buffer
, depth
, &info
->comment
))
2501 /*******************************************************************
2502 Parse a PRINTER_INFO_2 structure.
2503 ********************************************************************/
2505 BOOL
smb_io_printer_info_2(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_2
*info
, int depth
)
2507 prs_struct
*ps
=&buffer
->prs
;
2508 uint32 dm_offset
, sd_offset
, current_offset
;
2509 uint32 dummy_value
= 0, has_secdesc
= 0;
2511 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_2");
2514 buffer
->struct_start
=prs_offset(ps
);
2516 if (!smb_io_relstr("servername", buffer
, depth
, &info
->servername
))
2518 if (!smb_io_relstr("printername", buffer
, depth
, &info
->printername
))
2520 if (!smb_io_relstr("sharename", buffer
, depth
, &info
->sharename
))
2522 if (!smb_io_relstr("portname", buffer
, depth
, &info
->portname
))
2524 if (!smb_io_relstr("drivername", buffer
, depth
, &info
->drivername
))
2526 if (!smb_io_relstr("comment", buffer
, depth
, &info
->comment
))
2528 if (!smb_io_relstr("location", buffer
, depth
, &info
->location
))
2531 /* save current offset and wind forwared by a uint32 */
2532 dm_offset
= prs_offset(ps
);
2533 if (!prs_uint32("devmode", ps
, depth
, &dummy_value
))
2536 if (!smb_io_relstr("sepfile", buffer
, depth
, &info
->sepfile
))
2538 if (!smb_io_relstr("printprocessor", buffer
, depth
, &info
->printprocessor
))
2540 if (!smb_io_relstr("datatype", buffer
, depth
, &info
->datatype
))
2542 if (!smb_io_relstr("parameters", buffer
, depth
, &info
->parameters
))
2545 /* save current offset for the sec_desc */
2546 sd_offset
= prs_offset(ps
);
2547 if (!prs_uint32("sec_desc", ps
, depth
, &has_secdesc
))
2551 /* save current location so we can pick back up here */
2552 current_offset
= prs_offset(ps
);
2554 /* parse the devmode */
2555 if (!prs_set_offset(ps
, dm_offset
))
2557 if (!smb_io_reldevmode("devmode", buffer
, depth
, &info
->devmode
))
2560 /* parse the sec_desc */
2562 if (!prs_set_offset(ps
, sd_offset
))
2564 if (!smb_io_relsecdesc("secdesc", buffer
, depth
, &info
->secdesc
))
2568 /* pick up where we left off */
2569 if (!prs_set_offset(ps
, current_offset
))
2572 if (!prs_uint32("attributes", ps
, depth
, &info
->attributes
))
2574 if (!prs_uint32("priority", ps
, depth
, &info
->priority
))
2576 if (!prs_uint32("defpriority", ps
, depth
, &info
->defaultpriority
))
2578 if (!prs_uint32("starttime", ps
, depth
, &info
->starttime
))
2580 if (!prs_uint32("untiltime", ps
, depth
, &info
->untiltime
))
2582 if (!prs_uint32("status", ps
, depth
, &info
->status
))
2584 if (!prs_uint32("jobs", ps
, depth
, &info
->cjobs
))
2586 if (!prs_uint32("averageppm", ps
, depth
, &info
->averageppm
))
2592 /*******************************************************************
2593 Parse a PRINTER_INFO_3 structure.
2594 ********************************************************************/
2596 BOOL
smb_io_printer_info_3(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_3
*info
, int depth
)
2598 prs_struct
*ps
=&buffer
->prs
;
2600 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_3");
2603 buffer
->struct_start
=prs_offset(ps
);
2605 if (!prs_uint32("flags", ps
, depth
, &info
->flags
))
2607 if (!sec_io_desc("sec_desc", &info
->secdesc
, ps
, depth
))
2613 /*******************************************************************
2614 Parse a PRINTER_INFO_4 structure.
2615 ********************************************************************/
2617 BOOL
smb_io_printer_info_4(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_4
*info
, int depth
)
2619 prs_struct
*ps
=&buffer
->prs
;
2621 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_4");
2624 buffer
->struct_start
=prs_offset(ps
);
2626 if (!smb_io_relstr("printername", buffer
, depth
, &info
->printername
))
2628 if (!smb_io_relstr("servername", buffer
, depth
, &info
->servername
))
2630 if (!prs_uint32("attributes", ps
, depth
, &info
->attributes
))
2635 /*******************************************************************
2636 Parse a PRINTER_INFO_5 structure.
2637 ********************************************************************/
2639 BOOL
smb_io_printer_info_5(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_5
*info
, int depth
)
2641 prs_struct
*ps
=&buffer
->prs
;
2643 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_5");
2646 buffer
->struct_start
=prs_offset(ps
);
2648 if (!smb_io_relstr("printername", buffer
, depth
, &info
->printername
))
2650 if (!smb_io_relstr("portname", buffer
, depth
, &info
->portname
))
2652 if (!prs_uint32("attributes", ps
, depth
, &info
->attributes
))
2654 if (!prs_uint32("device_not_selected_timeout", ps
, depth
, &info
->device_not_selected_timeout
))
2656 if (!prs_uint32("transmission_retry_timeout", ps
, depth
, &info
->transmission_retry_timeout
))
2661 /*******************************************************************
2662 Parse a PRINTER_INFO_7 structure.
2663 ********************************************************************/
2665 BOOL
smb_io_printer_info_7(char *desc
, NEW_BUFFER
*buffer
, PRINTER_INFO_7
*info
, int depth
)
2667 prs_struct
*ps
=&buffer
->prs
;
2669 prs_debug(ps
, depth
, desc
, "smb_io_printer_info_7");
2672 buffer
->struct_start
=prs_offset(ps
);
2674 if (!smb_io_relstr("guid", buffer
, depth
, &info
->guid
))
2676 if (!prs_uint32("action", ps
, depth
, &info
->action
))
2681 /*******************************************************************
2682 Parse a PORT_INFO_1 structure.
2683 ********************************************************************/
2685 BOOL
smb_io_port_info_1(char *desc
, NEW_BUFFER
*buffer
, PORT_INFO_1
*info
, int depth
)
2687 prs_struct
*ps
=&buffer
->prs
;
2689 prs_debug(ps
, depth
, desc
, "smb_io_port_info_1");
2692 buffer
->struct_start
=prs_offset(ps
);
2694 if (!smb_io_relstr("port_name", buffer
, depth
, &info
->port_name
))
2700 /*******************************************************************
2701 Parse a PORT_INFO_2 structure.
2702 ********************************************************************/
2704 BOOL
smb_io_port_info_2(char *desc
, NEW_BUFFER
*buffer
, PORT_INFO_2
*info
, int depth
)
2706 prs_struct
*ps
=&buffer
->prs
;
2708 prs_debug(ps
, depth
, desc
, "smb_io_port_info_2");
2711 buffer
->struct_start
=prs_offset(ps
);
2713 if (!smb_io_relstr("port_name", buffer
, depth
, &info
->port_name
))
2715 if (!smb_io_relstr("monitor_name", buffer
, depth
, &info
->monitor_name
))
2717 if (!smb_io_relstr("description", buffer
, depth
, &info
->description
))
2719 if (!prs_uint32("port_type", ps
, depth
, &info
->port_type
))
2721 if (!prs_uint32("reserved", ps
, depth
, &info
->reserved
))
2727 /*******************************************************************
2728 Parse a DRIVER_INFO_1 structure.
2729 ********************************************************************/
2731 BOOL
smb_io_printer_driver_info_1(char *desc
, NEW_BUFFER
*buffer
, DRIVER_INFO_1
*info
, int depth
)
2733 prs_struct
*ps
=&buffer
->prs
;
2735 prs_debug(ps
, depth
, desc
, "smb_io_printer_driver_info_1");
2738 buffer
->struct_start
=prs_offset(ps
);
2740 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
2746 /*******************************************************************
2747 Parse a DRIVER_INFO_2 structure.
2748 ********************************************************************/
2750 BOOL
smb_io_printer_driver_info_2(char *desc
, NEW_BUFFER
*buffer
, DRIVER_INFO_2
*info
, int depth
)
2752 prs_struct
*ps
=&buffer
->prs
;
2754 prs_debug(ps
, depth
, desc
, "smb_io_printer_driver_info_2");
2757 buffer
->struct_start
=prs_offset(ps
);
2759 if (!prs_uint32("version", ps
, depth
, &info
->version
))
2761 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
2763 if (!smb_io_relstr("architecture", buffer
, depth
, &info
->architecture
))
2765 if (!smb_io_relstr("driverpath", buffer
, depth
, &info
->driverpath
))
2767 if (!smb_io_relstr("datafile", buffer
, depth
, &info
->datafile
))
2769 if (!smb_io_relstr("configfile", buffer
, depth
, &info
->configfile
))
2775 /*******************************************************************
2776 Parse a DRIVER_INFO_3 structure.
2777 ********************************************************************/
2779 BOOL
smb_io_printer_driver_info_3(char *desc
, NEW_BUFFER
*buffer
, DRIVER_INFO_3
*info
, int depth
)
2781 prs_struct
*ps
=&buffer
->prs
;
2783 prs_debug(ps
, depth
, desc
, "smb_io_printer_driver_info_3");
2786 buffer
->struct_start
=prs_offset(ps
);
2788 if (!prs_uint32("version", ps
, depth
, &info
->version
))
2790 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
2792 if (!smb_io_relstr("architecture", buffer
, depth
, &info
->architecture
))
2794 if (!smb_io_relstr("driverpath", buffer
, depth
, &info
->driverpath
))
2796 if (!smb_io_relstr("datafile", buffer
, depth
, &info
->datafile
))
2798 if (!smb_io_relstr("configfile", buffer
, depth
, &info
->configfile
))
2800 if (!smb_io_relstr("helpfile", buffer
, depth
, &info
->helpfile
))
2803 if (!smb_io_relarraystr("dependentfiles", buffer
, depth
, &info
->dependentfiles
))
2806 if (!smb_io_relstr("monitorname", buffer
, depth
, &info
->monitorname
))
2808 if (!smb_io_relstr("defaultdatatype", buffer
, depth
, &info
->defaultdatatype
))
2814 /*******************************************************************
2815 Parse a DRIVER_INFO_6 structure.
2816 ********************************************************************/
2818 BOOL
smb_io_printer_driver_info_6(char *desc
, NEW_BUFFER
*buffer
, DRIVER_INFO_6
*info
, int depth
)
2820 prs_struct
*ps
=&buffer
->prs
;
2822 prs_debug(ps
, depth
, desc
, "smb_io_printer_driver_info_6");
2825 buffer
->struct_start
=prs_offset(ps
);
2827 if (!prs_uint32("version", ps
, depth
, &info
->version
))
2829 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
2831 if (!smb_io_relstr("architecture", buffer
, depth
, &info
->architecture
))
2833 if (!smb_io_relstr("driverpath", buffer
, depth
, &info
->driverpath
))
2835 if (!smb_io_relstr("datafile", buffer
, depth
, &info
->datafile
))
2837 if (!smb_io_relstr("configfile", buffer
, depth
, &info
->configfile
))
2839 if (!smb_io_relstr("helpfile", buffer
, depth
, &info
->helpfile
))
2842 if (!smb_io_relarraystr("dependentfiles", buffer
, depth
, &info
->dependentfiles
))
2845 if (!smb_io_relstr("monitorname", buffer
, depth
, &info
->monitorname
))
2847 if (!smb_io_relstr("defaultdatatype", buffer
, depth
, &info
->defaultdatatype
))
2850 if (!smb_io_relarraystr("previousdrivernames", buffer
, depth
, &info
->previousdrivernames
))
2853 if (!prs_uint32("date.low", ps
, depth
, &info
->driver_date
.low
))
2855 if (!prs_uint32("date.high", ps
, depth
, &info
->driver_date
.high
))
2858 if (!prs_uint32("padding", ps
, depth
, &info
->padding
))
2861 if (!prs_uint32("driver_version_low", ps
, depth
, &info
->driver_version_low
))
2864 if (!prs_uint32("driver_version_high", ps
, depth
, &info
->driver_version_high
))
2867 if (!smb_io_relstr("mfgname", buffer
, depth
, &info
->mfgname
))
2869 if (!smb_io_relstr("oem_url", buffer
, depth
, &info
->oem_url
))
2871 if (!smb_io_relstr("hardware_id", buffer
, depth
, &info
->hardware_id
))
2873 if (!smb_io_relstr("provider", buffer
, depth
, &info
->provider
))
2879 /*******************************************************************
2880 Parse a JOB_INFO_1 structure.
2881 ********************************************************************/
2883 BOOL
smb_io_job_info_1(char *desc
, NEW_BUFFER
*buffer
, JOB_INFO_1
*info
, int depth
)
2885 prs_struct
*ps
=&buffer
->prs
;
2887 prs_debug(ps
, depth
, desc
, "smb_io_job_info_1");
2890 buffer
->struct_start
=prs_offset(ps
);
2892 if (!prs_uint32("jobid", ps
, depth
, &info
->jobid
))
2894 if (!smb_io_relstr("printername", buffer
, depth
, &info
->printername
))
2896 if (!smb_io_relstr("machinename", buffer
, depth
, &info
->machinename
))
2898 if (!smb_io_relstr("username", buffer
, depth
, &info
->username
))
2900 if (!smb_io_relstr("document", buffer
, depth
, &info
->document
))
2902 if (!smb_io_relstr("datatype", buffer
, depth
, &info
->datatype
))
2904 if (!smb_io_relstr("text_status", buffer
, depth
, &info
->text_status
))
2906 if (!prs_uint32("status", ps
, depth
, &info
->status
))
2908 if (!prs_uint32("priority", ps
, depth
, &info
->priority
))
2910 if (!prs_uint32("position", ps
, depth
, &info
->position
))
2912 if (!prs_uint32("totalpages", ps
, depth
, &info
->totalpages
))
2914 if (!prs_uint32("pagesprinted", ps
, depth
, &info
->pagesprinted
))
2916 if (!spoolss_io_system_time("submitted", ps
, depth
, &info
->submitted
))
2922 /*******************************************************************
2923 Parse a JOB_INFO_2 structure.
2924 ********************************************************************/
2926 BOOL
smb_io_job_info_2(char *desc
, NEW_BUFFER
*buffer
, JOB_INFO_2
*info
, int depth
)
2929 prs_struct
*ps
=&buffer
->prs
;
2931 prs_debug(ps
, depth
, desc
, "smb_io_job_info_2");
2934 buffer
->struct_start
=prs_offset(ps
);
2936 if (!prs_uint32("jobid",ps
, depth
, &info
->jobid
))
2938 if (!smb_io_relstr("printername", buffer
, depth
, &info
->printername
))
2940 if (!smb_io_relstr("machinename", buffer
, depth
, &info
->machinename
))
2942 if (!smb_io_relstr("username", buffer
, depth
, &info
->username
))
2944 if (!smb_io_relstr("document", buffer
, depth
, &info
->document
))
2946 if (!smb_io_relstr("notifyname", buffer
, depth
, &info
->notifyname
))
2948 if (!smb_io_relstr("datatype", buffer
, depth
, &info
->datatype
))
2951 if (!smb_io_relstr("printprocessor", buffer
, depth
, &info
->printprocessor
))
2953 if (!smb_io_relstr("parameters", buffer
, depth
, &info
->parameters
))
2955 if (!smb_io_relstr("drivername", buffer
, depth
, &info
->drivername
))
2957 if (!smb_io_reldevmode("devmode", buffer
, depth
, &info
->devmode
))
2959 if (!smb_io_relstr("text_status", buffer
, depth
, &info
->text_status
))
2962 /* SEC_DESC sec_desc;*/
2963 if (!prs_uint32("Hack! sec desc", ps
, depth
, &pipo
))
2966 if (!prs_uint32("status",ps
, depth
, &info
->status
))
2968 if (!prs_uint32("priority",ps
, depth
, &info
->priority
))
2970 if (!prs_uint32("position",ps
, depth
, &info
->position
))
2972 if (!prs_uint32("starttime",ps
, depth
, &info
->starttime
))
2974 if (!prs_uint32("untiltime",ps
, depth
, &info
->untiltime
))
2976 if (!prs_uint32("totalpages",ps
, depth
, &info
->totalpages
))
2978 if (!prs_uint32("size",ps
, depth
, &info
->size
))
2980 if (!spoolss_io_system_time("submitted", ps
, depth
, &info
->submitted
) )
2982 if (!prs_uint32("timeelapsed",ps
, depth
, &info
->timeelapsed
))
2984 if (!prs_uint32("pagesprinted",ps
, depth
, &info
->pagesprinted
))
2990 /*******************************************************************
2991 ********************************************************************/
2993 BOOL
smb_io_form_1(char *desc
, NEW_BUFFER
*buffer
, FORM_1
*info
, int depth
)
2995 prs_struct
*ps
=&buffer
->prs
;
2997 prs_debug(ps
, depth
, desc
, "smb_io_form_1");
3000 buffer
->struct_start
=prs_offset(ps
);
3002 if (!prs_uint32("flag", ps
, depth
, &info
->flag
))
3005 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
3008 if (!prs_uint32("width", ps
, depth
, &info
->width
))
3010 if (!prs_uint32("length", ps
, depth
, &info
->length
))
3012 if (!prs_uint32("left", ps
, depth
, &info
->left
))
3014 if (!prs_uint32("top", ps
, depth
, &info
->top
))
3016 if (!prs_uint32("right", ps
, depth
, &info
->right
))
3018 if (!prs_uint32("bottom", ps
, depth
, &info
->bottom
))
3024 /*******************************************************************
3025 Read/write a BUFFER struct.
3026 ********************************************************************/
3028 static BOOL
spoolss_io_buffer(char *desc
, prs_struct
*ps
, int depth
, NEW_BUFFER
**pp_buffer
)
3030 NEW_BUFFER
*buffer
= *pp_buffer
;
3032 prs_debug(ps
, depth
, desc
, "spoolss_io_buffer");
3035 if (UNMARSHALLING(ps
))
3036 buffer
= *pp_buffer
= (NEW_BUFFER
*)prs_alloc_mem(ps
, sizeof(NEW_BUFFER
));
3041 if (!prs_uint32("ptr", ps
, depth
, &buffer
->ptr
))
3045 if (UNMARSHALLING(ps
)) {
3047 buffer
->string_at_end
=0;
3049 if (buffer
->ptr
==0) {
3051 * JRA. I'm not sure if the data in here is in big-endian format if
3052 * the client is big-endian. Leave as default (little endian) for now.
3055 if (!prs_init(&buffer
->prs
, 0, prs_get_mem_context(ps
), UNMARSHALL
))
3060 if (!prs_uint32("size", ps
, depth
, &buffer
->size
))
3064 * JRA. I'm not sure if the data in here is in big-endian format if
3065 * the client is big-endian. Leave as default (little endian) for now.
3068 if (!prs_init(&buffer
->prs
, buffer
->size
, prs_get_mem_context(ps
), UNMARSHALL
))
3071 if (!prs_append_some_prs_data(&buffer
->prs
, ps
, prs_offset(ps
), buffer
->size
))
3074 if (!prs_set_offset(&buffer
->prs
, 0))
3077 if (!prs_set_offset(ps
, buffer
->size
+prs_offset(ps
)))
3080 buffer
->string_at_end
=buffer
->size
;
3088 if (buffer
->ptr
==0) {
3089 /* We have finished with the data in buffer->prs - free it. */
3090 prs_mem_free(&buffer
->prs
);
3094 if (!prs_uint32("size", ps
, depth
, &buffer
->size
))
3097 if (!prs_append_some_prs_data(ps
, &buffer
->prs
, 0, buffer
->size
))
3103 /* We have finished with the data in buffer->prs - free it. */
3104 prs_mem_free(&buffer
->prs
);
3110 /*******************************************************************
3111 move a BUFFER from the query to the reply.
3112 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
3113 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
3114 Clears the memory to zero also.
3115 ********************************************************************/
3117 void spoolss_move_buffer(NEW_BUFFER
*src
, NEW_BUFFER
**dest
)
3119 prs_switch_type(&src
->prs
, MARSHALL
);
3120 if(!prs_set_offset(&src
->prs
, 0))
3122 prs_force_dynamic(&src
->prs
);
3123 prs_mem_clear(&src
->prs
);
3127 /*******************************************************************
3128 Get the size of a BUFFER struct.
3129 ********************************************************************/
3131 uint32
new_get_buffer_size(NEW_BUFFER
*buffer
)
3133 return (buffer
->size
);
3136 /*******************************************************************
3137 Parse a DRIVER_DIRECTORY_1 structure.
3138 ********************************************************************/
3140 BOOL
smb_io_driverdir_1(char *desc
, NEW_BUFFER
*buffer
, DRIVER_DIRECTORY_1
*info
, int depth
)
3142 prs_struct
*ps
=&buffer
->prs
;
3144 prs_debug(ps
, depth
, desc
, "smb_io_driverdir_1");
3147 buffer
->struct_start
=prs_offset(ps
);
3149 if (!smb_io_unistr(desc
, &info
->name
, ps
, depth
))
3155 /*******************************************************************
3156 Parse a PORT_INFO_1 structure.
3157 ********************************************************************/
3159 BOOL
smb_io_port_1(char *desc
, NEW_BUFFER
*buffer
, PORT_INFO_1
*info
, int depth
)
3161 prs_struct
*ps
=&buffer
->prs
;
3163 prs_debug(ps
, depth
, desc
, "smb_io_port_1");
3166 buffer
->struct_start
=prs_offset(ps
);
3168 if(!smb_io_relstr("port_name", buffer
, depth
, &info
->port_name
))
3174 /*******************************************************************
3175 Parse a PORT_INFO_2 structure.
3176 ********************************************************************/
3178 BOOL
smb_io_port_2(char *desc
, NEW_BUFFER
*buffer
, PORT_INFO_2
*info
, int depth
)
3180 prs_struct
*ps
=&buffer
->prs
;
3182 prs_debug(ps
, depth
, desc
, "smb_io_port_2");
3185 buffer
->struct_start
=prs_offset(ps
);
3187 if(!smb_io_relstr("port_name", buffer
, depth
, &info
->port_name
))
3189 if(!smb_io_relstr("monitor_name", buffer
, depth
, &info
->monitor_name
))
3191 if(!smb_io_relstr("description", buffer
, depth
, &info
->description
))
3193 if(!prs_uint32("port_type", ps
, depth
, &info
->port_type
))
3195 if(!prs_uint32("reserved", ps
, depth
, &info
->reserved
))
3201 /*******************************************************************
3202 ********************************************************************/
3204 BOOL
smb_io_printprocessor_info_1(char *desc
, NEW_BUFFER
*buffer
, PRINTPROCESSOR_1
*info
, int depth
)
3206 prs_struct
*ps
=&buffer
->prs
;
3208 prs_debug(ps
, depth
, desc
, "smb_io_printprocessor_info_1");
3211 buffer
->struct_start
=prs_offset(ps
);
3213 if (smb_io_relstr("name", buffer
, depth
, &info
->name
))
3219 /*******************************************************************
3220 ********************************************************************/
3222 BOOL
smb_io_printprocdatatype_info_1(char *desc
, NEW_BUFFER
*buffer
, PRINTPROCDATATYPE_1
*info
, int depth
)
3224 prs_struct
*ps
=&buffer
->prs
;
3226 prs_debug(ps
, depth
, desc
, "smb_io_printprocdatatype_info_1");
3229 buffer
->struct_start
=prs_offset(ps
);
3231 if (smb_io_relstr("name", buffer
, depth
, &info
->name
))
3237 /*******************************************************************
3238 ********************************************************************/
3240 BOOL
smb_io_printmonitor_info_1(char *desc
, NEW_BUFFER
*buffer
, PRINTMONITOR_1
*info
, int depth
)
3242 prs_struct
*ps
=&buffer
->prs
;
3244 prs_debug(ps
, depth
, desc
, "smb_io_printmonitor_info_1");
3247 buffer
->struct_start
=prs_offset(ps
);
3249 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
3255 /*******************************************************************
3256 ********************************************************************/
3258 BOOL
smb_io_printmonitor_info_2(char *desc
, NEW_BUFFER
*buffer
, PRINTMONITOR_2
*info
, int depth
)
3260 prs_struct
*ps
=&buffer
->prs
;
3262 prs_debug(ps
, depth
, desc
, "smb_io_printmonitor_info_2");
3265 buffer
->struct_start
=prs_offset(ps
);
3267 if (!smb_io_relstr("name", buffer
, depth
, &info
->name
))
3269 if (!smb_io_relstr("environment", buffer
, depth
, &info
->environment
))
3271 if (!smb_io_relstr("dll_name", buffer
, depth
, &info
->dll_name
))
3277 /*******************************************************************
3278 return the size required by a struct in the stream
3279 ********************************************************************/
3281 uint32
spoolss_size_printer_info_0(PRINTER_INFO_0
*info
)
3285 size
+=size_of_relative_string( &info
->printername
);
3286 size
+=size_of_relative_string( &info
->servername
);
3288 size
+=size_of_uint32( &info
->cjobs
);
3289 size
+=size_of_uint32( &info
->total_jobs
);
3290 size
+=size_of_uint32( &info
->total_bytes
);
3292 size
+=size_of_uint16( &info
->year
);
3293 size
+=size_of_uint16( &info
->month
);
3294 size
+=size_of_uint16( &info
->dayofweek
);
3295 size
+=size_of_uint16( &info
->day
);
3296 size
+=size_of_uint16( &info
->hour
);
3297 size
+=size_of_uint16( &info
->minute
);
3298 size
+=size_of_uint16( &info
->second
);
3299 size
+=size_of_uint16( &info
->milliseconds
);
3301 size
+=size_of_uint32( &info
->global_counter
);
3302 size
+=size_of_uint32( &info
->total_pages
);
3304 size
+=size_of_uint16( &info
->major_version
);
3305 size
+=size_of_uint16( &info
->build_version
);
3307 size
+=size_of_uint32( &info
->unknown7
);
3308 size
+=size_of_uint32( &info
->unknown8
);
3309 size
+=size_of_uint32( &info
->unknown9
);
3310 size
+=size_of_uint32( &info
->session_counter
);
3311 size
+=size_of_uint32( &info
->unknown11
);
3312 size
+=size_of_uint32( &info
->printer_errors
);
3313 size
+=size_of_uint32( &info
->unknown13
);
3314 size
+=size_of_uint32( &info
->unknown14
);
3315 size
+=size_of_uint32( &info
->unknown15
);
3316 size
+=size_of_uint32( &info
->unknown16
);
3317 size
+=size_of_uint32( &info
->change_id
);
3318 size
+=size_of_uint32( &info
->unknown18
);
3319 size
+=size_of_uint32( &info
->status
);
3320 size
+=size_of_uint32( &info
->unknown20
);
3321 size
+=size_of_uint32( &info
->c_setprinter
);
3323 size
+=size_of_uint16( &info
->unknown22
);
3324 size
+=size_of_uint16( &info
->unknown23
);
3325 size
+=size_of_uint16( &info
->unknown24
);
3326 size
+=size_of_uint16( &info
->unknown25
);
3327 size
+=size_of_uint16( &info
->unknown26
);
3328 size
+=size_of_uint16( &info
->unknown27
);
3329 size
+=size_of_uint16( &info
->unknown28
);
3330 size
+=size_of_uint16( &info
->unknown29
);
3335 /*******************************************************************
3336 return the size required by a struct in the stream
3337 ********************************************************************/
3339 uint32
spoolss_size_printer_info_1(PRINTER_INFO_1
*info
)
3343 size
+=size_of_uint32( &info
->flags
);
3344 size
+=size_of_relative_string( &info
->description
);
3345 size
+=size_of_relative_string( &info
->name
);
3346 size
+=size_of_relative_string( &info
->comment
);
3351 /*******************************************************************
3352 return the size required by a struct in the stream
3353 ********************************************************************/
3355 uint32
spoolss_size_printer_info_2(PRINTER_INFO_2
*info
)
3361 size
+= sec_desc_size( info
->secdesc
);
3363 size
+=size_of_device_mode( info
->devmode
);
3365 size
+=size_of_relative_string( &info
->servername
);
3366 size
+=size_of_relative_string( &info
->printername
);
3367 size
+=size_of_relative_string( &info
->sharename
);
3368 size
+=size_of_relative_string( &info
->portname
);
3369 size
+=size_of_relative_string( &info
->drivername
);
3370 size
+=size_of_relative_string( &info
->comment
);
3371 size
+=size_of_relative_string( &info
->location
);
3373 size
+=size_of_relative_string( &info
->sepfile
);
3374 size
+=size_of_relative_string( &info
->printprocessor
);
3375 size
+=size_of_relative_string( &info
->datatype
);
3376 size
+=size_of_relative_string( &info
->parameters
);
3378 size
+=size_of_uint32( &info
->attributes
);
3379 size
+=size_of_uint32( &info
->priority
);
3380 size
+=size_of_uint32( &info
->defaultpriority
);
3381 size
+=size_of_uint32( &info
->starttime
);
3382 size
+=size_of_uint32( &info
->untiltime
);
3383 size
+=size_of_uint32( &info
->status
);
3384 size
+=size_of_uint32( &info
->cjobs
);
3385 size
+=size_of_uint32( &info
->averageppm
);
3388 * add any adjustments for alignment. This is
3389 * not optimal since we could be calling this
3390 * function from a loop (e.g. enumprinters), but
3391 * it is easier to maintain the calculation here and
3392 * not place the burden on the caller to remember. --jerry
3394 if ((size
% 4) != 0)
3395 size
+= 4 - (size
% 4);
3400 /*******************************************************************
3401 return the size required by a struct in the stream
3402 ********************************************************************/
3404 uint32
spoolss_size_printer_info_4(PRINTER_INFO_4
*info
)
3408 size
+=size_of_relative_string( &info
->printername
);
3409 size
+=size_of_relative_string( &info
->servername
);
3411 size
+=size_of_uint32( &info
->attributes
);
3415 /*******************************************************************
3416 return the size required by a struct in the stream
3417 ********************************************************************/
3419 uint32
spoolss_size_printer_info_5(PRINTER_INFO_5
*info
)
3423 size
+=size_of_relative_string( &info
->printername
);
3424 size
+=size_of_relative_string( &info
->portname
);
3426 size
+=size_of_uint32( &info
->attributes
);
3427 size
+=size_of_uint32( &info
->device_not_selected_timeout
);
3428 size
+=size_of_uint32( &info
->transmission_retry_timeout
);
3433 /*******************************************************************
3434 return the size required by a struct in the stream
3435 ********************************************************************/
3437 uint32
spoolss_size_printer_info_3(PRINTER_INFO_3
*info
)
3439 /* The 4 is for the self relative pointer.. */
3440 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3441 return 4 + (uint32
)sec_desc_size( info
->secdesc
);
3444 /*******************************************************************
3445 return the size required by a struct in the stream
3446 ********************************************************************/
3448 uint32
spoolss_size_printer_info_7(PRINTER_INFO_7
*info
)
3452 size
+=size_of_relative_string( &info
->guid
);
3453 size
+=size_of_uint32( &info
->action
);
3457 /*******************************************************************
3458 return the size required by a struct in the stream
3459 ********************************************************************/
3461 uint32
spoolss_size_printer_driver_info_1(DRIVER_INFO_1
*info
)
3464 size
+=size_of_relative_string( &info
->name
);
3469 /*******************************************************************
3470 return the size required by a struct in the stream
3471 ********************************************************************/
3473 uint32
spoolss_size_printer_driver_info_2(DRIVER_INFO_2
*info
)
3476 size
+=size_of_uint32( &info
->version
);
3477 size
+=size_of_relative_string( &info
->name
);
3478 size
+=size_of_relative_string( &info
->architecture
);
3479 size
+=size_of_relative_string( &info
->driverpath
);
3480 size
+=size_of_relative_string( &info
->datafile
);
3481 size
+=size_of_relative_string( &info
->configfile
);
3486 /*******************************************************************
3487 return the size required by a string array.
3488 ********************************************************************/
3490 uint32
spoolss_size_string_array(uint16
*string
)
3495 for (i
=0; (string
[i
]!=0x0000) || (string
[i
+1]!=0x0000); i
++);
3497 i
=i
+2; /* to count all chars including the leading zero */
3498 i
=2*i
; /* because we need the value in bytes */
3499 i
=i
+4; /* the offset pointer size */
3504 /*******************************************************************
3505 return the size required by a struct in the stream
3506 ********************************************************************/
3508 uint32
spoolss_size_printer_driver_info_3(DRIVER_INFO_3
*info
)
3512 size
+=size_of_uint32( &info
->version
);
3513 size
+=size_of_relative_string( &info
->name
);
3514 size
+=size_of_relative_string( &info
->architecture
);
3515 size
+=size_of_relative_string( &info
->driverpath
);
3516 size
+=size_of_relative_string( &info
->datafile
);
3517 size
+=size_of_relative_string( &info
->configfile
);
3518 size
+=size_of_relative_string( &info
->helpfile
);
3519 size
+=size_of_relative_string( &info
->monitorname
);
3520 size
+=size_of_relative_string( &info
->defaultdatatype
);
3522 size
+=spoolss_size_string_array(info
->dependentfiles
);
3527 /*******************************************************************
3528 return the size required by a struct in the stream
3529 ********************************************************************/
3531 uint32
spoolss_size_printer_driver_info_6(DRIVER_INFO_6
*info
)
3535 size
+=size_of_uint32( &info
->version
);
3536 size
+=size_of_relative_string( &info
->name
);
3537 size
+=size_of_relative_string( &info
->architecture
);
3538 size
+=size_of_relative_string( &info
->driverpath
);
3539 size
+=size_of_relative_string( &info
->datafile
);
3540 size
+=size_of_relative_string( &info
->configfile
);
3541 size
+=size_of_relative_string( &info
->helpfile
);
3543 size
+=spoolss_size_string_array(info
->dependentfiles
);
3545 size
+=size_of_relative_string( &info
->monitorname
);
3546 size
+=size_of_relative_string( &info
->defaultdatatype
);
3548 size
+=spoolss_size_string_array(info
->previousdrivernames
);
3550 size
+=size_of_nttime(&info
->driver_date
);
3551 size
+=size_of_uint32( &info
->padding
);
3552 size
+=size_of_uint32( &info
->driver_version_low
);
3553 size
+=size_of_uint32( &info
->driver_version_high
);
3554 size
+=size_of_relative_string( &info
->mfgname
);
3555 size
+=size_of_relative_string( &info
->oem_url
);
3556 size
+=size_of_relative_string( &info
->hardware_id
);
3557 size
+=size_of_relative_string( &info
->provider
);
3562 /*******************************************************************
3563 return the size required by a struct in the stream
3564 ********************************************************************/
3566 uint32
spoolss_size_job_info_1(JOB_INFO_1
*info
)
3569 size
+=size_of_uint32( &info
->jobid
);
3570 size
+=size_of_relative_string( &info
->printername
);
3571 size
+=size_of_relative_string( &info
->machinename
);
3572 size
+=size_of_relative_string( &info
->username
);
3573 size
+=size_of_relative_string( &info
->document
);
3574 size
+=size_of_relative_string( &info
->datatype
);
3575 size
+=size_of_relative_string( &info
->text_status
);
3576 size
+=size_of_uint32( &info
->status
);
3577 size
+=size_of_uint32( &info
->priority
);
3578 size
+=size_of_uint32( &info
->position
);
3579 size
+=size_of_uint32( &info
->totalpages
);
3580 size
+=size_of_uint32( &info
->pagesprinted
);
3581 size
+=size_of_systemtime( &info
->submitted
);
3586 /*******************************************************************
3587 return the size required by a struct in the stream
3588 ********************************************************************/
3590 uint32
spoolss_size_job_info_2(JOB_INFO_2
*info
)
3594 size
+=4; /* size of sec desc ptr */
3596 size
+=size_of_uint32( &info
->jobid
);
3597 size
+=size_of_relative_string( &info
->printername
);
3598 size
+=size_of_relative_string( &info
->machinename
);
3599 size
+=size_of_relative_string( &info
->username
);
3600 size
+=size_of_relative_string( &info
->document
);
3601 size
+=size_of_relative_string( &info
->notifyname
);
3602 size
+=size_of_relative_string( &info
->datatype
);
3603 size
+=size_of_relative_string( &info
->printprocessor
);
3604 size
+=size_of_relative_string( &info
->parameters
);
3605 size
+=size_of_relative_string( &info
->drivername
);
3606 size
+=size_of_device_mode( info
->devmode
);
3607 size
+=size_of_relative_string( &info
->text_status
);
3608 /* SEC_DESC sec_desc;*/
3609 size
+=size_of_uint32( &info
->status
);
3610 size
+=size_of_uint32( &info
->priority
);
3611 size
+=size_of_uint32( &info
->position
);
3612 size
+=size_of_uint32( &info
->starttime
);
3613 size
+=size_of_uint32( &info
->untiltime
);
3614 size
+=size_of_uint32( &info
->totalpages
);
3615 size
+=size_of_uint32( &info
->size
);
3616 size
+=size_of_systemtime( &info
->submitted
);
3617 size
+=size_of_uint32( &info
->timeelapsed
);
3618 size
+=size_of_uint32( &info
->pagesprinted
);
3623 /*******************************************************************
3624 return the size required by a struct in the stream
3625 ********************************************************************/
3627 uint32
spoolss_size_form_1(FORM_1
*info
)
3631 size
+=size_of_uint32( &info
->flag
);
3632 size
+=size_of_relative_string( &info
->name
);
3633 size
+=size_of_uint32( &info
->width
);
3634 size
+=size_of_uint32( &info
->length
);
3635 size
+=size_of_uint32( &info
->left
);
3636 size
+=size_of_uint32( &info
->top
);
3637 size
+=size_of_uint32( &info
->right
);
3638 size
+=size_of_uint32( &info
->bottom
);
3643 /*******************************************************************
3644 return the size required by a struct in the stream
3645 ********************************************************************/
3647 uint32
spoolss_size_port_info_1(PORT_INFO_1
*info
)
3651 size
+=size_of_relative_string( &info
->port_name
);
3656 /*******************************************************************
3657 return the size required by a struct in the stream
3658 ********************************************************************/
3660 uint32
spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1
*info
)
3664 size
=str_len_uni(&info
->name
); /* the string length */
3665 size
=size
+1; /* add the leading zero */
3666 size
=size
*2; /* convert in char */
3671 /*******************************************************************
3672 return the size required by a struct in the stream
3673 ********************************************************************/
3675 uint32
spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1
*info
)
3679 size
=str_len_uni(&info
->name
); /* the string length */
3680 size
=size
+1; /* add the leading zero */
3681 size
=size
*2; /* convert in char */
3686 /*******************************************************************
3687 return the size required by a struct in the stream
3688 ********************************************************************/
3690 uint32
spoolss_size_port_info_2(PORT_INFO_2
*info
)
3694 size
+=size_of_relative_string( &info
->port_name
);
3695 size
+=size_of_relative_string( &info
->monitor_name
);
3696 size
+=size_of_relative_string( &info
->description
);
3698 size
+=size_of_uint32( &info
->port_type
);
3699 size
+=size_of_uint32( &info
->reserved
);
3704 /*******************************************************************
3705 return the size required by a struct in the stream
3706 ********************************************************************/
3708 uint32
spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1
*info
)
3711 size
+=size_of_relative_string( &info
->name
);
3716 /*******************************************************************
3717 return the size required by a struct in the stream
3718 ********************************************************************/
3720 uint32
spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1
*info
)
3723 size
+=size_of_relative_string( &info
->name
);
3728 /*******************************************************************
3729 return the size required by a struct in the stream
3730 ********************************************************************/
3731 uint32
spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES
*p
)
3738 /* uint32(offset) + uint32(length) + length) */
3739 size
+= (size_of_uint32(&p
->value_len
)*2) + p
->value_len
;
3740 size
+= (size_of_uint32(&p
->data_len
)*2) + p
->data_len
+ (p
->data_len
%2) ;
3742 size
+= size_of_uint32(&p
->type
);
3747 /*******************************************************************
3748 return the size required by a struct in the stream
3749 ********************************************************************/
3751 uint32
spoolss_size_printmonitor_info_1(PRINTMONITOR_1
*info
)
3754 size
+=size_of_relative_string( &info
->name
);
3759 /*******************************************************************
3760 return the size required by a struct in the stream
3761 ********************************************************************/
3763 uint32
spoolss_size_printmonitor_info_2(PRINTMONITOR_2
*info
)
3766 size
+=size_of_relative_string( &info
->name
);
3767 size
+=size_of_relative_string( &info
->environment
);
3768 size
+=size_of_relative_string( &info
->dll_name
);
3773 /*******************************************************************
3775 ********************************************************************/
3777 BOOL
make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2
*q_u
,
3778 const POLICY_HND
*hnd
,
3779 const fstring architecture
,
3780 uint32 level
, uint32 clientmajor
, uint32 clientminor
,
3781 NEW_BUFFER
*buffer
, uint32 offered
)
3786 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
3788 init_buf_unistr2(&q_u
->architecture
, &q_u
->architecture_ptr
, architecture
);
3791 q_u
->clientmajorversion
=clientmajor
;
3792 q_u
->clientminorversion
=clientminor
;
3795 q_u
->offered
=offered
;
3800 /*******************************************************************
3802 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3803 ********************************************************************/
3805 BOOL
spoolss_io_q_getprinterdriver2(char *desc
, SPOOL_Q_GETPRINTERDRIVER2
*q_u
, prs_struct
*ps
, int depth
)
3807 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getprinterdriver2");
3813 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
3815 if(!prs_uint32("architecture_ptr", ps
, depth
, &q_u
->architecture_ptr
))
3817 if(!smb_io_unistr2("architecture", &q_u
->architecture
, q_u
->architecture_ptr
, ps
, depth
))
3822 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
3825 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
3831 if(!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
3834 if(!prs_uint32("clientmajorversion", ps
, depth
, &q_u
->clientmajorversion
))
3836 if(!prs_uint32("clientminorversion", ps
, depth
, &q_u
->clientminorversion
))
3842 /*******************************************************************
3844 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3845 ********************************************************************/
3847 BOOL
spoolss_io_r_getprinterdriver2(char *desc
, SPOOL_R_GETPRINTERDRIVER2
*r_u
, prs_struct
*ps
, int depth
)
3849 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getprinterdriver2");
3855 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
3860 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
3862 if (!prs_uint32("servermajorversion", ps
, depth
, &r_u
->servermajorversion
))
3864 if (!prs_uint32("serverminorversion", ps
, depth
, &r_u
->serverminorversion
))
3866 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
3872 /*******************************************************************
3874 ********************************************************************/
3876 BOOL
make_spoolss_q_enumprinters(
3877 SPOOL_Q_ENUMPRINTERS
*q_u
,
3887 q_u
->servername_ptr
= (servername
!= NULL
) ? 1 : 0;
3888 init_buf_unistr2(&q_u
->servername
, &q_u
->servername_ptr
, servername
);
3892 q_u
->offered
=offered
;
3897 /*******************************************************************
3899 ********************************************************************/
3901 BOOL
make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS
*q_u
,
3902 fstring servername
, uint32 level
,
3903 NEW_BUFFER
*buffer
, uint32 offered
)
3905 q_u
->name_ptr
= (servername
!= NULL
) ? 1 : 0;
3906 init_buf_unistr2(&q_u
->name
, &q_u
->name_ptr
, servername
);
3910 q_u
->offered
=offered
;
3915 /*******************************************************************
3917 * called from spoolss_enumprinters (srv_spoolss.c)
3918 ********************************************************************/
3920 BOOL
spoolss_io_q_enumprinters(char *desc
, SPOOL_Q_ENUMPRINTERS
*q_u
, prs_struct
*ps
, int depth
)
3922 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprinters");
3928 if (!prs_uint32("flags", ps
, depth
, &q_u
->flags
))
3930 if (!prs_uint32("servername_ptr", ps
, depth
, &q_u
->servername_ptr
))
3933 if (!smb_io_unistr2("", &q_u
->servername
, q_u
->servername_ptr
, ps
, depth
))
3938 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
3941 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
3946 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
3952 /*******************************************************************
3953 Parse a SPOOL_R_ENUMPRINTERS structure.
3954 ********************************************************************/
3956 BOOL
spoolss_io_r_enumprinters(char *desc
, SPOOL_R_ENUMPRINTERS
*r_u
, prs_struct
*ps
, int depth
)
3958 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprinters");
3964 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
3970 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
3973 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
3976 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
3982 /*******************************************************************
3983 * write a structure.
3984 * called from spoolss_r_enum_printers (srv_spoolss.c)
3986 ********************************************************************/
3988 BOOL
spoolss_io_r_getprinter(char *desc
, SPOOL_R_GETPRINTER
*r_u
, prs_struct
*ps
, int depth
)
3990 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getprinter");
3996 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4002 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
4005 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
4011 /*******************************************************************
4013 * called from spoolss_getprinter (srv_spoolss.c)
4014 ********************************************************************/
4016 BOOL
spoolss_io_q_getprinter(char *desc
, SPOOL_Q_GETPRINTER
*q_u
, prs_struct
*ps
, int depth
)
4018 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getprinter");
4024 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
4026 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
4029 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4034 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4040 /*******************************************************************
4042 ********************************************************************/
4044 BOOL
make_spoolss_q_getprinter(
4045 TALLOC_CTX
*mem_ctx
,
4046 SPOOL_Q_GETPRINTER
*q_u
,
4047 const POLICY_HND
*hnd
,
4057 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
4061 q_u
->offered
=offered
;
4066 /*******************************************************************
4068 ********************************************************************/
4069 BOOL
make_spoolss_q_setprinter(TALLOC_CTX
*mem_ctx
, SPOOL_Q_SETPRINTER
*q_u
,
4070 const POLICY_HND
*hnd
, uint32 level
, PRINTER_INFO_CTR
*info
,
4074 DEVICEMODE
*devmode
;
4079 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
4082 q_u
->info
.level
= level
;
4083 q_u
->info
.info_ptr
= (info
!= NULL
) ? 1 : 0;
4086 /* There's no such thing as a setprinter level 1 */
4089 secdesc
= info
->printers_2
->secdesc
;
4090 devmode
= info
->printers_2
->devmode
;
4092 make_spoolss_printer_info_2 (mem_ctx
, &q_u
->info
.info_2
, info
->printers_2
);
4093 #if 1 /* JERRY TEST */
4094 q_u
->secdesc_ctr
= (SEC_DESC_BUF
*)malloc(sizeof(SEC_DESC_BUF
));
4095 if (!q_u
->secdesc_ctr
)
4097 q_u
->secdesc_ctr
->ptr
= (secdesc
!= NULL
) ? 1: 0;
4098 q_u
->secdesc_ctr
->max_len
= (secdesc
) ? sizeof(SEC_DESC
) + (2*sizeof(uint32
)) : 0;
4099 q_u
->secdesc_ctr
->len
= (secdesc
) ? sizeof(SEC_DESC
) + (2*sizeof(uint32
)) : 0;
4100 q_u
->secdesc_ctr
->sec
= secdesc
;
4102 q_u
->devmode_ctr
.devmode_ptr
= (devmode
!= NULL
) ? 1 : 0;
4103 q_u
->devmode_ctr
.size
= (devmode
!= NULL
) ? sizeof(DEVICEMODE
) + (3*sizeof(uint32
)) : 0;
4104 q_u
->devmode_ctr
.devmode
= devmode
;
4106 q_u
->secdesc_ctr
= NULL
;
4108 q_u
->devmode_ctr
.devmode_ptr
= 0;
4109 q_u
->devmode_ctr
.size
= 0;
4110 q_u
->devmode_ctr
.devmode
= NULL
;
4114 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level
));
4119 q_u
->command
= command
;
4125 /*******************************************************************
4126 ********************************************************************/
4128 BOOL
spoolss_io_r_setprinter(char *desc
, SPOOL_R_SETPRINTER
*r_u
, prs_struct
*ps
, int depth
)
4130 prs_debug(ps
, depth
, desc
, "spoolss_io_r_setprinter");
4136 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
4142 /*******************************************************************
4143 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
4144 ********************************************************************/
4146 BOOL
spoolss_io_q_setprinter(char *desc
, SPOOL_Q_SETPRINTER
*q_u
, prs_struct
*ps
, int depth
)
4148 uint32 ptr_sec_desc
= 0;
4150 prs_debug(ps
, depth
, desc
, "spoolss_io_q_setprinter");
4156 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
,ps
, depth
))
4158 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
4161 if(!spool_io_printer_info_level("", &q_u
->info
, ps
, depth
))
4164 if (!spoolss_io_devmode_cont(desc
, &q_u
->devmode_ctr
, ps
, depth
))
4174 ptr_sec_desc
= q_u
->info
.info_2
->secdesc_ptr
;
4179 ptr_sec_desc
= q_u
->info
.info_3
->secdesc_ptr
;
4185 if (!sec_io_desc_buf(desc
, &q_u
->secdesc_ctr
, ps
, depth
))
4190 /* Parse a NULL security descriptor. This should really
4191 happen inside the sec_io_desc_buf() function. */
4193 prs_debug(ps
, depth
, "", "sec_io_desc_buf");
4194 if (!prs_uint32("size", ps
, depth
+ 1, &dummy
))
4196 if (!prs_uint32("ptr", ps
, depth
+ 1, &dummy
)) return
4200 if(!prs_uint32("command", ps
, depth
, &q_u
->command
))
4206 /*******************************************************************
4207 ********************************************************************/
4209 BOOL
spoolss_io_r_fcpn(char *desc
, SPOOL_R_FCPN
*r_u
, prs_struct
*ps
, int depth
)
4211 prs_debug(ps
, depth
, desc
, "spoolss_io_r_fcpn");
4217 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
4223 /*******************************************************************
4224 ********************************************************************/
4226 BOOL
spoolss_io_q_fcpn(char *desc
, SPOOL_Q_FCPN
*q_u
, prs_struct
*ps
, int depth
)
4229 prs_debug(ps
, depth
, desc
, "spoolss_io_q_fcpn");
4235 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
4242 /*******************************************************************
4243 ********************************************************************/
4245 BOOL
spoolss_io_r_addjob(char *desc
, SPOOL_R_ADDJOB
*r_u
, prs_struct
*ps
, int depth
)
4247 prs_debug(ps
, depth
, desc
, "");
4253 if(!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4259 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
4262 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
4268 /*******************************************************************
4269 ********************************************************************/
4271 BOOL
spoolss_io_q_addjob(char *desc
, SPOOL_Q_ADDJOB
*q_u
, prs_struct
*ps
, int depth
)
4273 prs_debug(ps
, depth
, desc
, "");
4279 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
4281 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
4284 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4290 if(!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4296 /*******************************************************************
4297 ********************************************************************/
4299 BOOL
spoolss_io_r_enumjobs(char *desc
, SPOOL_R_ENUMJOBS
*r_u
, prs_struct
*ps
, int depth
)
4301 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumjobs");
4307 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4313 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
4316 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
4319 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
4325 /*******************************************************************
4326 ********************************************************************/
4328 BOOL
make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS
*q_u
, const POLICY_HND
*hnd
,
4339 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
4340 q_u
->firstjob
= firstjob
;
4341 q_u
->numofjobs
= numofjobs
;
4343 q_u
->buffer
= buffer
;
4344 q_u
->offered
= offered
;
4348 /*******************************************************************
4349 ********************************************************************/
4351 BOOL
spoolss_io_q_enumjobs(char *desc
, SPOOL_Q_ENUMJOBS
*q_u
, prs_struct
*ps
, int depth
)
4353 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumjobs");
4359 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
, ps
, depth
))
4362 if (!prs_uint32("firstjob", ps
, depth
, &q_u
->firstjob
))
4364 if (!prs_uint32("numofjobs", ps
, depth
, &q_u
->numofjobs
))
4366 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
4369 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4375 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4381 /*******************************************************************
4382 ********************************************************************/
4384 BOOL
spoolss_io_r_schedulejob(char *desc
, SPOOL_R_SCHEDULEJOB
*r_u
, prs_struct
*ps
, int depth
)
4386 prs_debug(ps
, depth
, desc
, "spoolss_io_r_schedulejob");
4392 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
4398 /*******************************************************************
4399 ********************************************************************/
4401 BOOL
spoolss_io_q_schedulejob(char *desc
, SPOOL_Q_SCHEDULEJOB
*q_u
, prs_struct
*ps
, int depth
)
4403 prs_debug(ps
, depth
, desc
, "spoolss_io_q_schedulejob");
4409 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
4411 if(!prs_uint32("jobid", ps
, depth
, &q_u
->jobid
))
4417 /*******************************************************************
4418 ********************************************************************/
4420 BOOL
spoolss_io_r_setjob(char *desc
, SPOOL_R_SETJOB
*r_u
, prs_struct
*ps
, int depth
)
4422 prs_debug(ps
, depth
, desc
, "spoolss_io_r_setjob");
4428 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
4434 /*******************************************************************
4435 ********************************************************************/
4437 BOOL
spoolss_io_q_setjob(char *desc
, SPOOL_Q_SETJOB
*q_u
, prs_struct
*ps
, int depth
)
4439 prs_debug(ps
, depth
, desc
, "spoolss_io_q_setjob");
4445 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
4447 if(!prs_uint32("jobid", ps
, depth
, &q_u
->jobid
))
4450 * level is usually 0. If (level!=0) then I'm in trouble !
4451 * I will try to generate setjob command with level!=0, one day.
4453 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
4455 if(!prs_uint32("command", ps
, depth
, &q_u
->command
))
4461 /*******************************************************************
4462 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4463 ********************************************************************/
4465 BOOL
spoolss_io_r_enumprinterdrivers(char *desc
, SPOOL_R_ENUMPRINTERDRIVERS
*r_u
, prs_struct
*ps
, int depth
)
4467 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprinterdrivers");
4473 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4479 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
4482 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
4485 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
4491 /*******************************************************************
4493 ********************************************************************/
4495 BOOL
make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS
*q_u
,
4497 const char *environment
,
4499 NEW_BUFFER
*buffer
, uint32 offered
)
4501 init_buf_unistr2(&q_u
->name
, &q_u
->name_ptr
, name
);
4502 init_buf_unistr2(&q_u
->environment
, &q_u
->environment_ptr
, environment
);
4506 q_u
->offered
=offered
;
4511 /*******************************************************************
4512 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4513 ********************************************************************/
4515 BOOL
spoolss_io_q_enumprinterdrivers(char *desc
, SPOOL_Q_ENUMPRINTERDRIVERS
*q_u
, prs_struct
*ps
, int depth
)
4518 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprinterdrivers");
4524 if (!prs_uint32("name_ptr", ps
, depth
, &q_u
->name_ptr
))
4526 if (!smb_io_unistr2("", &q_u
->name
, q_u
->name_ptr
,ps
, depth
))
4531 if (!prs_uint32("environment_ptr", ps
, depth
, &q_u
->environment_ptr
))
4533 if (!smb_io_unistr2("", &q_u
->environment
, q_u
->environment_ptr
, ps
, depth
))
4538 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
4541 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4547 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4553 /*******************************************************************
4554 ********************************************************************/
4556 BOOL
spoolss_io_q_enumforms(char *desc
, SPOOL_Q_ENUMFORMS
*q_u
, prs_struct
*ps
, int depth
)
4559 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumforms");
4564 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
4566 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
4569 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4574 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4580 /*******************************************************************
4581 ********************************************************************/
4583 BOOL
spoolss_io_r_enumforms(char *desc
, SPOOL_R_ENUMFORMS
*r_u
, prs_struct
*ps
, int depth
)
4585 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumforms");
4591 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4597 if (!prs_uint32("size of buffer needed", ps
, depth
, &r_u
->needed
))
4600 if (!prs_uint32("numofforms", ps
, depth
, &r_u
->numofforms
))
4603 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
4609 /*******************************************************************
4610 ********************************************************************/
4612 BOOL
spoolss_io_q_getform(char *desc
, SPOOL_Q_GETFORM
*q_u
, prs_struct
*ps
, int depth
)
4615 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getform");
4620 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
4622 if (!smb_io_unistr2("", &q_u
->formname
,True
,ps
,depth
))
4628 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
4631 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4636 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4642 /*******************************************************************
4643 ********************************************************************/
4645 BOOL
spoolss_io_r_getform(char *desc
, SPOOL_R_GETFORM
*r_u
, prs_struct
*ps
, int depth
)
4647 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getform");
4653 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4659 if (!prs_uint32("size of buffer needed", ps
, depth
, &r_u
->needed
))
4662 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
4668 /*******************************************************************
4669 Parse a SPOOL_R_ENUMPORTS structure.
4670 ********************************************************************/
4672 BOOL
spoolss_io_r_enumports(char *desc
, SPOOL_R_ENUMPORTS
*r_u
, prs_struct
*ps
, int depth
)
4674 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumports");
4680 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
4686 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
4689 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
4692 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
4698 /*******************************************************************
4699 ********************************************************************/
4701 BOOL
spoolss_io_q_enumports(char *desc
, SPOOL_Q_ENUMPORTS
*q_u
, prs_struct
*ps
, int depth
)
4703 prs_debug(ps
, depth
, desc
, "");
4709 if (!prs_uint32("", ps
, depth
, &q_u
->name_ptr
))
4711 if (!smb_io_unistr2("", &q_u
->name
,True
,ps
,depth
))
4716 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
4719 if (!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
4724 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
4730 /*******************************************************************
4731 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4732 ********************************************************************/
4734 BOOL
spool_io_printer_info_level_1(char *desc
, SPOOL_PRINTER_INFO_LEVEL_1
*il
, prs_struct
*ps
, int depth
)
4736 prs_debug(ps
, depth
, desc
, "spool_io_printer_info_level_1");
4742 if(!prs_uint32("flags", ps
, depth
, &il
->flags
))
4744 if(!prs_uint32("description_ptr", ps
, depth
, &il
->description_ptr
))
4746 if(!prs_uint32("name_ptr", ps
, depth
, &il
->name_ptr
))
4748 if(!prs_uint32("comment_ptr", ps
, depth
, &il
->comment_ptr
))
4751 if(!smb_io_unistr2("description", &il
->description
, il
->description_ptr
, ps
, depth
))
4753 if(!smb_io_unistr2("name", &il
->name
, il
->name_ptr
, ps
, depth
))
4755 if(!smb_io_unistr2("comment", &il
->comment
, il
->comment_ptr
, ps
, depth
))
4761 /*******************************************************************
4762 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4763 ********************************************************************/
4765 BOOL
spool_io_printer_info_level_3(char *desc
, SPOOL_PRINTER_INFO_LEVEL_3
*il
, prs_struct
*ps
, int depth
)
4767 prs_debug(ps
, depth
, desc
, "spool_io_printer_info_level_3");
4773 if(!prs_uint32("secdesc_ptr", ps
, depth
, &il
->secdesc_ptr
))
4779 /*******************************************************************
4780 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4781 ********************************************************************/
4783 BOOL
spool_io_printer_info_level_2(char *desc
, SPOOL_PRINTER_INFO_LEVEL_2
*il
, prs_struct
*ps
, int depth
)
4785 prs_debug(ps
, depth
, desc
, "spool_io_printer_info_level_2");
4791 if(!prs_uint32("servername_ptr", ps
, depth
, &il
->servername_ptr
))
4793 if(!prs_uint32("printername_ptr", ps
, depth
, &il
->printername_ptr
))
4795 if(!prs_uint32("sharename_ptr", ps
, depth
, &il
->sharename_ptr
))
4797 if(!prs_uint32("portname_ptr", ps
, depth
, &il
->portname_ptr
))
4800 if(!prs_uint32("drivername_ptr", ps
, depth
, &il
->drivername_ptr
))
4802 if(!prs_uint32("comment_ptr", ps
, depth
, &il
->comment_ptr
))
4804 if(!prs_uint32("location_ptr", ps
, depth
, &il
->location_ptr
))
4806 if(!prs_uint32("devmode_ptr", ps
, depth
, &il
->devmode_ptr
))
4808 if(!prs_uint32("sepfile_ptr", ps
, depth
, &il
->sepfile_ptr
))
4810 if(!prs_uint32("printprocessor_ptr", ps
, depth
, &il
->printprocessor_ptr
))
4812 if(!prs_uint32("datatype_ptr", ps
, depth
, &il
->datatype_ptr
))
4814 if(!prs_uint32("parameters_ptr", ps
, depth
, &il
->parameters_ptr
))
4816 if(!prs_uint32("secdesc_ptr", ps
, depth
, &il
->secdesc_ptr
))
4819 if(!prs_uint32("attributes", ps
, depth
, &il
->attributes
))
4821 if(!prs_uint32("priority", ps
, depth
, &il
->priority
))
4823 if(!prs_uint32("default_priority", ps
, depth
, &il
->default_priority
))
4825 if(!prs_uint32("starttime", ps
, depth
, &il
->starttime
))
4827 if(!prs_uint32("untiltime", ps
, depth
, &il
->untiltime
))
4829 if(!prs_uint32("status", ps
, depth
, &il
->status
))
4831 if(!prs_uint32("cjobs", ps
, depth
, &il
->cjobs
))
4833 if(!prs_uint32("averageppm", ps
, depth
, &il
->averageppm
))
4836 if(!smb_io_unistr2("servername", &il
->servername
, il
->servername_ptr
, ps
, depth
))
4838 if(!smb_io_unistr2("printername", &il
->printername
, il
->printername_ptr
, ps
, depth
))
4840 if(!smb_io_unistr2("sharename", &il
->sharename
, il
->sharename_ptr
, ps
, depth
))
4842 if(!smb_io_unistr2("portname", &il
->portname
, il
->portname_ptr
, ps
, depth
))
4844 if(!smb_io_unistr2("drivername", &il
->drivername
, il
->drivername_ptr
, ps
, depth
))
4846 if(!smb_io_unistr2("comment", &il
->comment
, il
->comment_ptr
, ps
, depth
))
4848 if(!smb_io_unistr2("location", &il
->location
, il
->location_ptr
, ps
, depth
))
4850 if(!smb_io_unistr2("sepfile", &il
->sepfile
, il
->sepfile_ptr
, ps
, depth
))
4852 if(!smb_io_unistr2("printprocessor", &il
->printprocessor
, il
->printprocessor_ptr
, ps
, depth
))
4854 if(!smb_io_unistr2("datatype", &il
->datatype
, il
->datatype_ptr
, ps
, depth
))
4856 if(!smb_io_unistr2("parameters", &il
->parameters
, il
->parameters_ptr
, ps
, depth
))
4862 BOOL
spool_io_printer_info_level_7(char *desc
, SPOOL_PRINTER_INFO_LEVEL_7
*il
, prs_struct
*ps
, int depth
)
4864 prs_debug(ps
, depth
, desc
, "spool_io_printer_info_level_7");
4870 if(!prs_uint32("guid_ptr", ps
, depth
, &il
->guid_ptr
))
4872 if(!prs_uint32("action", ps
, depth
, &il
->action
))
4875 if(!smb_io_unistr2("servername", &il
->guid
, il
->guid_ptr
, ps
, depth
))
4880 /*******************************************************************
4881 ********************************************************************/
4883 BOOL
spool_io_printer_info_level(char *desc
, SPOOL_PRINTER_INFO_LEVEL
*il
, prs_struct
*ps
, int depth
)
4885 prs_debug(ps
, depth
, desc
, "spool_io_printer_info_level");
4890 if(!prs_uint32("level", ps
, depth
, &il
->level
))
4892 if(!prs_uint32("info_ptr", ps
, depth
, &il
->info_ptr
))
4895 /* if no struct inside just return */
4896 if (il
->info_ptr
==0) {
4897 if (UNMARSHALLING(ps
)) {
4904 switch (il
->level
) {
4906 * level 0 is used by setprinter when managing the queue
4907 * (hold, stop, start a queue)
4911 /* DOCUMENT ME!!! What is level 1 used for? */
4914 if (UNMARSHALLING(ps
)) {
4915 if ((il
->info_1
=(SPOOL_PRINTER_INFO_LEVEL_1
*)prs_alloc_mem(ps
,sizeof(SPOOL_PRINTER_INFO_LEVEL_1
))) == NULL
)
4918 if (!spool_io_printer_info_level_1("", il
->info_1
, ps
, depth
))
4923 * level 2 is used by addprinter
4924 * and by setprinter when updating printer's info
4927 if (UNMARSHALLING(ps
)) {
4928 if ((il
->info_2
=(SPOOL_PRINTER_INFO_LEVEL_2
*)prs_alloc_mem(ps
,sizeof(SPOOL_PRINTER_INFO_LEVEL_2
))) == NULL
)
4931 if (!spool_io_printer_info_level_2("", il
->info_2
, ps
, depth
))
4934 /* DOCUMENT ME!!! What is level 3 used for? */
4937 if (UNMARSHALLING(ps
)) {
4938 if ((il
->info_3
=(SPOOL_PRINTER_INFO_LEVEL_3
*)prs_alloc_mem(ps
,sizeof(SPOOL_PRINTER_INFO_LEVEL_3
))) == NULL
)
4941 if (!spool_io_printer_info_level_3("", il
->info_3
, ps
, depth
))
4946 if (UNMARSHALLING(ps
))
4947 if ((il
->info_7
=(SPOOL_PRINTER_INFO_LEVEL_7
*)prs_alloc_mem(ps
,sizeof(SPOOL_PRINTER_INFO_LEVEL_7
))) == NULL
)
4949 if (!spool_io_printer_info_level_7("", il
->info_7
, ps
, depth
))
4957 /*******************************************************************
4958 ********************************************************************/
4960 BOOL
spoolss_io_q_addprinterex(char *desc
, SPOOL_Q_ADDPRINTEREX
*q_u
, prs_struct
*ps
, int depth
)
4962 uint32 ptr_sec_desc
= 0;
4964 prs_debug(ps
, depth
, desc
, "spoolss_io_q_addprinterex");
4969 if(!prs_uint32("", ps
, depth
, &q_u
->server_name_ptr
))
4971 if(!smb_io_unistr2("", &q_u
->server_name
, q_u
->server_name_ptr
, ps
, depth
))
4977 if(!prs_uint32("info_level", ps
, depth
, &q_u
->level
))
4980 if(!spool_io_printer_info_level("", &q_u
->info
, ps
, depth
))
4983 if (!spoolss_io_devmode_cont(desc
, &q_u
->devmode_ctr
, ps
, depth
))
4989 switch (q_u
->level
) {
4991 ptr_sec_desc
= q_u
->info
.info_2
->secdesc_ptr
;
4994 ptr_sec_desc
= q_u
->info
.info_3
->secdesc_ptr
;
4998 if (!sec_io_desc_buf(desc
, &q_u
->secdesc_ctr
, ps
, depth
))
5003 /* Parse a NULL security descriptor. This should really
5004 happen inside the sec_io_desc_buf() function. */
5006 prs_debug(ps
, depth
, "", "sec_io_desc_buf");
5007 if (!prs_uint32("size", ps
, depth
+ 1, &dummy
))
5009 if (!prs_uint32("ptr", ps
, depth
+ 1, &dummy
))
5013 if(!prs_uint32("user_switch", ps
, depth
, &q_u
->user_switch
))
5015 if(!spool_io_user_level("", &q_u
->user_ctr
, ps
, depth
))
5021 /*******************************************************************
5022 ********************************************************************/
5024 BOOL
spoolss_io_r_addprinterex(char *desc
, SPOOL_R_ADDPRINTEREX
*r_u
,
5025 prs_struct
*ps
, int depth
)
5027 prs_debug(ps
, depth
, desc
, "spoolss_io_r_addprinterex");
5030 if(!smb_io_pol_hnd("printer handle",&r_u
->handle
,ps
,depth
))
5033 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
5039 /*******************************************************************
5040 ********************************************************************/
5042 BOOL
spool_io_printer_driver_info_level_3(char *desc
, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
**q_u
,
5043 prs_struct
*ps
, int depth
)
5045 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
*il
;
5047 prs_debug(ps
, depth
, desc
, "spool_io_printer_driver_info_level_3");
5051 if (UNMARSHALLING(ps
)) {
5052 il
=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
*)prs_alloc_mem(ps
,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
));
5064 if(!prs_uint32("cversion", ps
, depth
, &il
->cversion
))
5066 if(!prs_uint32("name", ps
, depth
, &il
->name_ptr
))
5068 if(!prs_uint32("environment", ps
, depth
, &il
->environment_ptr
))
5070 if(!prs_uint32("driverpath", ps
, depth
, &il
->driverpath_ptr
))
5072 if(!prs_uint32("datafile", ps
, depth
, &il
->datafile_ptr
))
5074 if(!prs_uint32("configfile", ps
, depth
, &il
->configfile_ptr
))
5076 if(!prs_uint32("helpfile", ps
, depth
, &il
->helpfile_ptr
))
5078 if(!prs_uint32("monitorname", ps
, depth
, &il
->monitorname_ptr
))
5080 if(!prs_uint32("defaultdatatype", ps
, depth
, &il
->defaultdatatype_ptr
))
5082 if(!prs_uint32("dependentfilessize", ps
, depth
, &il
->dependentfilessize
))
5084 if(!prs_uint32("dependentfiles", ps
, depth
, &il
->dependentfiles_ptr
))
5090 if(!smb_io_unistr2("name", &il
->name
, il
->name_ptr
, ps
, depth
))
5092 if(!smb_io_unistr2("environment", &il
->environment
, il
->environment_ptr
, ps
, depth
))
5094 if(!smb_io_unistr2("driverpath", &il
->driverpath
, il
->driverpath_ptr
, ps
, depth
))
5096 if(!smb_io_unistr2("datafile", &il
->datafile
, il
->datafile_ptr
, ps
, depth
))
5098 if(!smb_io_unistr2("configfile", &il
->configfile
, il
->configfile_ptr
, ps
, depth
))
5100 if(!smb_io_unistr2("helpfile", &il
->helpfile
, il
->helpfile_ptr
, ps
, depth
))
5102 if(!smb_io_unistr2("monitorname", &il
->monitorname
, il
->monitorname_ptr
, ps
, depth
))
5104 if(!smb_io_unistr2("defaultdatatype", &il
->defaultdatatype
, il
->defaultdatatype_ptr
, ps
, depth
))
5110 if (il
->dependentfiles_ptr
)
5111 smb_io_buffer5("", &il
->dependentfiles
, ps
, depth
);
5116 /*******************************************************************
5117 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
5118 ********************************************************************/
5120 BOOL
spool_io_printer_driver_info_level_6(char *desc
, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6
**q_u
,
5121 prs_struct
*ps
, int depth
)
5123 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6
*il
;
5125 prs_debug(ps
, depth
, desc
, "spool_io_printer_driver_info_level_6");
5129 if (UNMARSHALLING(ps
)) {
5130 il
=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6
*)prs_alloc_mem(ps
,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6
));
5143 * I know this seems weird, but I have no other explanation.
5144 * This is observed behavior on both NT4 and 2K servers.
5148 if (!prs_align_uint64(ps
))
5151 /* parse the main elements the packet */
5153 if(!prs_uint32("cversion ", ps
, depth
, &il
->version
))
5155 if(!prs_uint32("name ", ps
, depth
, &il
->name_ptr
))
5157 if(!prs_uint32("environment ", ps
, depth
, &il
->environment_ptr
))
5159 if(!prs_uint32("driverpath ", ps
, depth
, &il
->driverpath_ptr
))
5161 if(!prs_uint32("datafile ", ps
, depth
, &il
->datafile_ptr
))
5163 if(!prs_uint32("configfile ", ps
, depth
, &il
->configfile_ptr
))
5165 if(!prs_uint32("helpfile ", ps
, depth
, &il
->helpfile_ptr
))
5167 if(!prs_uint32("monitorname ", ps
, depth
, &il
->monitorname_ptr
))
5169 if(!prs_uint32("defaultdatatype", ps
, depth
, &il
->defaultdatatype_ptr
))
5171 if(!prs_uint32("dependentfiles ", ps
, depth
, &il
->dependentfiles_len
))
5173 if(!prs_uint32("dependentfiles ", ps
, depth
, &il
->dependentfiles_ptr
))
5175 if(!prs_uint32("previousnames ", ps
, depth
, &il
->previousnames_len
))
5177 if(!prs_uint32("previousnames ", ps
, depth
, &il
->previousnames_ptr
))
5179 if(!smb_io_time("driverdate ", &il
->driverdate
, ps
, depth
))
5181 if(!prs_uint32("dummy4 ", ps
, depth
, &il
->dummy4
))
5183 if(!prs_uint64("driverversion ", ps
, depth
, &il
->driverversion
))
5185 if(!prs_uint32("mfgname ", ps
, depth
, &il
->mfgname_ptr
))
5187 if(!prs_uint32("oemurl ", ps
, depth
, &il
->oemurl_ptr
))
5189 if(!prs_uint32("hardwareid ", ps
, depth
, &il
->hardwareid_ptr
))
5191 if(!prs_uint32("provider ", ps
, depth
, &il
->provider_ptr
))
5194 /* parse the structures in the packet */
5196 if(!smb_io_unistr2("name", &il
->name
, il
->name_ptr
, ps
, depth
))
5201 if(!smb_io_unistr2("environment", &il
->environment
, il
->environment_ptr
, ps
, depth
))
5206 if(!smb_io_unistr2("driverpath", &il
->driverpath
, il
->driverpath_ptr
, ps
, depth
))
5211 if(!smb_io_unistr2("datafile", &il
->datafile
, il
->datafile_ptr
, ps
, depth
))
5216 if(!smb_io_unistr2("configfile", &il
->configfile
, il
->configfile_ptr
, ps
, depth
))
5221 if(!smb_io_unistr2("helpfile", &il
->helpfile
, il
->helpfile_ptr
, ps
, depth
))
5226 if(!smb_io_unistr2("monitorname", &il
->monitorname
, il
->monitorname_ptr
, ps
, depth
))
5231 if(!smb_io_unistr2("defaultdatatype", &il
->defaultdatatype
, il
->defaultdatatype_ptr
, ps
, depth
))
5235 if (il
->dependentfiles_ptr
) {
5236 if(!smb_io_buffer5("dependentfiles", &il
->dependentfiles
, ps
, depth
))
5241 if (il
->previousnames_ptr
) {
5242 if(!smb_io_buffer5("previousnames", &il
->previousnames
, ps
, depth
))
5247 if(!smb_io_unistr2("mfgname", &il
->mfgname
, il
->mfgname_ptr
, ps
, depth
))
5251 if(!smb_io_unistr2("oemurl", &il
->oemurl
, il
->oemurl_ptr
, ps
, depth
))
5255 if(!smb_io_unistr2("hardwareid", &il
->hardwareid
, il
->hardwareid_ptr
, ps
, depth
))
5259 if(!smb_io_unistr2("provider", &il
->provider
, il
->provider_ptr
, ps
, depth
))
5265 /*******************************************************************
5266 convert a buffer of UNICODE strings null terminated
5267 the buffer is terminated by a NULL
5269 convert to an dos codepage array (null terminated)
5271 dynamically allocate memory
5273 ********************************************************************/
5274 static BOOL
uniarray_2_dosarray(BUFFER5
*buf5
, fstring
**ar
)
5283 src
= (char *)buf5
->buffer
;
5286 while (src
< ((char *)buf5
->buffer
) + buf5
->buf_len
*2) {
5287 rpcstr_pull(f
, src
, sizeof(f
)-1, -1, STR_TERMINATE
);
5288 src
= skip_unibuf(src
, 2*buf5
->buf_len
- PTR_DIFF(src
,buf5
->buffer
));
5289 tar
= (fstring
*)Realloc(*ar
, sizeof(fstring
)*(n
+2));
5294 fstrcpy((*ar
)[n
], f
);
5297 fstrcpy((*ar
)[n
], "");
5305 /*******************************************************************
5306 read a UNICODE array with null terminated strings
5307 and null terminated array
5308 and size of array at beginning
5309 ********************************************************************/
5311 BOOL
smb_io_unibuffer(char *desc
, UNISTR2
*buffer
, prs_struct
*ps
, int depth
)
5313 if (buffer
==NULL
) return False
;
5316 buffer
->uni_str_len
=buffer
->uni_max_len
;
5318 if(!prs_uint32("buffer_size", ps
, depth
, &buffer
->uni_max_len
))
5321 if(!prs_unistr2(True
, "buffer ", ps
, depth
, buffer
))
5327 /*******************************************************************
5328 ********************************************************************/
5330 BOOL
spool_io_printer_driver_info_level(char *desc
, SPOOL_PRINTER_DRIVER_INFO_LEVEL
*il
, prs_struct
*ps
, int depth
)
5332 prs_debug(ps
, depth
, desc
, "spool_io_printer_driver_info_level");
5337 if(!prs_uint32("level", ps
, depth
, &il
->level
))
5339 if(!prs_uint32("ptr", ps
, depth
, &il
->ptr
))
5345 switch (il
->level
) {
5347 if(!spool_io_printer_driver_info_level_3("", &il
->info_3
, ps
, depth
))
5351 if(!spool_io_printer_driver_info_level_6("", &il
->info_6
, ps
, depth
))
5361 /*******************************************************************
5362 init a SPOOL_Q_ADDPRINTERDRIVER struct
5363 ******************************************************************/
5365 BOOL
make_spoolss_q_addprinterdriver(TALLOC_CTX
*mem_ctx
,
5366 SPOOL_Q_ADDPRINTERDRIVER
*q_u
, const char* srv_name
,
5367 uint32 level
, PRINTER_DRIVER_CTR
*info
)
5369 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5371 q_u
->server_name_ptr
= (srv_name
!=NULL
)?1:0;
5372 init_unistr2(&q_u
->server_name
, srv_name
, strlen(srv_name
)+1);
5376 q_u
->info
.level
= level
;
5377 q_u
->info
.ptr
= (info
!=NULL
)?1:0;
5380 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5382 make_spoolss_driver_info_3(mem_ctx
, &q_u
->info
.info_3
, info
->info3
);
5386 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level
));
5393 BOOL
make_spoolss_driver_info_3(TALLOC_CTX
*mem_ctx
,
5394 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
**spool_drv_info
,
5395 DRIVER_INFO_3
*info3
)
5398 uint16
*ptr
= info3
->dependentfiles
;
5400 BOOL null_char
= False
;
5401 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
*inf
;
5403 if (!(inf
=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
*)talloc_zero(mem_ctx
, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
))))
5406 inf
->cversion
= info3
->version
;
5407 inf
->name_ptr
= (info3
->name
.buffer
!=NULL
)?1:0;
5408 inf
->environment_ptr
= (info3
->architecture
.buffer
!=NULL
)?1:0;
5409 inf
->driverpath_ptr
= (info3
->driverpath
.buffer
!=NULL
)?1:0;
5410 inf
->datafile_ptr
= (info3
->datafile
.buffer
!=NULL
)?1:0;
5411 inf
->configfile_ptr
= (info3
->configfile
.buffer
!=NULL
)?1:0;
5412 inf
->helpfile_ptr
= (info3
->helpfile
.buffer
!=NULL
)?1:0;
5413 inf
->monitorname_ptr
= (info3
->monitorname
.buffer
!=NULL
)?1:0;
5414 inf
->defaultdatatype_ptr
= (info3
->defaultdatatype
.buffer
!=NULL
)?1:0;
5416 init_unistr2_from_unistr(&inf
->name
, &info3
->name
);
5417 init_unistr2_from_unistr(&inf
->environment
, &info3
->architecture
);
5418 init_unistr2_from_unistr(&inf
->driverpath
, &info3
->driverpath
);
5419 init_unistr2_from_unistr(&inf
->datafile
, &info3
->datafile
);
5420 init_unistr2_from_unistr(&inf
->configfile
, &info3
->configfile
);
5421 init_unistr2_from_unistr(&inf
->helpfile
, &info3
->helpfile
);
5422 init_unistr2_from_unistr(&inf
->monitorname
, &info3
->monitorname
);
5423 init_unistr2_from_unistr(&inf
->defaultdatatype
, &info3
->defaultdatatype
);
5430 /* the null_char BOOL is used to help locate
5431 two '\0's back to back */
5446 inf
->dependentfiles_ptr
= (info3
->dependentfiles
!= NULL
) ? 1 : 0;
5447 inf
->dependentfilessize
= len
;
5448 if(!make_spoolss_buffer5(mem_ctx
, &inf
->dependentfiles
, len
, info3
->dependentfiles
))
5454 *spool_drv_info
= inf
;
5459 /*******************************************************************
5460 make a BUFFER5 struct from a uint16*
5461 ******************************************************************/
5462 BOOL
make_spoolss_buffer5(TALLOC_CTX
*mem_ctx
, BUFFER5
*buf5
, uint32 len
, uint16
*src
)
5465 buf5
->buf_len
= len
;
5466 if((buf5
->buffer
=(uint16
*)talloc_memdup(mem_ctx
, src
, sizeof(uint16
)*len
)) == NULL
)
5468 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5475 /*******************************************************************
5476 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5477 ********************************************************************/
5479 BOOL
spoolss_io_q_addprinterdriver(char *desc
, SPOOL_Q_ADDPRINTERDRIVER
*q_u
, prs_struct
*ps
, int depth
)
5481 prs_debug(ps
, depth
, desc
, "spoolss_io_q_addprinterdriver");
5487 if(!prs_uint32("server_name_ptr", ps
, depth
, &q_u
->server_name_ptr
))
5489 if(!smb_io_unistr2("server_name", &q_u
->server_name
, q_u
->server_name_ptr
, ps
, depth
))
5494 if(!prs_uint32("info_level", ps
, depth
, &q_u
->level
))
5497 if(!spool_io_printer_driver_info_level("", &q_u
->info
, ps
, depth
))
5503 /*******************************************************************
5504 ********************************************************************/
5506 BOOL
spoolss_io_r_addprinterdriver(char *desc
, SPOOL_R_ADDPRINTERDRIVER
*q_u
, prs_struct
*ps
, int depth
)
5508 prs_debug(ps
, depth
, desc
, "spoolss_io_r_addprinterdriver");
5511 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
5517 /*******************************************************************
5518 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5519 ********************************************************************/
5521 BOOL
spoolss_io_q_addprinterdriverex(char *desc
, SPOOL_Q_ADDPRINTERDRIVEREX
*q_u
, prs_struct
*ps
, int depth
)
5523 prs_debug(ps
, depth
, desc
, "spoolss_io_q_addprinterdriverex");
5529 if(!prs_uint32("server_name_ptr", ps
, depth
, &q_u
->server_name_ptr
))
5531 if(!smb_io_unistr2("server_name", &q_u
->server_name
, q_u
->server_name_ptr
, ps
, depth
))
5536 if(!prs_uint32("info_level", ps
, depth
, &q_u
->level
))
5539 if(!spool_io_printer_driver_info_level("", &q_u
->info
, ps
, depth
))
5544 if(!prs_uint32("copy flags", ps
, depth
, &q_u
->copy_flags
))
5550 /*******************************************************************
5551 ********************************************************************/
5553 BOOL
spoolss_io_r_addprinterdriverex(char *desc
, SPOOL_R_ADDPRINTERDRIVEREX
*q_u
, prs_struct
*ps
, int depth
)
5555 prs_debug(ps
, depth
, desc
, "spoolss_io_r_addprinterdriverex");
5558 if(!prs_werror("status", ps
, depth
, &q_u
->status
))
5564 /*******************************************************************
5565 ********************************************************************/
5567 BOOL
uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3
*uni
,
5568 NT_PRINTER_DRIVER_INFO_LEVEL_3
**asc
)
5570 NT_PRINTER_DRIVER_INFO_LEVEL_3
*d
;
5572 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5576 *asc
=(NT_PRINTER_DRIVER_INFO_LEVEL_3
*)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3
));
5584 d
->cversion
=uni
->cversion
;
5586 unistr2_to_ascii(d
->name
, &uni
->name
, sizeof(d
->name
)-1);
5587 unistr2_to_ascii(d
->environment
, &uni
->environment
, sizeof(d
->environment
)-1);
5588 unistr2_to_ascii(d
->driverpath
, &uni
->driverpath
, sizeof(d
->driverpath
)-1);
5589 unistr2_to_ascii(d
->datafile
, &uni
->datafile
, sizeof(d
->datafile
)-1);
5590 unistr2_to_ascii(d
->configfile
, &uni
->configfile
, sizeof(d
->configfile
)-1);
5591 unistr2_to_ascii(d
->helpfile
, &uni
->helpfile
, sizeof(d
->helpfile
)-1);
5592 unistr2_to_ascii(d
->monitorname
, &uni
->monitorname
, sizeof(d
->monitorname
)-1);
5593 unistr2_to_ascii(d
->defaultdatatype
, &uni
->defaultdatatype
, sizeof(d
->defaultdatatype
)-1);
5595 DEBUGADD(8,( "version: %d\n", d
->cversion
));
5596 DEBUGADD(8,( "name: %s\n", d
->name
));
5597 DEBUGADD(8,( "environment: %s\n", d
->environment
));
5598 DEBUGADD(8,( "driverpath: %s\n", d
->driverpath
));
5599 DEBUGADD(8,( "datafile: %s\n", d
->datafile
));
5600 DEBUGADD(8,( "configfile: %s\n", d
->configfile
));
5601 DEBUGADD(8,( "helpfile: %s\n", d
->helpfile
));
5602 DEBUGADD(8,( "monitorname: %s\n", d
->monitorname
));
5603 DEBUGADD(8,( "defaultdatatype: %s\n", d
->defaultdatatype
));
5605 if (uniarray_2_dosarray(&uni
->dependentfiles
, &d
->dependentfiles
))
5612 /*******************************************************************
5613 ********************************************************************/
5614 BOOL
uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6
*uni
,
5615 NT_PRINTER_DRIVER_INFO_LEVEL_6
**asc
)
5617 NT_PRINTER_DRIVER_INFO_LEVEL_6
*d
;
5619 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5623 *asc
=(NT_PRINTER_DRIVER_INFO_LEVEL_6
*)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6
));
5631 d
->version
=uni
->version
;
5633 unistr2_to_ascii(d
->name
, &uni
->name
, sizeof(d
->name
)-1);
5634 unistr2_to_ascii(d
->environment
, &uni
->environment
, sizeof(d
->environment
)-1);
5635 unistr2_to_ascii(d
->driverpath
, &uni
->driverpath
, sizeof(d
->driverpath
)-1);
5636 unistr2_to_ascii(d
->datafile
, &uni
->datafile
, sizeof(d
->datafile
)-1);
5637 unistr2_to_ascii(d
->configfile
, &uni
->configfile
, sizeof(d
->configfile
)-1);
5638 unistr2_to_ascii(d
->helpfile
, &uni
->helpfile
, sizeof(d
->helpfile
)-1);
5639 unistr2_to_ascii(d
->monitorname
, &uni
->monitorname
, sizeof(d
->monitorname
)-1);
5640 unistr2_to_ascii(d
->defaultdatatype
, &uni
->defaultdatatype
, sizeof(d
->defaultdatatype
)-1);
5642 DEBUGADD(8,( "version: %d\n", d
->version
));
5643 DEBUGADD(8,( "name: %s\n", d
->name
));
5644 DEBUGADD(8,( "environment: %s\n", d
->environment
));
5645 DEBUGADD(8,( "driverpath: %s\n", d
->driverpath
));
5646 DEBUGADD(8,( "datafile: %s\n", d
->datafile
));
5647 DEBUGADD(8,( "configfile: %s\n", d
->configfile
));
5648 DEBUGADD(8,( "helpfile: %s\n", d
->helpfile
));
5649 DEBUGADD(8,( "monitorname: %s\n", d
->monitorname
));
5650 DEBUGADD(8,( "defaultdatatype: %s\n", d
->defaultdatatype
));
5652 if (!uniarray_2_dosarray(&uni
->dependentfiles
, &d
->dependentfiles
))
5654 if (!uniarray_2_dosarray(&uni
->previousnames
, &d
->previousnames
))
5664 BOOL
uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2
*uni
,
5665 NT_PRINTER_INFO_LEVEL_2
**asc
)
5667 NT_PRINTER_INFO_LEVEL_2
*d
;
5670 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5671 time_unix
=time(NULL
);
5674 DEBUGADD(8,("allocating memory\n"));
5676 *asc
=(NT_PRINTER_INFO_LEVEL_2
*)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2
));
5681 /* we allocate memory iff called from
5682 * addprinter(ex) so we can do one time stuff here.
5684 (*asc
)->setuptime
=time_unix
;
5687 DEBUGADD(8,("start converting\n"));
5691 d
->attributes
=uni
->attributes
;
5692 d
->priority
=uni
->priority
;
5693 d
->default_priority
=uni
->default_priority
;
5694 d
->starttime
=uni
->starttime
;
5695 d
->untiltime
=uni
->untiltime
;
5696 d
->status
=uni
->status
;
5697 d
->cjobs
=uni
->cjobs
;
5699 unistr2_to_ascii(d
->servername
, &uni
->servername
, sizeof(d
->servername
)-1);
5700 unistr2_to_ascii(d
->printername
, &uni
->printername
, sizeof(d
->printername
)-1);
5701 unistr2_to_ascii(d
->sharename
, &uni
->sharename
, sizeof(d
->sharename
)-1);
5702 unistr2_to_ascii(d
->portname
, &uni
->portname
, sizeof(d
->portname
)-1);
5703 unistr2_to_ascii(d
->drivername
, &uni
->drivername
, sizeof(d
->drivername
)-1);
5704 unistr2_to_ascii(d
->comment
, &uni
->comment
, sizeof(d
->comment
)-1);
5705 unistr2_to_ascii(d
->location
, &uni
->location
, sizeof(d
->location
)-1);
5706 unistr2_to_ascii(d
->sepfile
, &uni
->sepfile
, sizeof(d
->sepfile
)-1);
5707 unistr2_to_ascii(d
->printprocessor
, &uni
->printprocessor
, sizeof(d
->printprocessor
)-1);
5708 unistr2_to_ascii(d
->datatype
, &uni
->datatype
, sizeof(d
->datatype
)-1);
5709 unistr2_to_ascii(d
->parameters
, &uni
->parameters
, sizeof(d
->parameters
)-1);
5714 /*******************************************************************
5716 ********************************************************************/
5718 BOOL
make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR
*q_u
,
5719 fstring servername
, fstring env_name
, uint32 level
,
5720 NEW_BUFFER
*buffer
, uint32 offered
)
5722 init_buf_unistr2(&q_u
->name
, &q_u
->name_ptr
, servername
);
5723 init_buf_unistr2(&q_u
->environment
, &q_u
->environment_ptr
, env_name
);
5727 q_u
->offered
=offered
;
5732 /*******************************************************************
5733 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5734 ********************************************************************/
5736 BOOL
spoolss_io_q_getprinterdriverdir(char *desc
, SPOOL_Q_GETPRINTERDRIVERDIR
*q_u
, prs_struct
*ps
, int depth
)
5738 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getprinterdriverdir");
5743 if(!prs_uint32("name_ptr", ps
, depth
, &q_u
->name_ptr
))
5745 if(!smb_io_unistr2("", &q_u
->name
, q_u
->name_ptr
, ps
, depth
))
5751 if(!prs_uint32("", ps
, depth
, &q_u
->environment_ptr
))
5753 if(!smb_io_unistr2("", &q_u
->environment
, q_u
->environment_ptr
, ps
, depth
))
5759 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
5762 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
5768 if(!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
5774 /*******************************************************************
5775 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5776 ********************************************************************/
5778 BOOL
spoolss_io_r_getprinterdriverdir(char *desc
, SPOOL_R_GETPRINTERDRIVERDIR
*r_u
, prs_struct
*ps
, int depth
)
5780 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getprinterdriverdir");
5786 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
5792 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
5795 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
5801 /*******************************************************************
5802 ********************************************************************/
5804 BOOL
spoolss_io_r_enumprintprocessors(char *desc
, SPOOL_R_ENUMPRINTPROCESSORS
*r_u
, prs_struct
*ps
, int depth
)
5806 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprintprocessors");
5812 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
5818 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
5821 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
5824 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
5830 /*******************************************************************
5831 ********************************************************************/
5833 BOOL
spoolss_io_q_enumprintprocessors(char *desc
, SPOOL_Q_ENUMPRINTPROCESSORS
*q_u
, prs_struct
*ps
, int depth
)
5835 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprintprocessors");
5841 if (!prs_uint32("name_ptr", ps
, depth
, &q_u
->name_ptr
))
5843 if (!smb_io_unistr2("name", &q_u
->name
, True
, ps
, depth
))
5849 if (!prs_uint32("", ps
, depth
, &q_u
->environment_ptr
))
5851 if (!smb_io_unistr2("", &q_u
->environment
, q_u
->environment_ptr
, ps
, depth
))
5857 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
5860 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
5866 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
5872 /*******************************************************************
5873 ********************************************************************/
5875 BOOL
spoolss_io_q_addprintprocessor(char *desc
, SPOOL_Q_ADDPRINTPROCESSOR
*q_u
, prs_struct
*ps
, int depth
)
5877 prs_debug(ps
, depth
, desc
, "spoolss_io_q_addprintprocessor");
5883 if (!prs_uint32("server_ptr", ps
, depth
, &q_u
->server_ptr
))
5885 if (!smb_io_unistr2("server", &q_u
->server
, q_u
->server_ptr
, ps
, depth
))
5890 if (!smb_io_unistr2("environment", &q_u
->environment
, True
, ps
, depth
))
5895 if (!smb_io_unistr2("path", &q_u
->path
, True
, ps
, depth
))
5900 if (!smb_io_unistr2("name", &q_u
->name
, True
, ps
, depth
))
5906 /*******************************************************************
5907 ********************************************************************/
5909 BOOL
spoolss_io_r_addprintprocessor(char *desc
, SPOOL_R_ADDPRINTPROCESSOR
*r_u
, prs_struct
*ps
, int depth
)
5911 prs_debug(ps
, depth
, desc
, "spoolss_io_r_addprintproicessor");
5917 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
5923 /*******************************************************************
5924 ********************************************************************/
5926 BOOL
spoolss_io_r_enumprintprocdatatypes(char *desc
, SPOOL_R_ENUMPRINTPROCDATATYPES
*r_u
, prs_struct
*ps
, int depth
)
5928 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprintprocdatatypes");
5934 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
5940 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
5943 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
5946 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
5952 /*******************************************************************
5953 ********************************************************************/
5955 BOOL
spoolss_io_q_enumprintprocdatatypes(char *desc
, SPOOL_Q_ENUMPRINTPROCDATATYPES
*q_u
, prs_struct
*ps
, int depth
)
5957 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprintprocdatatypes");
5963 if (!prs_uint32("name_ptr", ps
, depth
, &q_u
->name_ptr
))
5965 if (!smb_io_unistr2("name", &q_u
->name
, True
, ps
, depth
))
5971 if (!prs_uint32("processor_ptr", ps
, depth
, &q_u
->processor_ptr
))
5973 if (!smb_io_unistr2("processor", &q_u
->processor
, q_u
->processor_ptr
, ps
, depth
))
5979 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
5982 if(!spoolss_io_buffer("buffer", ps
, depth
, &q_u
->buffer
))
5988 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
5994 /*******************************************************************
5995 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5996 ********************************************************************/
5998 BOOL
spoolss_io_q_enumprintmonitors(char *desc
, SPOOL_Q_ENUMPRINTMONITORS
*q_u
, prs_struct
*ps
, int depth
)
6000 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprintmonitors");
6006 if (!prs_uint32("name_ptr", ps
, depth
, &q_u
->name_ptr
))
6008 if (!smb_io_unistr2("name", &q_u
->name
, True
, ps
, depth
))
6014 if (!prs_uint32("level", ps
, depth
, &q_u
->level
))
6017 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
6023 if (!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
6029 /*******************************************************************
6030 ********************************************************************/
6032 BOOL
spoolss_io_r_enumprintmonitors(char *desc
, SPOOL_R_ENUMPRINTMONITORS
*r_u
, prs_struct
*ps
, int depth
)
6034 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprintmonitors");
6040 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
6046 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
6049 if (!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
6052 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
6058 /*******************************************************************
6059 ********************************************************************/
6061 BOOL
spoolss_io_r_enumprinterdata(char *desc
, SPOOL_R_ENUMPRINTERDATA
*r_u
, prs_struct
*ps
, int depth
)
6063 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprinterdata");
6068 if(!prs_uint32("valuesize", ps
, depth
, &r_u
->valuesize
))
6071 if (UNMARSHALLING(ps
) && r_u
->valuesize
) {
6072 r_u
->value
= (uint16
*)prs_alloc_mem(ps
, r_u
->valuesize
* 2);
6074 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
6079 if(!prs_uint16uni(False
, "value", ps
, depth
, r_u
->value
, r_u
->valuesize
))
6085 if(!prs_uint32("realvaluesize", ps
, depth
, &r_u
->realvaluesize
))
6088 if(!prs_uint32("type", ps
, depth
, &r_u
->type
))
6091 if(!prs_uint32("datasize", ps
, depth
, &r_u
->datasize
))
6094 if (UNMARSHALLING(ps
) && r_u
->datasize
) {
6095 r_u
->data
= (uint8
*)prs_alloc_mem(ps
, r_u
->datasize
);
6097 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
6102 if(!prs_uint8s(False
, "data", ps
, depth
, r_u
->data
, r_u
->datasize
))
6107 if(!prs_uint32("realdatasize", ps
, depth
, &r_u
->realdatasize
))
6109 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
6115 /*******************************************************************
6116 ********************************************************************/
6118 BOOL
spoolss_io_q_enumprinterdata(char *desc
, SPOOL_Q_ENUMPRINTERDATA
*q_u
, prs_struct
*ps
, int depth
)
6120 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprinterdata");
6125 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
6127 if(!prs_uint32("index", ps
, depth
, &q_u
->index
))
6129 if(!prs_uint32("valuesize", ps
, depth
, &q_u
->valuesize
))
6131 if(!prs_uint32("datasize", ps
, depth
, &q_u
->datasize
))
6137 /*******************************************************************
6138 ********************************************************************/
6140 BOOL
make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA
*q_u
,
6141 const POLICY_HND
*hnd
,
6142 uint32 idx
, uint32 valuelen
, uint32 datalen
)
6144 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6146 q_u
->valuesize
=valuelen
;
6147 q_u
->datasize
=datalen
;
6152 /*******************************************************************
6153 ********************************************************************/
6155 BOOL
make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX
*q_u
,
6156 const POLICY_HND
*hnd
, char *key
,
6159 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6160 init_unistr2(&q_u
->key
, key
, strlen(key
)+1);
6166 /*******************************************************************
6167 ********************************************************************/
6168 BOOL
make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA
*q_u
, const POLICY_HND
*hnd
,
6169 char* value
, uint32 data_type
, char* data
, uint32 data_size
)
6171 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6172 q_u
->type
= data_type
;
6173 init_unistr2(&q_u
->value
, value
, strlen(value
)+1);
6175 q_u
->max_len
= q_u
->real_len
= data_size
;
6181 /*******************************************************************
6182 ********************************************************************/
6183 BOOL
make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX
*q_u
, const POLICY_HND
*hnd
,
6184 char *key
, char* value
, uint32 data_type
, char* data
,
6187 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6188 q_u
->type
= data_type
;
6189 init_unistr2(&q_u
->value
, value
, strlen(value
)+1);
6190 init_unistr2(&q_u
->key
, key
, strlen(key
)+1);
6192 q_u
->max_len
= q_u
->real_len
= data_size
;
6198 /*******************************************************************
6199 ********************************************************************/
6201 BOOL
spoolss_io_q_setprinterdata(char *desc
, SPOOL_Q_SETPRINTERDATA
*q_u
, prs_struct
*ps
, int depth
)
6203 prs_debug(ps
, depth
, desc
, "spoolss_io_q_setprinterdata");
6208 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
6210 if(!smb_io_unistr2("", &q_u
->value
, True
, ps
, depth
))
6216 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
6219 if(!prs_uint32("max_len", ps
, depth
, &q_u
->max_len
))
6229 if (UNMARSHALLING(ps
))
6230 q_u
->data
=(uint8
*)prs_alloc_mem(ps
, q_u
->max_len
* sizeof(uint8
));
6231 if(q_u
->data
== NULL
)
6233 if(!prs_uint8s(False
,"data", ps
, depth
, q_u
->data
, q_u
->max_len
))
6241 if(!prs_uint32("real_len", ps
, depth
, &q_u
->real_len
))
6247 /*******************************************************************
6248 ********************************************************************/
6250 BOOL
spoolss_io_r_setprinterdata(char *desc
, SPOOL_R_SETPRINTERDATA
*r_u
, prs_struct
*ps
, int depth
)
6252 prs_debug(ps
, depth
, desc
, "spoolss_io_r_setprinterdata");
6257 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
6263 /*******************************************************************
6264 ********************************************************************/
6265 BOOL
spoolss_io_q_resetprinter(char *desc
, SPOOL_Q_RESETPRINTER
*q_u
, prs_struct
*ps
, int depth
)
6267 prs_debug(ps
, depth
, desc
, "spoolss_io_q_resetprinter");
6272 if (!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
6275 if (!prs_uint32("datatype_ptr", ps
, depth
, &q_u
->datatype_ptr
))
6278 if (q_u
->datatype_ptr
) {
6279 if (!smb_io_unistr2("datatype", &q_u
->datatype
, q_u
->datatype_ptr
?True
:False
, ps
, depth
))
6283 if (!spoolss_io_devmode_cont(desc
, &q_u
->devmode_ctr
, ps
, depth
))
6290 /*******************************************************************
6291 ********************************************************************/
6292 BOOL
spoolss_io_r_resetprinter(char *desc
, SPOOL_R_RESETPRINTER
*r_u
, prs_struct
*ps
, int depth
)
6294 prs_debug(ps
, depth
, desc
, "spoolss_io_r_resetprinter");
6299 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
6305 /*******************************************************************
6306 ********************************************************************/
6308 static BOOL
spoolss_io_addform(char *desc
, FORM
*f
, uint32 ptr
, prs_struct
*ps
, int depth
)
6310 prs_debug(ps
, depth
, desc
, "spoolss_io_addform");
6317 if(!prs_uint32("flags", ps
, depth
, &f
->flags
))
6319 if(!prs_uint32("name_ptr", ps
, depth
, &f
->name_ptr
))
6321 if(!prs_uint32("size_x", ps
, depth
, &f
->size_x
))
6323 if(!prs_uint32("size_y", ps
, depth
, &f
->size_y
))
6325 if(!prs_uint32("left", ps
, depth
, &f
->left
))
6327 if(!prs_uint32("top", ps
, depth
, &f
->top
))
6329 if(!prs_uint32("right", ps
, depth
, &f
->right
))
6331 if(!prs_uint32("bottom", ps
, depth
, &f
->bottom
))
6334 if(!smb_io_unistr2("", &f
->name
, f
->name_ptr
, ps
, depth
))
6341 /*******************************************************************
6342 ********************************************************************/
6344 BOOL
spoolss_io_q_deleteform(char *desc
, SPOOL_Q_DELETEFORM
*q_u
, prs_struct
*ps
, int depth
)
6346 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteform");
6351 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
6353 if(!smb_io_unistr2("form name", &q_u
->name
, True
, ps
, depth
))
6359 /*******************************************************************
6360 ********************************************************************/
6362 BOOL
spoolss_io_r_deleteform(char *desc
, SPOOL_R_DELETEFORM
*r_u
, prs_struct
*ps
, int depth
)
6364 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteform");
6369 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
6375 /*******************************************************************
6376 ********************************************************************/
6378 BOOL
spoolss_io_q_addform(char *desc
, SPOOL_Q_ADDFORM
*q_u
, prs_struct
*ps
, int depth
)
6380 uint32 useless_ptr
=1;
6381 prs_debug(ps
, depth
, desc
, "spoolss_io_q_addform");
6386 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
6388 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
6390 if(!prs_uint32("level2", ps
, depth
, &q_u
->level2
))
6395 if(!prs_uint32("useless_ptr", ps
, depth
, &useless_ptr
))
6397 if(!spoolss_io_addform("", &q_u
->form
, useless_ptr
, ps
, depth
))
6404 /*******************************************************************
6405 ********************************************************************/
6407 BOOL
spoolss_io_r_addform(char *desc
, SPOOL_R_ADDFORM
*r_u
, prs_struct
*ps
, int depth
)
6409 prs_debug(ps
, depth
, desc
, "spoolss_io_r_addform");
6414 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
6420 /*******************************************************************
6421 ********************************************************************/
6423 BOOL
spoolss_io_q_setform(char *desc
, SPOOL_Q_SETFORM
*q_u
, prs_struct
*ps
, int depth
)
6425 uint32 useless_ptr
=1;
6426 prs_debug(ps
, depth
, desc
, "spoolss_io_q_setform");
6431 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
6433 if(!smb_io_unistr2("", &q_u
->name
, True
, ps
, depth
))
6439 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
6441 if(!prs_uint32("level2", ps
, depth
, &q_u
->level2
))
6446 if(!prs_uint32("useless_ptr", ps
, depth
, &useless_ptr
))
6448 if(!spoolss_io_addform("", &q_u
->form
, useless_ptr
, ps
, depth
))
6455 /*******************************************************************
6456 ********************************************************************/
6458 BOOL
spoolss_io_r_setform(char *desc
, SPOOL_R_SETFORM
*r_u
, prs_struct
*ps
, int depth
)
6460 prs_debug(ps
, depth
, desc
, "spoolss_io_r_setform");
6465 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
6471 /*******************************************************************
6472 Parse a SPOOL_R_GETJOB structure.
6473 ********************************************************************/
6475 BOOL
spoolss_io_r_getjob(char *desc
, SPOOL_R_GETJOB
*r_u
, prs_struct
*ps
, int depth
)
6477 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getjob");
6483 if (!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
6489 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
6492 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
6498 /*******************************************************************
6499 Parse a SPOOL_Q_GETJOB structure.
6500 ********************************************************************/
6502 BOOL
spoolss_io_q_getjob(char *desc
, SPOOL_Q_GETJOB
*q_u
, prs_struct
*ps
, int depth
)
6504 prs_debug(ps
, depth
, desc
, "");
6510 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
6512 if(!prs_uint32("jobid", ps
, depth
, &q_u
->jobid
))
6514 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
6517 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
6523 if(!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
6529 void free_devmode(DEVICEMODE
*devmode
)
6531 if (devmode
!=NULL
) {
6532 SAFE_FREE(devmode
->private);
6537 void free_printer_info_1(PRINTER_INFO_1
*printer
)
6542 void free_printer_info_2(PRINTER_INFO_2
*printer
)
6544 if (printer
!=NULL
) {
6545 free_devmode(printer
->devmode
);
6546 printer
->devmode
= NULL
;
6551 void free_printer_info_3(PRINTER_INFO_3
*printer
)
6556 void free_printer_info_4(PRINTER_INFO_4
*printer
)
6561 void free_printer_info_5(PRINTER_INFO_5
*printer
)
6566 void free_printer_info_7(PRINTER_INFO_7
*printer
)
6571 void free_job_info_2(JOB_INFO_2
*job
)
6574 free_devmode(job
->devmode
);
6577 /*******************************************************************
6579 ********************************************************************/
6581 BOOL
make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER
*q_u
,
6582 const fstring string
, uint32 printer
, uint32 type
)
6587 init_unistr2(&q_u
->string
, string
, strlen(string
)+1);
6589 q_u
->printer
=printer
;
6598 /*******************************************************************
6599 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6600 ********************************************************************/
6602 BOOL
spoolss_io_q_replyopenprinter(char *desc
, SPOOL_Q_REPLYOPENPRINTER
*q_u
, prs_struct
*ps
, int depth
)
6604 prs_debug(ps
, depth
, desc
, "spoolss_io_q_replyopenprinter");
6610 if(!smb_io_unistr2("", &q_u
->string
, True
, ps
, depth
))
6616 if(!prs_uint32("printer", ps
, depth
, &q_u
->printer
))
6618 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
6621 if(!prs_uint32("unknown0", ps
, depth
, &q_u
->unknown0
))
6623 if(!prs_uint32("unknown1", ps
, depth
, &q_u
->unknown1
))
6629 /*******************************************************************
6630 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6631 ********************************************************************/
6633 BOOL
spoolss_io_r_replyopenprinter(char *desc
, SPOOL_R_REPLYOPENPRINTER
*r_u
, prs_struct
*ps
, int depth
)
6635 prs_debug(ps
, depth
, desc
, "spoolss_io_r_replyopenprinter");
6641 if(!smb_io_pol_hnd("printer handle",&r_u
->handle
,ps
,depth
))
6644 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
6650 /*******************************************************************
6652 ********************************************************************/
6653 BOOL
make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER
*q_u
, POLICY_HND
*hnd
,
6654 uint32 condition
, uint32 change_id
)
6657 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6659 q_u
->condition
= condition
;
6660 q_u
->change_id
= change_id
;
6663 q_u
->unknown1
= 0x1;
6664 memset(q_u
->unknown2
, 0x0, 5);
6665 q_u
->unknown2
[0] = 0x1;
6670 /*******************************************************************
6671 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6672 ********************************************************************/
6673 BOOL
spoolss_io_q_routerreplyprinter (char *desc
, SPOOL_Q_ROUTERREPLYPRINTER
*q_u
, prs_struct
*ps
, int depth
)
6676 prs_debug(ps
, depth
, desc
, "spoolss_io_q_routerreplyprinter");
6682 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
6685 if (!prs_uint32("condition", ps
, depth
, &q_u
->condition
))
6688 if (!prs_uint32("unknown1", ps
, depth
, &q_u
->unknown1
))
6691 if (!prs_uint32("change_id", ps
, depth
, &q_u
->change_id
))
6694 if (!prs_uint8s(False
, "private", ps
, depth
, q_u
->unknown2
, 5))
6700 /*******************************************************************
6701 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6702 ********************************************************************/
6703 BOOL
spoolss_io_r_routerreplyprinter (char *desc
, SPOOL_R_ROUTERREPLYPRINTER
*r_u
, prs_struct
*ps
, int depth
)
6705 prs_debug(ps
, depth
, desc
, "spoolss_io_r_routerreplyprinter");
6711 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
6717 /*******************************************************************
6719 ********************************************************************/
6721 BOOL
make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER
*q_u
, POLICY_HND
*hnd
)
6726 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6731 /*******************************************************************
6732 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6733 ********************************************************************/
6735 BOOL
spoolss_io_q_replycloseprinter(char *desc
, SPOOL_Q_REPLYCLOSEPRINTER
*q_u
, prs_struct
*ps
, int depth
)
6737 prs_debug(ps
, depth
, desc
, "spoolss_io_q_replycloseprinter");
6743 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
6749 /*******************************************************************
6750 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6751 ********************************************************************/
6753 BOOL
spoolss_io_r_replycloseprinter(char *desc
, SPOOL_R_REPLYCLOSEPRINTER
*r_u
, prs_struct
*ps
, int depth
)
6755 prs_debug(ps
, depth
, desc
, "spoolss_io_r_replycloseprinter");
6761 if(!smb_io_pol_hnd("printer handle",&r_u
->handle
,ps
,depth
))
6764 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
6770 #if 0 /* JERRY - not currently used but could be :-) */
6772 /*******************************************************************
6773 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6774 ******************************************************************/
6775 static BOOL
copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA
*dst
,
6776 SPOOL_NOTIFY_INFO_DATA
*src
, int n
)
6780 memcpy(dst
, src
, sizeof(SPOOL_NOTIFY_INFO_DATA
)*n
);
6782 for (i
=0; i
<n
; i
++) {
6786 if (src
->size
!= POINTER
)
6788 len
= src
->notify_data
.data
.length
;
6789 s
= malloc(sizeof(uint16
)*len
);
6791 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6795 memcpy(s
, src
->notify_data
.data
.string
, len
*2);
6796 dst
->notify_data
.data
.string
= s
;
6802 /*******************************************************************
6803 Deep copy a SPOOL_NOTIFY_INFO structure
6804 ******************************************************************/
6805 static BOOL
copy_spool_notify_info(SPOOL_NOTIFY_INFO
*dst
, SPOOL_NOTIFY_INFO
*src
)
6808 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6812 dst
->version
= src
->version
;
6813 dst
->flags
= src
->flags
;
6814 dst
->count
= src
->count
;
6818 dst
->data
= malloc(dst
->count
* sizeof(SPOOL_NOTIFY_INFO_DATA
));
6820 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6823 if (dst
->data
== NULL
) {
6824 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6829 return (copy_spool_notify_info_data(dst
->data
, src
->data
, src
->count
));
6836 /*******************************************************************
6838 ********************************************************************/
6840 BOOL
make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN
*q_u
, POLICY_HND
*hnd
,
6841 uint32 change_low
, uint32 change_high
,
6842 SPOOL_NOTIFY_INFO
*info
)
6847 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
6849 q_u
->change_low
=change_low
;
6850 q_u
->change_high
=change_high
;
6855 q_u
->info_ptr
=0x0FF0ADDE;
6857 q_u
->info
.version
=2;
6860 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6862 q_u
->info
.version
= info
->version
;
6863 q_u
->info
.flags
= info
->flags
;
6864 q_u
->info
.count
= info
->count
;
6865 /* pointer field - be careful! */
6866 q_u
->info
.data
= info
->data
;
6869 q_u
->info
.flags
=PRINTER_NOTIFY_INFO_DISCARDED
;
6876 /*******************************************************************
6877 Parse a SPOOL_Q_REPLY_RRPCN structure.
6878 ********************************************************************/
6880 BOOL
spoolss_io_q_reply_rrpcn(char *desc
, SPOOL_Q_REPLY_RRPCN
*q_u
, prs_struct
*ps
, int depth
)
6882 prs_debug(ps
, depth
, desc
, "spoolss_io_q_reply_rrpcn");
6888 if(!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
6891 if (!prs_uint32("change_low", ps
, depth
, &q_u
->change_low
))
6894 if (!prs_uint32("change_high", ps
, depth
, &q_u
->change_high
))
6897 if (!prs_uint32("unknown0", ps
, depth
, &q_u
->unknown0
))
6900 if (!prs_uint32("unknown1", ps
, depth
, &q_u
->unknown1
))
6903 if (!prs_uint32("info_ptr", ps
, depth
, &q_u
->info_ptr
))
6906 if(q_u
->info_ptr
!=0)
6907 if(!smb_io_notify_info(desc
, &q_u
->info
, ps
, depth
))
6913 /*******************************************************************
6914 Parse a SPOOL_R_REPLY_RRPCN structure.
6915 ********************************************************************/
6917 BOOL
spoolss_io_r_reply_rrpcn(char *desc
, SPOOL_R_REPLY_RRPCN
*r_u
, prs_struct
*ps
, int depth
)
6919 prs_debug(ps
, depth
, desc
, "spoolss_io_r_reply_rrpcn");
6925 if (!prs_uint32("unknown0", ps
, depth
, &r_u
->unknown0
))
6928 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
6934 /*******************************************************************
6936 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6937 ********************************************************************/
6939 BOOL
spoolss_io_q_getprinterdataex(char *desc
, SPOOL_Q_GETPRINTERDATAEX
*q_u
, prs_struct
*ps
, int depth
)
6944 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getprinterdataex");
6949 if (!smb_io_pol_hnd("printer handle",&q_u
->handle
,ps
,depth
))
6953 if (!smb_io_unistr2("keyname", &q_u
->keyname
,True
,ps
,depth
))
6957 if (!smb_io_unistr2("valuename", &q_u
->valuename
,True
,ps
,depth
))
6961 if (!prs_uint32("size", ps
, depth
, &q_u
->size
))
6967 /*******************************************************************
6968 * write a structure.
6969 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6970 ********************************************************************/
6972 BOOL
spoolss_io_r_getprinterdataex(char *desc
, SPOOL_R_GETPRINTERDATAEX
*r_u
, prs_struct
*ps
, int depth
)
6977 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getprinterdataex");
6982 if (!prs_uint32("type", ps
, depth
, &r_u
->type
))
6984 if (!prs_uint32("size", ps
, depth
, &r_u
->size
))
6987 if (UNMARSHALLING(ps
) && r_u
->size
) {
6988 r_u
->data
= prs_alloc_mem(ps
, r_u
->size
);
6993 if (!prs_uint8s(False
,"data", ps
, depth
, r_u
->data
, r_u
->size
))
6999 if (!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
7001 if (!prs_werror("status", ps
, depth
, &r_u
->status
))
7007 /*******************************************************************
7009 ********************************************************************/
7011 BOOL
spoolss_io_q_setprinterdataex(char *desc
, SPOOL_Q_SETPRINTERDATAEX
*q_u
, prs_struct
*ps
, int depth
)
7013 prs_debug(ps
, depth
, desc
, "spoolss_io_q_setprinterdataex");
7018 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
7020 if(!smb_io_unistr2("", &q_u
->key
, True
, ps
, depth
))
7026 if(!smb_io_unistr2("", &q_u
->value
, True
, ps
, depth
))
7032 if(!prs_uint32("type", ps
, depth
, &q_u
->type
))
7035 if(!prs_uint32("max_len", ps
, depth
, &q_u
->max_len
))
7045 if (UNMARSHALLING(ps
))
7046 q_u
->data
=(uint8
*)prs_alloc_mem(ps
, q_u
->max_len
* sizeof(uint8
));
7047 if(q_u
->data
== NULL
)
7049 if(!prs_uint8s(False
,"data", ps
, depth
, q_u
->data
, q_u
->max_len
))
7057 if(!prs_uint32("real_len", ps
, depth
, &q_u
->real_len
))
7063 /*******************************************************************
7064 * write a structure.
7065 ********************************************************************/
7067 BOOL
spoolss_io_r_setprinterdataex(char *desc
, SPOOL_R_SETPRINTERDATAEX
*r_u
, prs_struct
*ps
, int depth
)
7069 prs_debug(ps
, depth
, desc
, "spoolss_io_r_setprinterdataex");
7074 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
7080 /*******************************************************************
7082 ********************************************************************/
7083 BOOL
make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY
*q_u
,
7084 POLICY_HND
*hnd
, char *key
, uint32 size
)
7086 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
7088 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
7089 init_unistr2(&q_u
->key
, key
, strlen(key
)+1);
7095 /*******************************************************************
7097 ********************************************************************/
7099 BOOL
spoolss_io_q_enumprinterkey(char *desc
, SPOOL_Q_ENUMPRINTERKEY
*q_u
, prs_struct
*ps
, int depth
)
7101 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprinterkey");
7106 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
7109 if(!smb_io_unistr2("", &q_u
->key
, True
, ps
, depth
))
7115 if(!prs_uint32("size", ps
, depth
, &q_u
->size
))
7121 /*******************************************************************
7122 * write a structure.
7123 ********************************************************************/
7125 BOOL
spoolss_io_r_enumprinterkey(char *desc
, SPOOL_R_ENUMPRINTERKEY
*r_u
, prs_struct
*ps
, int depth
)
7127 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprinterkey");
7133 if (!smb_io_buffer5("", &r_u
->keys
, ps
, depth
))
7139 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
7142 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
7148 /*******************************************************************
7150 ********************************************************************/
7152 BOOL
make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY
*q_u
,
7153 POLICY_HND
*hnd
, char *keyname
)
7155 DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
7157 memcpy(&q_u
->handle
, hnd
, sizeof(q_u
->handle
));
7158 init_unistr2(&q_u
->keyname
, keyname
, strlen(keyname
)+1);
7163 /*******************************************************************
7165 ********************************************************************/
7167 BOOL
spoolss_io_q_deleteprinterkey(char *desc
, SPOOL_Q_DELETEPRINTERKEY
*q_u
, prs_struct
*ps
, int depth
)
7169 prs_debug(ps
, depth
, desc
, "spoolss_io_q_deleteprinterkey");
7174 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
7177 if(!smb_io_unistr2("", &q_u
->keyname
, True
, ps
, depth
))
7183 /*******************************************************************
7184 * write a structure.
7185 ********************************************************************/
7187 BOOL
spoolss_io_r_deleteprinterkey(char *desc
, SPOOL_R_DELETEPRINTERKEY
*r_u
, prs_struct
*ps
, int depth
)
7189 prs_debug(ps
, depth
, desc
, "spoolss_io_r_deleteprinterkey");
7195 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
7202 /*******************************************************************
7204 ********************************************************************/
7206 BOOL
spoolss_io_q_enumprinterdataex(char *desc
, SPOOL_Q_ENUMPRINTERDATAEX
*q_u
, prs_struct
*ps
, int depth
)
7208 prs_debug(ps
, depth
, desc
, "spoolss_io_q_enumprinterdataex");
7213 if(!smb_io_pol_hnd("printer handle", &q_u
->handle
, ps
, depth
))
7216 if(!smb_io_unistr2("", &q_u
->key
, True
, ps
, depth
))
7222 if(!prs_uint32("size", ps
, depth
, &q_u
->size
))
7228 /*******************************************************************
7229 ********************************************************************/
7231 static BOOL
spoolss_io_printer_enum_values_ctr(char *desc
, prs_struct
*ps
,
7232 PRINTER_ENUM_VALUES_CTR
*ctr
, int depth
)
7235 uint32 valuename_offset
,
7238 const uint32 basic_unit
= 20; /* size of static portion of enum_values */
7240 prs_debug(ps
, depth
, desc
, "spoolss_io_printer_enum_values_ctr");
7244 * offset data begins at 20 bytes per structure * size_of_array.
7245 * Don't forget the uint32 at the beginning
7248 current_offset
= basic_unit
* ctr
->size_of_array
;
7250 /* first loop to write basic enum_value information */
7252 if (UNMARSHALLING(ps
)) {
7253 ctr
->values
= (PRINTER_ENUM_VALUES
*)prs_alloc_mem(
7254 ps
, ctr
->size_of_array
* sizeof(PRINTER_ENUM_VALUES
));
7259 for (i
=0; i
<ctr
->size_of_array
; i
++) {
7260 valuename_offset
= current_offset
;
7261 if (!prs_uint32("valuename_offset", ps
, depth
, &valuename_offset
))
7264 if (!prs_uint32("value_len", ps
, depth
, &ctr
->values
[i
].value_len
))
7267 if (!prs_uint32("type", ps
, depth
, &ctr
->values
[i
].type
))
7270 data_offset
= ctr
->values
[i
].value_len
+ valuename_offset
;
7272 if (!prs_uint32("data_offset", ps
, depth
, &data_offset
))
7275 if (!prs_uint32("data_len", ps
, depth
, &ctr
->values
[i
].data_len
))
7278 current_offset
= data_offset
+ ctr
->values
[i
].data_len
- basic_unit
;
7279 /* account for 2 byte alignment */
7280 current_offset
+= (current_offset
% 2);
7284 * loop #2 for writing the dynamically size objects; pay
7285 * attention to 2-byte alignment here....
7288 for (i
=0; i
<ctr
->size_of_array
; i
++) {
7290 if (!prs_unistr("valuename", ps
, depth
, &ctr
->values
[i
].valuename
))
7293 if (UNMARSHALLING(ps
)) {
7294 ctr
->values
[i
].data
= (uint8
*)prs_alloc_mem(
7295 ps
, ctr
->values
[i
].data_len
);
7296 if (!ctr
->values
[i
].data
)
7300 if (!prs_uint8s(False
, "data", ps
, depth
, ctr
->values
[i
].data
, ctr
->values
[i
].data_len
))
7303 if ( !prs_align_uint16(ps
) )
7310 /*******************************************************************
7311 * write a structure.
7312 ********************************************************************/
7314 BOOL
spoolss_io_r_enumprinterdataex(char *desc
, SPOOL_R_ENUMPRINTERDATAEX
*r_u
, prs_struct
*ps
, int depth
)
7316 uint32 data_offset
, end_offset
;
7317 prs_debug(ps
, depth
, desc
, "spoolss_io_r_enumprinterdataex");
7323 if (!prs_uint32("size", ps
, depth
, &r_u
->ctr
.size
))
7326 data_offset
= prs_offset(ps
);
7328 if (!prs_set_offset(ps
, data_offset
+ r_u
->ctr
.size
))
7334 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
7337 if(!prs_uint32("returned", ps
, depth
, &r_u
->returned
))
7340 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
7343 r_u
->ctr
.size_of_array
= r_u
->returned
;
7345 end_offset
= prs_offset(ps
);
7347 if (!prs_set_offset(ps
, data_offset
))
7351 if (!spoolss_io_printer_enum_values_ctr("", ps
, &r_u
->ctr
, depth
))
7354 if (!prs_set_offset(ps
, end_offset
))
7359 /*******************************************************************
7360 * write a structure.
7361 ********************************************************************/
7364 uint32 GetPrintProcessorDirectory(
7366 [in] unistr2 *environment,
7368 [in,out] NEW_BUFFER buffer,
7369 [in] uint32 offered,
7370 [out] uint32 needed,
7371 [out] uint32 returned
7376 BOOL
make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY
*q_u
, const char *name
, char *environment
, int level
, NEW_BUFFER
*buffer
, uint32 offered
)
7378 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
7380 init_unistr2(&q_u
->name
, name
, strlen(name
)+1);
7381 init_unistr2(&q_u
->environment
, environment
, strlen(environment
)+1);
7385 q_u
->buffer
= buffer
;
7386 q_u
->offered
= offered
;
7391 BOOL
spoolss_io_q_getprintprocessordirectory(char *desc
, SPOOL_Q_GETPRINTPROCESSORDIRECTORY
*q_u
, prs_struct
*ps
, int depth
)
7395 prs_debug(ps
, depth
, desc
, "spoolss_io_q_getprintprocessordirectory");
7401 if (!prs_uint32("ptr", ps
, depth
, &ptr
))
7405 if(!smb_io_unistr2("name", &q_u
->name
, True
, ps
, depth
))
7412 if (!prs_uint32("ptr", ps
, depth
, &ptr
))
7416 if(!smb_io_unistr2("environment", &q_u
->environment
, True
,
7424 if(!prs_uint32("level", ps
, depth
, &q_u
->level
))
7427 if(!spoolss_io_buffer("", ps
, depth
, &q_u
->buffer
))
7433 if(!prs_uint32("offered", ps
, depth
, &q_u
->offered
))
7439 /*******************************************************************
7440 * write a structure.
7441 ********************************************************************/
7443 BOOL
spoolss_io_r_getprintprocessordirectory(char *desc
, SPOOL_R_GETPRINTPROCESSORDIRECTORY
*r_u
, prs_struct
*ps
, int depth
)
7445 prs_debug(ps
, depth
, desc
, "spoolss_io_r_getprintprocessordirectory");
7451 if(!spoolss_io_buffer("", ps
, depth
, &r_u
->buffer
))
7457 if(!prs_uint32("needed", ps
, depth
, &r_u
->needed
))
7460 if(!prs_werror("status", ps
, depth
, &r_u
->status
))
7466 BOOL
smb_io_printprocessordirectory_1(char *desc
, NEW_BUFFER
*buffer
, PRINTPROCESSOR_DIRECTORY_1
*info
, int depth
)
7468 prs_struct
*ps
=&buffer
->prs
;
7470 prs_debug(ps
, depth
, desc
, "smb_io_printprocessordirectory_1");
7473 buffer
->struct_start
=prs_offset(ps
);
7475 if (!smb_io_unistr(desc
, &info
->name
, ps
, depth
))
7481 /*******************************************************************
7483 ********************************************************************/
7485 BOOL
make_spoolss_q_addform(SPOOL_Q_ADDFORM
*q_u
, POLICY_HND
*handle
,
7486 int level
, FORM
*form
)
7488 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7490 q_u
->level2
= level
;
7491 memcpy(&q_u
->form
, form
, sizeof(FORM
));
7496 /*******************************************************************
7498 ********************************************************************/
7500 BOOL
make_spoolss_q_setform(SPOOL_Q_SETFORM
*q_u
, POLICY_HND
*handle
,
7501 int level
, char *form_name
, FORM
*form
)
7503 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7505 q_u
->level2
= level
;
7506 memcpy(&q_u
->form
, form
, sizeof(FORM
));
7507 init_unistr2(&q_u
->name
, form_name
, strlen(form_name
) + 1);
7512 /*******************************************************************
7514 ********************************************************************/
7516 BOOL
make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM
*q_u
, POLICY_HND
*handle
, char *form
)
7518 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7519 init_unistr2(&q_u
->name
, form
, strlen(form
) + 1);
7523 /*******************************************************************
7525 ********************************************************************/
7527 BOOL
make_spoolss_q_getform(SPOOL_Q_GETFORM
*q_u
, POLICY_HND
*handle
,
7528 char *formname
, uint32 level
, NEW_BUFFER
*buffer
,
7531 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7533 init_unistr2(&q_u
->formname
, formname
, strlen(formname
) + 1);
7535 q_u
->offered
=offered
;
7540 /*******************************************************************
7542 ********************************************************************/
7544 BOOL
make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS
*q_u
, POLICY_HND
*handle
,
7545 uint32 level
, NEW_BUFFER
*buffer
,
7548 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7551 q_u
->offered
=offered
;
7556 /*******************************************************************
7558 ********************************************************************/
7560 BOOL
make_spoolss_q_setjob(SPOOL_Q_SETJOB
*q_u
, POLICY_HND
*handle
,
7561 uint32 jobid
, uint32 level
, uint32 command
)
7563 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7567 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7568 the server side code has it marked as unused. */
7570 q_u
->command
= command
;
7575 /*******************************************************************
7577 ********************************************************************/
7579 BOOL
make_spoolss_q_getjob(SPOOL_Q_GETJOB
*q_u
, POLICY_HND
*handle
,
7580 uint32 jobid
, uint32 level
, NEW_BUFFER
*buffer
,
7583 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7586 q_u
->buffer
= buffer
;
7587 q_u
->offered
= offered
;
7592 /*******************************************************************
7594 ********************************************************************/
7596 BOOL
make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER
*q_u
,
7599 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7604 /*******************************************************************
7606 ********************************************************************/
7608 BOOL
make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER
*q_u
,
7611 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7616 /*******************************************************************
7618 ********************************************************************/
7620 BOOL
make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER
*q_u
,
7621 POLICY_HND
*handle
, uint32 level
,
7622 char *docname
, char *outputfile
,
7625 DOC_INFO_CONTAINER
*ctr
= &q_u
->doc_info_container
;
7627 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7633 ctr
->docinfo
.switch_value
= level
;
7635 ctr
->docinfo
.doc_info_1
.p_docname
= docname
? 1 : 0;
7636 ctr
->docinfo
.doc_info_1
.p_outputfile
= outputfile
? 1 : 0;
7637 ctr
->docinfo
.doc_info_1
.p_datatype
= datatype
? 1 : 0;
7640 init_unistr2(&ctr
->docinfo
.doc_info_1
.docname
, docname
,
7641 strlen(docname
) + 1);
7644 init_unistr2(&ctr
->docinfo
.doc_info_1
.outputfile
, outputfile
,
7645 strlen(outputfile
) + 1);
7648 init_unistr2(&ctr
->docinfo
.doc_info_1
.datatype
, datatype
,
7649 strlen(datatype
) + 1);
7653 /* DOC_INFO_2 is only used by Windows 9x and since it
7654 doesn't do printing over RPC we don't have to worry
7657 DEBUG(3, ("unsupported info level %d\n", level
));
7664 /*******************************************************************
7666 ********************************************************************/
7668 BOOL
make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER
*q_u
,
7671 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7676 /*******************************************************************
7678 ********************************************************************/
7680 BOOL
make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER
*q_u
,
7681 POLICY_HND
*handle
, uint32 data_size
,
7684 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7685 q_u
->buffer_size
= q_u
->buffer_size2
= data_size
;
7690 /*******************************************************************
7692 ********************************************************************/
7694 BOOL
make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA
*q_u
,
7695 POLICY_HND
*handle
, char *valuename
)
7697 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7698 init_unistr2(&q_u
->valuename
, valuename
, strlen(valuename
) + 1);
7703 /*******************************************************************
7705 ********************************************************************/
7707 BOOL
make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX
*q_u
,
7708 POLICY_HND
*handle
, char *key
,
7711 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7712 init_unistr2(&q_u
->valuename
, value
, strlen(value
) + 1);
7713 init_unistr2(&q_u
->keyname
, key
, strlen(key
) + 1);
7718 /*******************************************************************
7720 ********************************************************************/
7722 BOOL
make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX
*q_u
, POLICY_HND
*handle
,
7723 uint32 flags
, uint32 options
, const char *localmachine
,
7724 uint32 printerlocal
, SPOOL_NOTIFY_OPTION
*option
)
7726 memcpy(&q_u
->handle
, handle
, sizeof(POLICY_HND
));
7729 q_u
->options
= options
;
7731 q_u
->localmachine_ptr
= 1;
7733 init_unistr2(&q_u
->localmachine
, localmachine
,
7734 strlen(localmachine
) + 1);
7736 q_u
->printerlocal
= printerlocal
;
7739 q_u
->option_ptr
= 1;
7741 q_u
->option
= option
;