2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-2000,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
7 * Copyright (C) Jean François Micouleau 1998-2000.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define prs_uint16 _prs_uint16
29 #define prs_uint32 _prs_uint32
30 #define prs_uint8s _prs_uint8s
31 #define prs_uint16s _prs_uint16s
32 #define prs_unistr _prs_unistr
33 #define init_unistr2 make_unistr2
34 #define init_buf_unistr2 make_buf_unistr2
38 extern int DEBUGLEVEL;
39 /*******************************************************************
40 return the length of a UNISTR string.
41 ********************************************************************/
42 static uint32 str_len_uni(UNISTR *source)
46 while (source->buffer[i]!=0x0000)
53 /*******************************************************************
54 This should be moved in a more generic lib.
55 ********************************************************************/
56 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
58 if(!prs_uint16("year", ps, depth, &(systime->year)))
60 if(!prs_uint16("month", ps, depth, &(systime->month)))
62 if(!prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)))
64 if(!prs_uint16("day", ps, depth, &(systime->day)))
66 if(!prs_uint16("hour", ps, depth, &(systime->hour)))
68 if(!prs_uint16("minute", ps, depth, &(systime->minute)))
70 if(!prs_uint16("second", ps, depth, &(systime->second)))
72 if(!prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)))
78 /*******************************************************************
79 ********************************************************************/
80 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
82 systime->year=unixtime->tm_year+1900;
83 systime->month=unixtime->tm_mon+1;
84 systime->dayofweek=unixtime->tm_wday;
85 systime->day=unixtime->tm_mday;
86 systime->hour=unixtime->tm_hour;
87 systime->minute=unixtime->tm_min;
88 systime->second=unixtime->tm_sec;
89 systime->milliseconds=0;
94 /*******************************************************************
95 reads or writes an DOC_INFO structure.
96 ********************************************************************/
97 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
99 if (info_1 == NULL) return False;
101 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
107 if(!prs_uint32("p_docname", ps, depth, &(info_1->p_docname)))
109 if(!prs_uint32("p_outputfile", ps, depth, &(info_1->p_outputfile)))
111 if(!prs_uint32("p_datatype", ps, depth, &(info_1->p_datatype)))
114 if(!smb_io_unistr2("", &(info_1->docname), info_1->p_docname, ps, depth))
116 if(!smb_io_unistr2("", &(info_1->outputfile), info_1->p_outputfile, ps, depth))
118 if(!smb_io_unistr2("", &(info_1->datatype), info_1->p_datatype, ps, depth))
124 /*******************************************************************
125 reads or writes an DOC_INFO structure.
126 ********************************************************************/
127 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
129 uint32 useless_ptr=0;
131 if (info == NULL) return False;
133 prs_debug(ps, depth, desc, "smb_io_doc_info");
139 if(!prs_uint32("switch_value", ps, depth, &(info->switch_value)))
142 if(!prs_uint32("doc_info_X ptr", ps, depth, &(useless_ptr)))
145 switch (info->switch_value)
148 if(!smb_io_doc_info_1("",&(info->doc_info_1), ps, depth))
153 this is just a placeholder
155 MSDN July 1998 says doc_info_2 is only on
156 Windows 95, and as Win95 doesn't do RPC to print
157 this case is nearly impossible
159 Maybe one day with Windows for dishwasher 2037 ...
162 /* smb_io_doc_info_2("",&(info->doc_info_2), ps, depth); */
165 DEBUG(0,("Something is obviously wrong somewhere !\n"));
172 /*******************************************************************
173 reads or writes an DOC_INFO_CONTAINER structure.
174 ********************************************************************/
175 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
177 if (cont == NULL) return False;
179 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
185 if(!prs_uint32("level", ps, depth, &(cont->level)))
188 if(!smb_io_doc_info("",&(cont->docinfo), ps, depth))
194 /*******************************************************************
195 reads or writes an NOTIFY OPTION TYPE structure.
196 ********************************************************************/
197 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
199 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
205 if(!prs_uint16("type", ps, depth, &type->type))
207 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
209 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
211 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
213 if(!prs_uint32("count", ps, depth, &type->count))
215 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
221 /*******************************************************************
222 reads or writes an NOTIFY OPTION TYPE DATA.
223 ********************************************************************/
224 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
228 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
231 /* if there are no fields just return */
232 if (type->fields_ptr==0)
238 if(!prs_uint32("count2", ps, depth, &type->count2))
241 if (type->count2 != type->count)
242 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
244 /* parse the option type data */
245 for(i=0;i<type->count2;i++)
246 if(!prs_uint16("fields",ps,depth,&(type->fields[i])))
251 /*******************************************************************
252 reads or writes an NOTIFY OPTION structure.
253 ********************************************************************/
254 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
258 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
261 if(!prs_uint32("count", ps, depth, &ctr->count))
265 if (UNMARSHALLING(ps))
266 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)malloc(ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
269 /* the option type struct */
270 for(i=0;i<ctr->count;i++)
271 if(!smb_io_notify_option_type("", &(ctr->type[i]) , ps, depth))
274 /* the type associated with the option type struct */
275 for(i=0;i<ctr->count;i++)
276 if(!smb_io_notify_option_type_data("", &(ctr->type[i]) , ps, depth))
282 /*******************************************************************
283 reads or writes an NOTIFY OPTION structure.
284 ********************************************************************/
285 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
287 prs_debug(ps, depth, desc, "smb_io_notify_option");
290 if(!prs_uint32("version", ps, depth, &option->version))
292 if(!prs_uint32("flags", ps, depth, &option->flags))
294 if(!prs_uint32("count", ps, depth, &option->count))
296 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
299 /* marshalling or unmarshalling, that would work */
300 if (option->option_type_ptr!=0) {
301 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
305 option->ctr.type=NULL;
312 /*******************************************************************
313 reads or writes an NOTIFY INFO DATA structure.
314 ********************************************************************/
315 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
317 uint32 useless_ptr=0xADDE0FF0;
319 uint32 how_many_words;
323 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
326 how_many_words=data->size;
327 if (how_many_words==POINTER)
329 how_many_words=TWO_VALUE;
332 isvalue=data->enc_type;
336 if(!prs_uint16("type", ps, depth, &(data->type)))
338 if(!prs_uint16("field", ps, depth, &(data->field)))
342 if(!prs_uint32("how many words", ps, depth, &how_many_words))
344 if(!prs_uint32("id", ps, depth, &(data->id)))
346 if(!prs_uint32("how many words", ps, depth, &how_many_words))
352 if(!prs_uint32("value[0]", ps, depth, &(data->notify_data.value[0])))
354 if(!prs_uint32("value[1]", ps, depth, &(data->notify_data.value[1])))
361 /* length in ascii including \0 */
362 x=2*(data->notify_data.data.length+1);
363 if(!prs_uint32("string length", ps, depth, &x ))
365 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
373 /*******************************************************************
374 reads or writes an NOTIFY INFO DATA structure.
375 ********************************************************************/
376 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
377 prs_struct *ps, int depth)
382 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
388 isvalue=data->enc_type;
392 /* length of string in unicode include \0 */
393 x=data->notify_data.data.length+1;
394 if(!prs_uint32("string length", ps, depth, &x ))
396 if(!prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x))
405 /*******************************************************************
406 reads or writes an NOTIFY INFO structure.
407 ********************************************************************/
408 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
412 prs_debug(ps, depth, desc, "smb_io_notify_info");
418 if(!prs_uint32("count", ps, depth, &(info->count)))
420 if(!prs_uint32("version", ps, depth, &(info->version)))
422 if(!prs_uint32("flags", ps, depth, &(info->flags)))
424 if(!prs_uint32("count", ps, depth, &(info->count)))
427 for (i=0;i<info->count;i++)
429 if(!smb_io_notify_info_data(desc, &(info->data[i]), ps, depth))
433 /* now do the strings at the end of the stream */
434 for (i=0;i<info->count;i++)
436 if(!smb_io_notify_info_data_strings(desc, &(info->data[i]), ps, depth))
444 /*******************************************************************
445 ********************************************************************/
446 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
448 prs_debug(ps, depth, desc, "");
457 if (!prs_uint32("size", ps, depth, &(q_u->size)))
459 if (!prs_uint32("client_name_ptr", ps, depth, &(q_u->client_name_ptr)))
461 if (!prs_uint32("user_name_ptr", ps, depth, &(q_u->user_name_ptr)))
463 if (!prs_uint32("build", ps, depth, &(q_u->build)))
465 if (!prs_uint32("major", ps, depth, &(q_u->major)))
467 if (!prs_uint32("minor", ps, depth, &(q_u->minor)))
469 if (!prs_uint32("processor", ps, depth, &(q_u->processor)))
472 if (!smb_io_unistr2("", &(q_u->client_name), q_u->client_name_ptr, ps, depth))
476 if (!smb_io_unistr2("", &(q_u->user_name), q_u->user_name_ptr, ps, depth))
482 /*******************************************************************
483 ********************************************************************/
484 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
489 prs_debug(ps, depth, desc, "spool_io_user_level");
494 if (!prs_uint32("level", ps, depth, &q_u->level))
496 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
499 switch (q_u->level) {
501 if (!spool_io_user_level_1("", &(q_u->user1), ps, depth))
511 /*******************************************************************
512 * read or write a DEVICEMODE struct.
513 * on reading allocate memory for the private member
514 ********************************************************************/
515 static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
517 prs_debug(ps, depth, desc, "spoolss_io_devmode");
520 if (!prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
522 if (!prs_uint16("specversion", ps, depth, &(devmode->specversion)))
524 if (!prs_uint16("driverversion", ps, depth, &(devmode->driverversion)))
526 if (!prs_uint16("size", ps, depth, &(devmode->size)))
528 if (!prs_uint16("driverextra", ps, depth, &(devmode->driverextra)))
530 if (!prs_uint32("fields", ps, depth, &(devmode->fields)))
532 if (!prs_uint16("orientation", ps, depth, &(devmode->orientation)))
534 if (!prs_uint16("papersize", ps, depth, &(devmode->papersize)))
536 if (!prs_uint16("paperlength", ps, depth, &(devmode->paperlength)))
538 if (!prs_uint16("paperwidth", ps, depth, &(devmode->paperwidth)))
540 if (!prs_uint16("scale", ps, depth, &(devmode->scale)))
542 if (!prs_uint16("copies", ps, depth, &(devmode->copies)))
544 if (!prs_uint16("defaultsource", ps, depth, &(devmode->defaultsource)))
546 if (!prs_uint16("printquality", ps, depth, &(devmode->printquality)))
548 if (!prs_uint16("color", ps, depth, &(devmode->color)))
550 if (!prs_uint16("duplex", ps, depth, &(devmode->duplex)))
552 if (!prs_uint16("yresolution", ps, depth, &(devmode->yresolution)))
554 if (!prs_uint16("ttoption", ps, depth, &(devmode->ttoption)))
556 if (!prs_uint16("collate", ps, depth, &(devmode->collate)))
558 if (!prs_uint16s(True, "formname", ps, depth, devmode->formname.buffer, 32))
560 if (!prs_uint16("logpixels", ps, depth, &(devmode->logpixels)))
562 if (!prs_uint32("bitsperpel", ps, depth, &(devmode->bitsperpel)))
564 if (!prs_uint32("pelswidth", ps, depth, &(devmode->pelswidth)))
566 if (!prs_uint32("pelsheight", ps, depth, &(devmode->pelsheight)))
568 if (!prs_uint32("displayflags", ps, depth, &(devmode->displayflags)))
570 if (!prs_uint32("displayfrequency", ps, depth, &(devmode->displayfrequency)))
572 if (!prs_uint32("icmmethod", ps, depth, &(devmode->icmmethod)))
574 if (!prs_uint32("icmintent", ps, depth, &(devmode->icmintent)))
576 if (!prs_uint32("mediatype", ps, depth, &(devmode->mediatype)))
578 if (!prs_uint32("dithertype", ps, depth, &(devmode->dithertype)))
580 if (!prs_uint32("reserved1", ps, depth, &(devmode->reserved1)))
582 if (!prs_uint32("reserved2", ps, depth, &(devmode->reserved2)))
584 if (!prs_uint32("panningwidth", ps, depth, &(devmode->panningwidth)))
586 if (!prs_uint32("panningheight", ps, depth, &(devmode->panningheight)))
589 if (devmode->driverextra!=0)
591 if (UNMARSHALLING(ps)) {
592 devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8));
593 if(devmode->private == NULL)
595 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
598 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
599 if (!prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra))
606 /*******************************************************************
607 Read or write a DEVICEMODE container
608 ********************************************************************/
609 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
614 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
620 if (!prs_uint32("size", ps, depth, &dm_c->size))
623 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
626 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
627 if (UNMARSHALLING(ps))
628 /* if while reading there is no DEVMODE ... */
633 /* so we have a DEVICEMODE to follow */
634 if (UNMARSHALLING(ps)) {
635 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
636 dm_c->devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE));
637 if(dm_c->devmode == NULL)
639 ZERO_STRUCTP(dm_c->devmode);
642 /* this is bad code, shouldn't be there */
643 if (!prs_uint32("size", ps, depth, &dm_c->size))
646 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
652 /*******************************************************************
653 ********************************************************************/
654 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
659 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
662 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
665 if (!smb_io_unistr2("datatype", &(pd->datatype), pd->datatype_ptr, ps,depth))
671 if (!spoolss_io_devmode_cont("", &(pd->devmode_cont), ps, depth))
674 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
680 /*******************************************************************
682 ********************************************************************/
683 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, fstring printername, fstring datatype,
684 uint32 access_required, fstring clientname, fstring user_name)
686 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
687 q_u->printername_ptr = (printername!=NULL)?1:0;
688 init_unistr2(&(q_u->printername), printername, strlen(printername));
690 q_u->printer_default.datatype_ptr = 0;
692 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
693 init_unistr2(&(q_u->printer_default.datatype), datatype, strlen(datatype));
695 q_u->printer_default.devmode_cont.size=0;
696 q_u->printer_default.devmode_cont.devmode_ptr=0;
697 q_u->printer_default.devmode_cont.devmode=NULL;
698 q_u->printer_default.access_required=access_required;
700 q_u->user_ctr.level=1;
702 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+8;
703 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
704 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
705 q_u->user_ctr.user1.build=1381;
706 q_u->user_ctr.user1.major=2;
707 q_u->user_ctr.user1.minor=0;
708 q_u->user_ctr.user1.processor=0;
709 init_unistr2(&(q_u->user_ctr.user1.client_name), clientname, strlen(clientname));
710 init_unistr2(&(q_u->user_ctr.user1.user_name), user_name, strlen(user_name));
715 /*******************************************************************
717 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
718 ********************************************************************/
719 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
724 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
730 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
732 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
738 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
741 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
743 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
749 /*******************************************************************
751 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
752 * called from spoolss_open_printer_ex (cli_spoolss.c)
753 ********************************************************************/
754 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
756 if (r_u == NULL) return False;
758 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
764 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
767 if (!prs_uint32("status code", ps, depth, &(r_u->status)))
772 /*******************************************************************
774 ********************************************************************/
775 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
780 int len_name = valuename != NULL ? strlen(valuename) : 0;
782 if (q_u == NULL) return False;
784 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
786 memcpy(&(q_u->handle), handle, sizeof(q_u->handle));
787 init_unistr2(&(q_u->valuename), valuename, len_name);
793 /*******************************************************************
795 * called from spoolss_q_getprinterdata (srv_spoolss.c)
796 ********************************************************************/
797 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
799 if (q_u == NULL) return False;
801 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
806 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
810 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
814 if (!prs_uint32("size", ps, depth, &(q_u->size)))
820 /*******************************************************************
822 * called from spoolss_r_getprinterdata (srv_spoolss.c)
823 ********************************************************************/
824 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
829 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
834 if (!prs_uint32("type", ps, depth, &(r_u->type)))
836 if (!prs_uint32("size", ps, depth, &(r_u->size)))
839 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
845 if (!prs_uint32("needed", ps, depth, &(r_u->needed)))
847 if (!prs_uint32("status", ps, depth, &(r_u->status)))
853 /*******************************************************************
855 ********************************************************************/
856 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
858 if (q_u == NULL) return False;
860 DEBUG(5,("make_spoolss_q_closeprinter\n"));
862 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
867 /*******************************************************************
869 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
870 * called from spoolss_deleteprinter (cli_spoolss.c)
871 ********************************************************************/
872 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
874 if (q_u == NULL) return False;
876 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
882 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
888 /*******************************************************************
890 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
891 * called from spoolss_deleteprinter (cli_spoolss.c)
892 ********************************************************************/
893 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
895 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
901 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
903 if (!prs_uint32("status", ps, depth, &r_u->status))
910 /*******************************************************************
912 * called from static spoolss_q_closeprinter (srv_spoolss.c)
913 * called from spoolss_closeprinter (cli_spoolss.c)
914 ********************************************************************/
915 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
917 if (q_u == NULL) return False;
919 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
925 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
931 /*******************************************************************
933 * called from static spoolss_r_closeprinter (srv_spoolss.c)
934 * called from spoolss_closeprinter (cli_spoolss.c)
935 ********************************************************************/
936 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
938 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
944 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
946 if (!prs_uint32("status", ps, depth, &r_u->status))
952 /*******************************************************************
954 * called from spoolss_q_startdocprinter (srv_spoolss.c)
955 ********************************************************************/
956 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
958 if (q_u == NULL) return False;
960 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
966 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
969 if(!smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth))
975 /*******************************************************************
977 * called from spoolss_r_startdocprinter (srv_spoolss.c)
978 ********************************************************************/
979 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
981 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
983 if(!prs_uint32("jobid", ps, depth, &(r_u->jobid)))
985 if(!prs_uint32("status", ps, depth, &(r_u->status)))
991 /*******************************************************************
993 * called from spoolss_q_enddocprinter (srv_spoolss.c)
994 ********************************************************************/
995 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
997 if (q_u == NULL) return False;
999 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1005 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1011 /*******************************************************************
1012 * write a structure.
1013 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1014 ********************************************************************/
1015 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1017 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1019 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1025 /*******************************************************************
1027 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1028 ********************************************************************/
1029 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1031 if (q_u == NULL) return False;
1033 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1039 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1045 /*******************************************************************
1046 * write a structure.
1047 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1048 ********************************************************************/
1049 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1051 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1053 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1059 /*******************************************************************
1061 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1062 ********************************************************************/
1063 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1065 if (q_u == NULL) return False;
1067 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1073 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1079 /*******************************************************************
1080 * write a structure.
1081 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1082 ********************************************************************/
1083 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1085 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1087 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1093 /*******************************************************************
1095 * called from spoolss_q_writeprinter (srv_spoolss.c)
1096 ********************************************************************/
1097 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1099 if (q_u == NULL) return False;
1101 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1107 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1109 if(!prs_uint32("buffer_size", ps, depth, &(q_u->buffer_size)))
1112 if (q_u->buffer_size!=0)
1114 q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8));
1115 if(q_u->buffer == NULL)
1117 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1122 if(!prs_uint32("buffer_size2", ps, depth, &(q_u->buffer_size2)))
1128 /*******************************************************************
1129 * write a structure.
1130 * called from spoolss_r_writeprinter (srv_spoolss.c)
1131 ********************************************************************/
1132 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1134 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1136 if(!prs_uint32("buffer_written", ps, depth, &(r_u->buffer_written)))
1138 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1144 /*******************************************************************
1146 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1147 ********************************************************************/
1148 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1150 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1156 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1158 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1160 if(!prs_uint32("options", ps, depth, &q_u->options))
1162 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1164 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1170 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1173 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1176 if (q_u->option_ptr!=0) {
1178 if (UNMARSHALLING(ps))
1179 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1182 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1189 /*******************************************************************
1190 * write a structure.
1191 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1192 ********************************************************************/
1193 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1195 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1198 if(!prs_uint32("status", ps, depth, &r_u->status))
1204 /*******************************************************************
1206 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1207 ********************************************************************/
1208 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1210 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1216 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1219 if(!prs_uint32("change", ps, depth, &q_u->change))
1222 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1225 if (q_u->option_ptr!=0) {
1227 if (UNMARSHALLING(ps))
1228 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1231 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1238 /*******************************************************************
1239 * write a structure.
1240 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1241 ********************************************************************/
1242 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1244 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1250 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1253 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1258 if(!prs_uint32("status", ps, depth, &r_u->status))
1264 /*******************************************************************
1265 * return the length of a uint16 (obvious, but the code is clean)
1266 ********************************************************************/
1267 static uint32 size_of_uint16(uint16 *value)
1269 return (sizeof(*value));
1272 /*******************************************************************
1273 * return the length of a uint32 (obvious, but the code is clean)
1274 ********************************************************************/
1275 static uint32 size_of_uint32(uint32 *value)
1277 return (sizeof(*value));
1279 /*******************************************************************
1280 * return the length of a UNICODE string in number of char, includes:
1281 * - the leading zero
1282 * - the relative pointer size
1283 ********************************************************************/
1284 static uint32 size_of_relative_string(UNISTR *string)
1288 size=str_len_uni(string); /* the string length */
1289 size=size+1; /* add the leading zero */
1290 size=size*2; /* convert in char */
1291 size=size+4; /* add the size of the ptr */
1296 /*******************************************************************
1297 * return the length of a uint32 (obvious, but the code is clean)
1298 ********************************************************************/
1299 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1304 return (4+devmode->size+devmode->driverextra);
1307 /*******************************************************************
1308 * return the length of a uint32 (obvious, but the code is clean)
1309 ********************************************************************/
1310 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1315 return (sizeof(SYSTEMTIME) +4);
1318 /*******************************************************************
1319 * write a UNICODE string.
1320 * used by all the RPC structs passing a buffer
1321 ********************************************************************/
1322 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1327 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1329 if (!prs_unistr("unistr", ps, depth, uni))
1336 /*******************************************************************
1337 * write a UNICODE string and its relative pointer.
1338 * used by all the RPC structs passing a buffer
1340 * As I'm a nice guy, I'm forcing myself to explain this code.
1341 * MS did a good job in the overall spoolss code except in some
1342 * functions where they are passing the API buffer directly in the
1343 * RPC request/reply. That's to maintain compatiility at the API level.
1344 * They could have done it the good way the first time.
1346 * So what happen is: the strings are written at the buffer's end,
1347 * in the reverse order of the original structure. Some pointers to
1348 * the strings are also in the buffer. Those are relative to the
1351 * If you don't understand or want to change that function,
1352 * first get in touch with me: jfm@samba.org
1354 ********************************************************************/
1355 static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1357 prs_struct *ps=&(buffer->prs);
1359 if (MARSHALLING(ps)) {
1360 uint32 struct_offset = prs_offset(ps);
1361 uint32 relative_offset;
1363 buffer->string_at_end -= 2*(str_len_uni(string)+1);
1364 prs_set_offset(ps, buffer->string_at_end);
1366 /* write the string */
1367 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1370 prs_set_offset(ps, struct_offset);
1372 relative_offset=buffer->string_at_end - buffer->struct_start;
1373 /* write its offset */
1374 if (!prs_uint32("offset", ps, depth, &relative_offset))
1380 /* read the offset */
1381 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1384 old_offset = prs_offset(ps);
1385 prs_set_offset(ps, buffer->string_at_end+buffer->struct_start);
1387 /* read the string */
1388 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1391 prs_set_offset(ps, old_offset);
1397 /*******************************************************************
1398 * write a array of UNICODE strings and its relative pointer.
1399 * used by 2 RPC structs
1400 ********************************************************************/
1401 static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1405 prs_struct *ps=&(buffer->prs);
1407 if (MARSHALLING(ps)) {
1408 uint32 struct_offset = prs_offset(ps);
1409 uint32 relative_offset;
1416 /* first write the last 0 */
1417 buffer->string_at_end -= 2;
1418 prs_set_offset(ps, buffer->string_at_end);
1420 if(!prs_uint16("leading zero", ps, depth, &zero))
1428 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1430 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1432 prs_set_offset(ps, buffer->string_at_end);
1434 /* write the string */
1435 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1440 } while (*p!=0); /* end on the last leading 0 */
1442 prs_set_offset(ps, struct_offset);
1444 relative_offset=buffer->string_at_end - buffer->struct_start;
1445 /* write its offset */
1446 if (!prs_uint32("offset", ps, depth, &relative_offset))
1451 uint16 *chaine2=NULL;
1457 /* read the offset */
1458 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1461 old_offset = prs_offset(ps);
1462 prs_set_offset(ps, buffer->string_at_end + buffer->struct_start);
1465 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1468 l_chaine=str_len_uni(&chaine);
1469 if((chaine2=(uint16 *)Realloc(chaine2, (l_chaine2+l_chaine+1)*sizeof(uint16))) == NULL)
1471 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1472 l_chaine2+=l_chaine+1;
1474 } while(l_chaine!=0);
1478 prs_set_offset(ps, old_offset);
1484 /*******************************************************************
1485 Parse a DEVMODE structure and its relative pointer.
1486 ********************************************************************/
1487 static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1489 prs_struct *ps=&(buffer->prs);
1491 prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
1494 if (MARSHALLING(ps)) {
1495 uint32 struct_offset = prs_offset(ps);
1496 uint32 relative_offset;
1498 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1500 prs_set_offset(ps, buffer->string_at_end);
1502 /* write the DEVMODE */
1503 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1506 prs_set_offset(ps, struct_offset);
1508 relative_offset=buffer->string_at_end - buffer->struct_start;
1509 /* write its offset */
1510 if (!prs_uint32("offset", ps, depth, &relative_offset))
1516 /* read the offset */
1517 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1520 old_offset = prs_offset(ps);
1521 prs_set_offset(ps, buffer->string_at_end + buffer->struct_start);
1523 /* read the string */
1524 if((*devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL)
1526 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1529 prs_set_offset(ps, old_offset);
1535 /*******************************************************************
1536 Parse a PRINTER_INFO_0 structure.
1537 ********************************************************************/
1538 BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1540 prs_struct *ps=&(buffer->prs);
1542 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1545 buffer->struct_start=prs_offset(ps);
1547 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1549 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1552 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1554 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1556 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1559 if(!prs_uint16("year", ps, depth, &info->year))
1561 if(!prs_uint16("month", ps, depth, &info->month))
1563 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1565 if(!prs_uint16("day", ps, depth, &info->day))
1567 if(!prs_uint16("hour", ps, depth, &info->hour))
1569 if(!prs_uint16("minute", ps, depth, &info->minute))
1571 if(!prs_uint16("second", ps, depth, &info->second))
1573 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1576 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1578 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1581 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1583 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1585 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1587 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1589 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1591 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1593 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1595 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1597 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1599 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1601 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1603 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
1605 if(!prs_uint32("change_id", ps, depth, &info->change_id))
1607 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
1609 if(!prs_uint32("status" , ps, depth, &info->status))
1611 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
1613 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
1615 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
1617 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
1619 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
1621 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
1623 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
1625 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
1627 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
1629 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
1635 /*******************************************************************
1636 Parse a PRINTER_INFO_1 structure.
1637 ********************************************************************/
1638 BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
1640 prs_struct *ps=&(buffer->prs);
1642 prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
1645 buffer->struct_start=prs_offset(ps);
1647 if (!prs_uint32("flags", ps, depth, &info->flags))
1649 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
1651 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1653 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
1659 /*******************************************************************
1660 Parse a PRINTER_INFO_2 structure.
1661 ********************************************************************/
1662 BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
1664 /* hack for the SEC DESC */
1667 prs_struct *ps=&(buffer->prs);
1669 prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
1672 buffer->struct_start=prs_offset(ps);
1674 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1676 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1678 if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
1680 if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
1682 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
1684 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
1686 if (!new_smb_io_relstr("location", buffer, depth, &info->location))
1689 /* NT parses the DEVMODE at the end of the struct */
1690 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1693 if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
1695 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1697 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1699 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
1702 if (!prs_uint32("security descriptor", ps, depth, &pipo))
1704 if (!prs_uint32("attributes", ps, depth, &info->attributes))
1706 if (!prs_uint32("priority", ps, depth, &info->priority))
1708 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
1710 if (!prs_uint32("starttime", ps, depth, &info->starttime))
1712 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
1714 if (!prs_uint32("status", ps, depth, &info->status))
1716 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
1718 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
1724 /*******************************************************************
1725 Parse a DRIVER_INFO_1 structure.
1726 ********************************************************************/
1727 BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
1729 prs_struct *ps=&(buffer->prs);
1731 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
1734 buffer->struct_start=prs_offset(ps);
1736 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1743 /*******************************************************************
1744 Parse a DRIVER_INFO_2 structure.
1745 ********************************************************************/
1746 BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
1748 prs_struct *ps=&(buffer->prs);
1750 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
1753 buffer->struct_start=prs_offset(ps);
1755 if (!prs_uint32("version", ps, depth, &info->version))
1757 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1759 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
1761 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1763 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
1765 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
1772 /*******************************************************************
1773 Parse a DRIVER_INFO_3 structure.
1774 ********************************************************************/
1775 BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
1777 prs_struct *ps=&(buffer->prs);
1779 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
1782 buffer->struct_start=prs_offset(ps);
1784 if (!prs_uint32("version", ps, depth, &info->version))
1786 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1788 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
1790 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1792 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
1794 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
1796 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
1799 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
1802 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
1804 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
1811 /*******************************************************************
1812 Parse a JOB_INFO_1 structure.
1813 ********************************************************************/
1814 BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
1816 prs_struct *ps=&(buffer->prs);
1818 prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
1821 buffer->struct_start=prs_offset(ps);
1823 if (!prs_uint32("jobid", ps, depth, &info->jobid))
1825 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1827 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
1829 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
1831 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
1833 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1835 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
1837 if (!prs_uint32("status", ps, depth, &info->status))
1839 if (!prs_uint32("priority", ps, depth, &info->priority))
1841 if (!prs_uint32("position", ps, depth, &info->position))
1843 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
1845 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
1847 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
1853 /*******************************************************************
1854 Parse a JOB_INFO_2 structure.
1855 ********************************************************************/
1856 BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
1859 prs_struct *ps=&(buffer->prs);
1861 prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
1864 buffer->struct_start=prs_offset(ps);
1866 if (!prs_uint32("jobid",ps, depth, &info->jobid))
1868 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1870 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
1872 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
1874 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
1876 if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
1878 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1881 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1883 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
1885 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
1887 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1889 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
1892 /* SEC_DESC sec_desc;*/
1893 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
1896 if (!prs_uint32("status",ps, depth, &info->status))
1898 if (!prs_uint32("priority",ps, depth, &info->priority))
1900 if (!prs_uint32("position",ps, depth, &info->position))
1902 if (!prs_uint32("starttime",ps, depth, &info->starttime))
1904 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
1906 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
1908 if (!prs_uint32("size",ps, depth, &info->size))
1910 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
1912 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
1914 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
1920 /*******************************************************************
1921 ********************************************************************/
1922 BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
1924 prs_struct *ps=&(buffer->prs);
1926 prs_debug(ps, depth, desc, "new_smb_io_form_1");
1929 buffer->struct_start=prs_offset(ps);
1931 if (!prs_uint32("flag", ps, depth, &(info->flag)))
1934 if (!new_smb_io_relstr("name", buffer, depth, &(info->name)))
1937 if (!prs_uint32("width", ps, depth, &(info->width)))
1939 if (!prs_uint32("length", ps, depth, &(info->length)))
1941 if (!prs_uint32("left", ps, depth, &(info->left)))
1943 if (!prs_uint32("top", ps, depth, &(info->top)))
1945 if (!prs_uint32("right", ps, depth, &(info->right)))
1947 if (!prs_uint32("bottom", ps, depth, &(info->bottom)))
1953 /*******************************************************************
1954 Read/write a BUFFER struct.
1955 ********************************************************************/
1956 static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER *buffer)
1961 prs_debug(ps, depth, desc, "new_spoolss_io_buffer");
1964 if (!prs_uint32("ptr", ps, depth, &(buffer->ptr)))
1968 if (UNMARSHALLING(ps)) {
1970 buffer->string_at_end=0;
1972 if (buffer->ptr==0) {
1973 if (!prs_init(&(buffer->prs), 0, 4, UNMARSHALL))
1978 if (!prs_uint32("size", ps, depth, &buffer->size))
1981 if (!prs_init(&(buffer->prs), buffer->size, 4, UNMARSHALL))
1984 if (!prs_append_some_prs_data(&(buffer->prs), ps, prs_offset(ps), buffer->size))
1987 if (!prs_set_offset(&buffer->prs, 0))
1990 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
1993 buffer->string_at_end=buffer->size;
2002 if (!prs_uint32("size", ps, depth, &(buffer->size)))
2004 if (!prs_append_some_prs_data(ps, &(buffer->prs), 0, buffer->size))
2011 /*******************************************************************
2012 move a BUFFER from the query to the reply.
2013 ********************************************************************/
2014 void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2016 prs_switch_type(&(src->prs), MARSHALL);
2017 prs_set_offset(&(src->prs), 0);
2018 prs_force_dynamic(&(src->prs));
2023 /*******************************************************************
2024 create a BUFFER struct.
2025 ********************************************************************/
2026 BOOL new_spoolss_allocate_buffer(NEW_BUFFER **buffer)
2031 if((*buffer=(NEW_BUFFER *)malloc(sizeof(NEW_BUFFER))) == NULL) {
2032 DEBUG(0,("new_spoolss_allocate_buffer: malloc fail for size %u.\n",
2033 (unsigned int)sizeof(NEW_BUFFER) ));
2039 (*buffer)->string_at_end=0;
2043 /*******************************************************************
2044 Destroy a BUFFER struct.
2045 ********************************************************************/
2046 void new_spoolss_free_buffer(NEW_BUFFER *buffer)
2051 prs_mem_free(&(buffer->prs));
2054 buffer->string_at_end=0;
2059 /*******************************************************************
2060 Get the size of a BUFFER struct.
2061 ********************************************************************/
2062 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2064 return (buffer->size);
2068 /*******************************************************************
2069 Parse a DRIVER_DIRECTORY_1 structure.
2070 ********************************************************************/
2071 BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2073 prs_struct *ps=&(buffer->prs);
2075 prs_debug(ps, depth, desc, "new_smb_io_driverdir_1");
2078 buffer->struct_start=prs_offset(ps);
2080 if (!spoolss_smb_io_unistr(desc, &info->name, ps, depth))
2086 /*******************************************************************
2087 Parse a PORT_INFO_1 structure.
2088 ********************************************************************/
2089 BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2091 prs_struct *ps=&(buffer->prs);
2093 prs_debug(ps, depth, desc, "new_smb_io_port_1");
2096 buffer->struct_start=prs_offset(ps);
2098 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2104 /*******************************************************************
2105 Parse a PORT_INFO_2 structure.
2106 ********************************************************************/
2107 BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2109 prs_struct *ps=&(buffer->prs);
2111 prs_debug(ps, depth, desc, "new_smb_io_port_2");
2114 buffer->struct_start=prs_offset(ps);
2116 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2118 if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2120 if(!new_smb_io_relstr("description", buffer, depth, &info->description))
2122 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2124 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2131 /*******************************************************************
2132 ********************************************************************/
2133 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2135 prs_struct *ps=&(buffer->prs);
2137 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2140 buffer->struct_start=prs_offset(ps);
2142 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2148 /*******************************************************************
2149 ********************************************************************/
2150 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2152 prs_struct *ps=&(buffer->prs);
2154 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2157 buffer->struct_start=prs_offset(ps);
2159 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2165 /*******************************************************************
2166 ********************************************************************/
2167 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2169 prs_struct *ps=&(buffer->prs);
2171 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2174 buffer->struct_start=prs_offset(ps);
2176 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2182 /*******************************************************************
2183 ********************************************************************/
2184 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2186 prs_struct *ps=&(buffer->prs);
2188 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2191 buffer->struct_start=prs_offset(ps);
2193 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2195 if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
2197 if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2203 /*******************************************************************
2204 return the size required by a struct in the stream
2205 ********************************************************************/
2206 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2210 size+=size_of_relative_string( &info->printername );
2211 size+=size_of_relative_string( &info->servername );
2213 size+=size_of_uint32( &info->cjobs);
2214 size+=size_of_uint32( &info->total_jobs);
2215 size+=size_of_uint32( &info->total_bytes);
2217 size+=size_of_uint16( &info->year);
2218 size+=size_of_uint16( &info->month);
2219 size+=size_of_uint16( &info->dayofweek);
2220 size+=size_of_uint16( &info->day);
2221 size+=size_of_uint16( &info->hour);
2222 size+=size_of_uint16( &info->minute);
2223 size+=size_of_uint16( &info->second);
2224 size+=size_of_uint16( &info->milliseconds);
2226 size+=size_of_uint32( &info->global_counter);
2227 size+=size_of_uint32( &info->total_pages);
2229 size+=size_of_uint16( &info->major_version);
2230 size+=size_of_uint16( &info->build_version);
2232 size+=size_of_uint32( &info->unknown7);
2233 size+=size_of_uint32( &info->unknown8);
2234 size+=size_of_uint32( &info->unknown9);
2235 size+=size_of_uint32( &info->session_counter);
2236 size+=size_of_uint32( &info->unknown11);
2237 size+=size_of_uint32( &info->printer_errors);
2238 size+=size_of_uint32( &info->unknown13);
2239 size+=size_of_uint32( &info->unknown14);
2240 size+=size_of_uint32( &info->unknown15);
2241 size+=size_of_uint32( &info->unknown16);
2242 size+=size_of_uint32( &info->change_id);
2243 size+=size_of_uint32( &info->unknown18);
2244 size+=size_of_uint32( &info->status);
2245 size+=size_of_uint32( &info->unknown20);
2246 size+=size_of_uint32( &info->c_setprinter);
2248 size+=size_of_uint16( &info->unknown22);
2249 size+=size_of_uint16( &info->unknown23);
2250 size+=size_of_uint16( &info->unknown24);
2251 size+=size_of_uint16( &info->unknown25);
2252 size+=size_of_uint16( &info->unknown26);
2253 size+=size_of_uint16( &info->unknown27);
2254 size+=size_of_uint16( &info->unknown28);
2255 size+=size_of_uint16( &info->unknown29);
2260 /*******************************************************************
2261 return the size required by a struct in the stream
2262 ********************************************************************/
2263 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2267 size+=size_of_uint32( &(info->flags) );
2268 size+=size_of_relative_string( &(info->description) );
2269 size+=size_of_relative_string( &(info->name) );
2270 size+=size_of_relative_string( &(info->comment) );
2275 /*******************************************************************
2276 return the size required by a struct in the stream
2277 ********************************************************************/
2278 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2282 size+=4; /* the security descriptor */
2284 size+=size_of_device_mode( info->devmode );
2286 size+=size_of_relative_string( &info->servername );
2287 size+=size_of_relative_string( &info->printername );
2288 size+=size_of_relative_string( &info->sharename );
2289 size+=size_of_relative_string( &info->portname );
2290 size+=size_of_relative_string( &info->drivername );
2291 size+=size_of_relative_string( &info->comment );
2292 size+=size_of_relative_string( &info->location );
2294 size+=size_of_relative_string( &info->sepfile );
2295 size+=size_of_relative_string( &info->printprocessor );
2296 size+=size_of_relative_string( &info->datatype );
2297 size+=size_of_relative_string( &info->parameters );
2299 size+=size_of_uint32( &info->attributes );
2300 size+=size_of_uint32( &info->priority );
2301 size+=size_of_uint32( &info->defaultpriority );
2302 size+=size_of_uint32( &info->starttime );
2303 size+=size_of_uint32( &info->untiltime );
2304 size+=size_of_uint32( &info->status );
2305 size+=size_of_uint32( &info->cjobs );
2306 size+=size_of_uint32( &info->averageppm );
2310 /*******************************************************************
2311 return the size required by a struct in the stream
2312 ********************************************************************/
2313 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2316 size+=size_of_relative_string( &info->name );
2321 /*******************************************************************
2322 return the size required by a struct in the stream
2323 ********************************************************************/
2324 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2327 size+=size_of_uint32( &info->version );
2328 size+=size_of_relative_string( &info->name );
2329 size+=size_of_relative_string( &info->architecture );
2330 size+=size_of_relative_string( &info->driverpath );
2331 size+=size_of_relative_string( &info->datafile );
2332 size+=size_of_relative_string( &info->configfile );
2337 /*******************************************************************
2338 return the size required by a struct in the stream
2339 ********************************************************************/
2340 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
2346 size+=size_of_uint32( &info->version );
2347 size+=size_of_relative_string( &info->name );
2348 size+=size_of_relative_string( &info->architecture );
2349 size+=size_of_relative_string( &info->driverpath );
2350 size+=size_of_relative_string( &info->datafile );
2351 size+=size_of_relative_string( &info->configfile );
2352 size+=size_of_relative_string( &info->helpfile );
2353 size+=size_of_relative_string( &info->monitorname );
2354 size+=size_of_relative_string( &info->defaultdatatype );
2356 string=info->dependentfiles;
2358 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2360 i=i+2; /* to count all chars including the leading zero */
2361 i=2*i; /* because we need the value in bytes */
2362 i=i+4; /* the offset pointer size */
2369 /*******************************************************************
2370 return the size required by a struct in the stream
2371 ********************************************************************/
2372 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
2375 size+=size_of_uint32( &info->jobid );
2376 size+=size_of_relative_string( &info->printername );
2377 size+=size_of_relative_string( &info->machinename );
2378 size+=size_of_relative_string( &info->username );
2379 size+=size_of_relative_string( &info->document );
2380 size+=size_of_relative_string( &info->datatype );
2381 size+=size_of_relative_string( &info->text_status );
2382 size+=size_of_uint32( &info->status );
2383 size+=size_of_uint32( &info->priority );
2384 size+=size_of_uint32( &info->position );
2385 size+=size_of_uint32( &info->totalpages );
2386 size+=size_of_uint32( &info->pagesprinted );
2387 size+=size_of_systemtime( &info->submitted );
2392 /*******************************************************************
2393 return the size required by a struct in the stream
2394 ********************************************************************/
2395 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
2399 size+=4; /* size of sec desc ptr */
2401 size+=size_of_uint32( &info->jobid );
2402 size+=size_of_relative_string( &info->printername );
2403 size+=size_of_relative_string( &info->machinename );
2404 size+=size_of_relative_string( &info->username );
2405 size+=size_of_relative_string( &info->document );
2406 size+=size_of_relative_string( &info->notifyname );
2407 size+=size_of_relative_string( &info->datatype );
2408 size+=size_of_relative_string( &info->printprocessor );
2409 size+=size_of_relative_string( &info->parameters );
2410 size+=size_of_relative_string( &info->drivername );
2411 size+=size_of_device_mode( info->devmode );
2412 size+=size_of_relative_string( &info->text_status );
2413 /* SEC_DESC sec_desc;*/
2414 size+=size_of_uint32( &info->status );
2415 size+=size_of_uint32( &info->priority );
2416 size+=size_of_uint32( &info->position );
2417 size+=size_of_uint32( &info->starttime );
2418 size+=size_of_uint32( &info->untiltime );
2419 size+=size_of_uint32( &info->totalpages );
2420 size+=size_of_uint32( &info->size );
2421 size+=size_of_systemtime( &info->submitted );
2422 size+=size_of_uint32( &info->timeelapsed );
2423 size+=size_of_uint32( &info->pagesprinted );
2428 /*******************************************************************
2429 return the size required by a struct in the stream
2430 ********************************************************************/
2431 uint32 spoolss_size_form_1(FORM_1 *info)
2435 size+=size_of_uint32( &(info->flag) );
2436 size+=size_of_relative_string( &(info->name) );
2437 size+=size_of_uint32( &(info->width) );
2438 size+=size_of_uint32( &(info->length) );
2439 size+=size_of_uint32( &(info->left) );
2440 size+=size_of_uint32( &(info->top) );
2441 size+=size_of_uint32( &(info->right) );
2442 size+=size_of_uint32( &(info->bottom) );
2447 /*******************************************************************
2448 return the size required by a struct in the stream
2449 ********************************************************************/
2450 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
2454 size+=size_of_relative_string( &info->port_name );
2459 /*******************************************************************
2460 return the size required by a struct in the stream
2461 ********************************************************************/
2462 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
2466 size=str_len_uni(&info->name); /* the string length */
2467 size=size+1; /* add the leading zero */
2468 size=size*2; /* convert in char */
2473 /*******************************************************************
2474 return the size required by a struct in the stream
2475 ********************************************************************/
2476 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
2480 size+=size_of_relative_string( &info->port_name );
2481 size+=size_of_relative_string( &info->monitor_name );
2482 size+=size_of_relative_string( &info->description );
2484 size+=size_of_uint32( &info->port_type );
2485 size+=size_of_uint32( &info->reserved );
2490 /*******************************************************************
2491 return the size required by a struct in the stream
2492 ********************************************************************/
2493 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
2496 size+=size_of_relative_string( &info->name );
2501 /*******************************************************************
2502 return the size required by a struct in the stream
2503 ********************************************************************/
2504 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
2507 size+=size_of_relative_string( &info->name );
2512 /*******************************************************************
2513 return the size required by a struct in the stream
2514 ********************************************************************/
2515 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
2518 size+=size_of_relative_string( &info->name );
2523 /*******************************************************************
2524 return the size required by a struct in the stream
2525 ********************************************************************/
2526 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
2529 size+=size_of_relative_string( &info->name);
2530 size+=size_of_relative_string( &info->environment);
2531 size+=size_of_relative_string( &info->dll_name);
2536 /*******************************************************************
2538 ********************************************************************/
2539 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
2540 const POLICY_HND *hnd, fstring architecture,
2541 uint32 level, uint32 clientmajor, uint32 clientminor,
2542 NEW_BUFFER *buffer, uint32 offered)
2549 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2551 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
2554 q_u->clientmajorversion=clientmajor;
2555 q_u->clientminorversion=clientminor;
2558 q_u->offered=offered;
2563 /*******************************************************************
2565 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2566 ********************************************************************/
2567 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
2569 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
2575 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2577 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
2579 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
2584 if(!prs_uint32("level", ps, depth, &q_u->level))
2587 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2593 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2596 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
2598 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
2604 /*******************************************************************
2606 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2607 ********************************************************************/
2608 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
2610 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
2616 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2621 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2623 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
2625 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
2627 if (!prs_uint32("status", ps, depth, &r_u->status))
2633 /*******************************************************************
2635 ********************************************************************/
2636 BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags,
2637 fstring servername, uint32 level,
2638 NEW_BUFFER *buffer, uint32 offered)
2642 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
2643 init_unistr2(&(q_u->servername), servername, strlen(servername));
2647 q_u->offered=offered;
2652 /*******************************************************************
2654 * called from spoolss_enumprinters (srv_spoolss.c)
2655 ********************************************************************/
2656 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
2658 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
2664 if (!prs_uint32("flags", ps, depth, &q_u->flags))
2666 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
2669 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
2674 if (!prs_uint32("level", ps, depth, &q_u->level))
2677 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2682 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2688 /*******************************************************************
2689 Parse a SPOOL_R_ENUMPRINTERS structure.
2690 ********************************************************************/
2691 BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
2693 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
2699 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2705 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2708 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2711 if (!prs_uint32("status", ps, depth, &r_u->status))
2717 /*******************************************************************
2718 * write a structure.
2719 * called from spoolss_r_enum_printers (srv_spoolss.c)
2721 ********************************************************************/
2722 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
2724 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
2730 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2736 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2739 if (!prs_uint32("status", ps, depth, &r_u->status))
2745 /*******************************************************************
2747 * called from spoolss_getprinter (srv_spoolss.c)
2748 ********************************************************************/
2749 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
2751 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
2757 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2759 if (!prs_uint32("level", ps, depth, &q_u->level))
2762 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2767 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2773 /*******************************************************************
2775 ********************************************************************/
2776 BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level,
2777 NEW_BUFFER *buffer, uint32 offered)
2783 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2787 q_u->offered=offered;
2792 /*******************************************************************
2793 ********************************************************************/
2794 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
2796 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
2802 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2808 /*******************************************************************
2809 ********************************************************************/
2810 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
2812 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
2818 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
2820 if(!prs_uint32("level", ps, depth, &q_u->level))
2823 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
2826 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
2829 if(!prs_uint32("security.size_of_buffer", ps, depth, &q_u->security.size_of_buffer))
2831 if(!prs_uint32("security.data", ps, depth, &q_u->security.data))
2834 if(!prs_uint32("command", ps, depth, &q_u->command))
2840 /*******************************************************************
2841 ********************************************************************/
2842 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
2844 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
2850 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2856 /*******************************************************************
2857 ********************************************************************/
2858 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
2861 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
2867 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
2874 /*******************************************************************
2875 ********************************************************************/
2876 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
2878 prs_debug(ps, depth, desc, "");
2884 if(!prs_uint32("status", ps, depth, &r_u->status))
2890 /*******************************************************************
2891 ********************************************************************/
2892 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
2894 prs_debug(ps, depth, desc, "");
2900 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2902 if(!prs_uint32("level", ps, depth, &q_u->level))
2905 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2911 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2917 /*******************************************************************
2918 ********************************************************************/
2919 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
2921 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
2927 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2933 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2936 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2939 if (!prs_uint32("status", ps, depth, &r_u->status))
2946 /*******************************************************************
2947 ********************************************************************/
2948 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
2959 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2960 q_u->firstjob = firstjob;
2961 q_u->numofjobs = numofjobs;
2963 q_u->buffer= buffer;
2964 q_u->offered = offered;
2968 /*******************************************************************
2969 ********************************************************************/
2970 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
2972 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
2978 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
2981 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
2983 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
2985 if (!prs_uint32("level", ps, depth, &q_u->level))
2988 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2991 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2997 /*******************************************************************
2998 ********************************************************************/
2999 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3001 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3007 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3013 /*******************************************************************
3014 ********************************************************************/
3015 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3017 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3023 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3025 if(!prs_uint32("jobid", ps, depth, &(q_u->jobid)))
3031 /*******************************************************************
3032 ********************************************************************/
3033 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3035 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3041 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3047 /*******************************************************************
3048 ********************************************************************/
3049 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3051 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3057 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3059 if(!prs_uint32("jobid", ps, depth, &(q_u->jobid)))
3062 * level is usually 0. If (level!=0) then I'm in trouble !
3063 * I will try to generate setjob command with level!=0, one day.
3065 if(!prs_uint32("level", ps, depth, &(q_u->level)))
3067 if(!prs_uint32("command", ps, depth, &(q_u->command)))
3073 /*******************************************************************
3074 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3075 ********************************************************************/
3076 BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3078 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
3084 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3090 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3093 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3096 if (!prs_uint32("status", ps, depth, &r_u->status))
3103 /*******************************************************************
3104 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3105 ********************************************************************/
3106 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3109 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3115 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3117 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3122 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3124 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3129 if (!prs_uint32("level", ps, depth, &q_u->level))
3132 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3138 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3144 /*******************************************************************
3145 ********************************************************************/
3146 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
3149 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
3154 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3156 if (!prs_uint32("level", ps, depth, &(q_u->level)))
3159 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3164 if (!prs_uint32("offered", ps, depth, &(q_u->offered)))
3170 /*******************************************************************
3171 ********************************************************************/
3172 BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
3174 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumforms");
3180 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3186 if (!prs_uint32("size of buffer needed", ps, depth, &(r_u->needed)))
3189 if (!prs_uint32("numofforms", ps, depth, &(r_u->numofforms)))
3192 if (!prs_uint32("status", ps, depth, &(r_u->status)))
3199 /*******************************************************************
3200 Parse a SPOOL_R_ENUMPORTS structure.
3201 ********************************************************************/
3202 BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
3204 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
3210 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3216 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3219 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3222 if (!prs_uint32("status", ps, depth, &r_u->status))
3228 /*******************************************************************
3229 ********************************************************************/
3230 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
3232 prs_debug(ps, depth, desc, "");
3238 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
3240 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
3245 if (!prs_uint32("level", ps, depth, &q_u->level))
3248 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3253 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3259 /*******************************************************************
3260 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
3261 ********************************************************************/
3262 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
3264 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
3270 if(!prs_uint32("flags", ps, depth, &il->flags))
3272 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
3274 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3276 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3279 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
3281 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3283 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3289 /*******************************************************************
3290 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
3291 ********************************************************************/
3292 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
3294 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
3300 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
3302 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
3304 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
3306 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
3308 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
3310 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3312 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
3314 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
3316 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
3318 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
3320 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
3322 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
3324 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3327 if(!prs_uint32("attributes", ps, depth, &il->attributes))
3329 if(!prs_uint32("priority", ps, depth, &il->priority))
3331 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
3333 if(!prs_uint32("starttime", ps, depth, &il->starttime))
3335 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
3337 if(!prs_uint32("status", ps, depth, &il->status))
3339 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
3341 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
3344 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
3346 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
3348 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
3350 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
3352 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
3354 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3356 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
3358 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
3360 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
3362 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
3364 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
3370 /*******************************************************************
3371 ********************************************************************/
3372 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
3374 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
3379 if(!prs_uint32("level", ps, depth, &il->level))
3381 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
3384 /* if no struct inside just return */
3385 if (il->info_ptr==0) {
3386 if (UNMARSHALLING(ps)) {
3393 switch (il->level) {
3395 * level 0 is used by setprinter when managing the queue
3396 * (hold, stop, start a queue)
3401 * level 2 is used by addprinter
3402 * and by setprinter when updating printer's info
3405 if (UNMARSHALLING(ps)) {
3406 il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1));
3407 if(il->info_1 == NULL)
3410 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
3414 if (UNMARSHALLING(ps)) {
3415 il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
3416 if(il->info_2 == NULL)
3419 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
3427 /*******************************************************************
3428 ********************************************************************/
3429 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
3431 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
3435 * I think that's one of the few well written functions.
3436 * the sub-structures are correctly parsed and analysed
3437 * the info level are handled in a nice way.
3442 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
3444 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
3450 if(!prs_uint32("info_level", ps, depth, &q_u->level))
3453 if(!spool_io_printer_info_level("", &(q_u->info), ps, depth))
3456 /* the 4 unknown are all 0 */
3459 * en fait ils sont pas inconnu
3460 * par recoupement avec rpcSetPrinter
3461 * c'est le devicemode
3462 * et le security descriptor.
3465 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
3467 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
3469 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
3471 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
3474 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
3476 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
3483 /*******************************************************************
3484 ********************************************************************/
3485 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u, prs_struct *ps, int depth)
3487 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
3490 if(!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
3493 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3499 /*******************************************************************
3500 ********************************************************************/
3501 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
3502 prs_struct *ps, int depth)
3504 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
3506 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
3510 if (UNMARSHALLING(ps)) {
3511 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
3524 if(!prs_uint32("cversion", ps, depth, &il->cversion))
3526 if(!prs_uint32("name", ps, depth, &il->name_ptr))
3528 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
3530 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
3532 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
3534 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
3536 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
3538 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
3540 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
3542 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
3544 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
3550 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3552 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
3554 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
3556 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
3558 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
3560 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
3562 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
3564 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
3570 if (il->dependentfiles_ptr)
3571 smb_io_buffer5("", &(il->dependentfiles), ps, depth);
3577 /*******************************************************************
3578 convert a buffer of UNICODE strings null terminated
3579 the buffer is terminated by a NULL
3581 convert to an ascii array (null terminated)
3583 dynamically allocate memory
3585 ********************************************************************/
3586 BOOL uniarray_2_ascarray(BUFFER5 *buf5, char ***ar)
3597 if (buf5==NULL) return False;
3604 string=(char *)malloc(sizeof(char)*buf5->buf_len);
3608 destend = string + buf5->buf_len;
3611 while (dest < destend)
3613 *(dest++) = (char)*(src++);
3616 /* that ugly for the first one but that's working */
3617 array=(char **)Realloc(array, sizeof(char *)*(i+1));
3622 while ( n < buf5->buf_len )
3624 if ( *(string++) == '\0' )
3626 array=(char **)Realloc(array, sizeof(char *)*(i+1));
3635 DEBUG(10,("Number of dependent files: [%d]\n", i-1));
3640 /*******************************************************************
3641 read a UNICODE array with null terminated strings
3642 and null terminated array
3643 and size of array at beginning
3644 ********************************************************************/
3645 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
3647 if (buffer==NULL) return False;
3650 buffer->uni_str_len=buffer->uni_max_len;
3652 if(!prs_uint32("buffer_size", ps, depth, &(buffer->uni_max_len)))
3655 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
3661 /*******************************************************************
3662 ********************************************************************/
3663 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
3665 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
3670 if(!prs_uint32("level", ps, depth, &il->level))
3672 if(!prs_uint32("ptr", ps, depth, &il->ptr))
3678 switch (il->level) {
3680 if(!spool_io_printer_driver_info_level_3("", &(il->info_3), ps, depth))
3688 /*******************************************************************
3689 ********************************************************************/
3690 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
3692 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
3698 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
3700 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
3705 if(!prs_uint32("info_level", ps, depth, &q_u->level))
3708 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
3714 /*******************************************************************
3715 ********************************************************************/
3716 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
3718 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
3721 if(!prs_uint32("status", ps, depth, &q_u->status))
3728 /*******************************************************************
3729 ********************************************************************/
3730 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
3731 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
3733 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
3735 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
3739 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
3747 d->cversion=uni->cversion;
3749 unistr2_to_ascii(d->name, &(uni->name), sizeof(d->name)-1);
3750 unistr2_to_ascii(d->environment, &(uni->environment), sizeof(d->environment)-1);
3751 unistr2_to_ascii(d->driverpath, &(uni->driverpath), sizeof(d->driverpath)-1);
3752 unistr2_to_ascii(d->datafile, &(uni->datafile), sizeof(d->datafile)-1);
3753 unistr2_to_ascii(d->configfile, &(uni->configfile), sizeof(d->configfile)-1);
3754 unistr2_to_ascii(d->helpfile, &(uni->helpfile), sizeof(d->helpfile)-1);
3755 unistr2_to_ascii(d->monitorname, &(uni->monitorname), sizeof(d->monitorname)-1);
3756 unistr2_to_ascii(d->defaultdatatype, &(uni->defaultdatatype), sizeof(d->defaultdatatype)-1);
3758 DEBUGADD(8,( "version: %d\n", d->cversion));
3759 DEBUGADD(8,( "name: %s\n", d->name));
3760 DEBUGADD(8,( "environment: %s\n", d->environment));
3761 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
3762 DEBUGADD(8,( "datafile: %s\n", d->datafile));
3763 DEBUGADD(8,( "configfile: %s\n", d->configfile));
3764 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
3765 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
3766 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
3768 uniarray_2_ascarray(&(uni->dependentfiles), &(d->dependentfiles) );
3773 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
3774 NT_PRINTER_INFO_LEVEL_2 **asc)
3776 NT_PRINTER_INFO_LEVEL_2 *d;
3780 DEBUG(7,("Converting from UNICODE to ASCII\n"));
3781 time_unix=time(NULL);
3785 DEBUGADD(8,("allocating memory\n"));
3787 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
3792 /* we allocate memory iff called from
3793 * addprinter(ex) so we can do one time stuff here.
3795 (*asc)->setuptime=time_unix;
3798 DEBUGADD(8,("start converting\n"));
3802 d->attributes=uni->attributes;
3803 d->priority=uni->priority;
3804 d->default_priority=uni->default_priority;
3805 d->starttime=uni->starttime;
3806 d->untiltime=uni->untiltime;
3807 d->status=uni->status;
3808 d->cjobs=uni->cjobs;
3810 unix_to_nt_time(&time_nt, time_unix);
3811 d->changeid=time_nt.low;
3815 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
3816 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
3817 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
3818 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
3819 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
3820 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
3821 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
3822 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
3823 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
3824 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
3829 /*******************************************************************
3830 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
3831 ********************************************************************/
3832 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
3834 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
3839 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3841 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
3847 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
3849 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3855 if(!prs_uint32("level", ps, depth, &q_u->level))
3858 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3864 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3870 /*******************************************************************
3871 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
3872 ********************************************************************/
3873 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
3875 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
3881 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3887 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3890 if (!prs_uint32("status", ps, depth, &r_u->status))
3896 /*******************************************************************
3897 ********************************************************************/
3898 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
3900 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
3906 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3912 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3915 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3918 if (!prs_uint32("status", ps, depth, &r_u->status))
3924 /*******************************************************************
3925 ********************************************************************/
3926 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
3928 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
3934 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3936 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
3942 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
3944 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3950 if (!prs_uint32("level", ps, depth, &q_u->level))
3953 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3959 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3965 /*******************************************************************
3966 ********************************************************************/
3967 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
3969 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
3975 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3981 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3984 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3987 if (!prs_uint32("status", ps, depth, &r_u->status))
3993 /*******************************************************************
3994 ********************************************************************/
3995 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
3997 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
4003 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4005 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4011 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
4013 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
4019 if (!prs_uint32("level", ps, depth, &q_u->level))
4022 if(!new_spoolss_io_buffer("buffer", ps, depth, q_u->buffer))
4028 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4034 /*******************************************************************
4035 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
4036 ********************************************************************/
4037 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
4039 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
4045 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4047 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4053 if (!prs_uint32("level", ps, depth, &q_u->level))
4056 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4062 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4068 /*******************************************************************
4069 ********************************************************************/
4070 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
4072 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
4078 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4084 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4087 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4090 if (!prs_uint32("status", ps, depth, &r_u->status))
4096 /*******************************************************************
4097 ********************************************************************/
4098 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
4100 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
4105 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
4107 if(!prs_uint16s(False, "value", ps, depth, r_u->value, r_u->valuesize))
4109 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
4112 if(!prs_uint32("type", ps, depth, &r_u->type))
4115 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
4117 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
4119 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
4121 if(!prs_uint32("status", ps, depth, &r_u->status))
4127 /*******************************************************************
4128 ********************************************************************/
4129 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
4131 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
4136 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4138 if(!prs_uint32("index", ps, depth, &q_u->index))
4140 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
4142 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
4148 /*******************************************************************
4149 ********************************************************************/
4150 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u, POLICY_HND *hnd, uint32 idx, uint32 valuelen, uint32 datalen)
4152 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
4154 q_u->valuesize=valuelen;
4155 q_u->datasize=datalen;
4160 /*******************************************************************
4161 ********************************************************************/
4162 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
4164 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
4169 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4171 if(!smb_io_unistr2("", &(q_u->value), True, ps, depth))
4177 if(!prs_uint32("type", ps, depth, &(q_u->type)))
4180 if(!prs_uint32("max_len", ps, depth, &(q_u->max_len)))
4189 q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8));
4190 if(q_u->data == NULL)
4192 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
4199 if(!prs_uint32("real_len", ps, depth, &(q_u->real_len)))
4205 /*******************************************************************
4206 ********************************************************************/
4207 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
4209 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
4214 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4220 /*******************************************************************
4221 ********************************************************************/
4222 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
4223 uint32 type, const uint8 *data, uint32 len)
4225 DEBUG(5,("converting a specific param struct\n"));
4229 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
4232 ZERO_STRUCTP(*param);
4233 DEBUGADD(6,("Allocated a new PARAM struct\n"));
4235 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
4236 (*param)->type = type;
4238 /* le champ data n'est pas NULL termine */
4239 /* on stocke donc la longueur */
4241 (*param)->data_len=len;
4243 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
4244 if((*param)->data == NULL)
4247 memcpy((*param)->data, data, len);
4249 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
4254 /*******************************************************************
4255 ********************************************************************/
4256 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
4258 prs_debug(ps, depth, desc, "spoolss_io_addform");
4265 if(!prs_uint32("flags", ps, depth, &(f->flags)))
4267 if(!prs_uint32("name_ptr", ps, depth, &(f->name_ptr)))
4269 if(!prs_uint32("size_x", ps, depth, &(f->size_x)))
4271 if(!prs_uint32("size_y", ps, depth, &(f->size_y)))
4273 if(!prs_uint32("left", ps, depth, &(f->left)))
4275 if(!prs_uint32("top", ps, depth, &(f->top)))
4277 if(!prs_uint32("right", ps, depth, &(f->right)))
4279 if(!prs_uint32("bottom", ps, depth, &(f->bottom)))
4282 if(!smb_io_unistr2("", &(f->name), f->name_ptr, ps, depth))
4289 /*******************************************************************
4290 ********************************************************************/
4291 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
4293 uint32 useless_ptr=0;
4294 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
4299 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4301 if(!prs_uint32("level", ps, depth, &(q_u->level)))
4303 if(!prs_uint32("level2", ps, depth, &(q_u->level2)))
4308 if(!prs_uint32("useless_ptr", ps, depth, &(useless_ptr)))
4310 if(!spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth))
4317 /*******************************************************************
4318 ********************************************************************/
4319 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
4321 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
4326 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4332 /*******************************************************************
4333 ********************************************************************/
4334 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
4336 uint32 useless_ptr=0;
4337 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
4342 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4344 if(!smb_io_unistr2("", &(q_u->name), True, ps, depth))
4350 if(!prs_uint32("level", ps, depth, &(q_u->level)))
4352 if(!prs_uint32("level2", ps, depth, &(q_u->level2)))
4357 if(!prs_uint32("useless_ptr", ps, depth, &(useless_ptr)))
4359 if(!spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth))
4366 /*******************************************************************
4367 ********************************************************************/
4368 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
4370 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
4375 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4381 /*******************************************************************
4382 Parse a SPOOL_R_GETJOB structure.
4383 ********************************************************************/
4384 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
4386 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
4392 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4398 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4401 if (!prs_uint32("status", ps, depth, &r_u->status))
4407 /*******************************************************************
4408 Parse a SPOOL_Q_GETJOB structure.
4409 ********************************************************************/
4410 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
4412 prs_debug(ps, depth, desc, "");
4418 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
4420 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4422 if(!prs_uint32("level", ps, depth, &q_u->level))
4425 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4431 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4437 void free_devmode(DEVICEMODE *devmode)
4441 if (devmode->private!=NULL)
4442 free(devmode->private);
4447 void free_printer_info_2(PRINTER_INFO_2 *printer)
4451 free_devmode(printer->devmode);
4456 static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from)
4458 PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2));
4463 memcpy(copy, from, sizeof(*copy));
4473 void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries)
4475 void(*fn)(void*) = (void(*)(void*))&free_printer_info_2;
4476 free_void_array(num_entries, (void**)entries, *fn);
4479 PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
4480 const PRINTER_INFO_2 *prt)
4482 void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
4483 return (PRINTER_INFO_2*)add_copy_to_array(len,
4484 (void***)array, (const void*)prt, *fn, True);
4487 static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from)
4489 PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
4494 memcpy(copy, from, sizeof(*copy));
4504 void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries)
4506 void(*fn)(void*) = (void(*)(void*))&free;
4507 free_void_array(num_entries, (void**)entries, *fn);
4510 PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
4511 const PRINTER_INFO_1 *prt)
4513 void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
4514 return (PRINTER_INFO_1*)add_copy_to_array(len,
4515 (void***)array, (const void*)prt, *fn, True);
4518 static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from)
4520 JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
4525 memcpy(copy, from, sizeof(*copy));
4535 void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries)
4537 void(*fn)(void*) = (void(*)(void*))&free;
4538 free_void_array(num_entries, (void**)entries, *fn);
4541 JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
4542 const JOB_INFO_1 *job)
4544 void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
4545 return (JOB_INFO_1*)add_copy_to_array(len,
4546 (void***)array, (const void*)job, *fn, True);
4549 static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from)
4551 JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
4556 memcpy(copy, from, sizeof(*copy));
4566 void free_job_info_2(JOB_INFO_2 *job)
4570 free_devmode(job->devmode);
4575 void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries)
4577 void(*fn)(void*) = (void(*)(void*))&free_job_info_2;
4578 free_void_array(num_entries, (void**)entries, *fn);
4581 JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
4582 const JOB_INFO_2 *job)
4584 void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
4585 return (JOB_INFO_2*)add_copy_to_array(len,
4586 (void***)array, (const void*)job, *fn, True);