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.
8 * Copyright (C) Gerald Carter 2000
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 extern int DEBUGLEVEL;
29 /*******************************************************************
30 return the length of a UNISTR string.
31 ********************************************************************/
32 static uint32 str_len_uni(UNISTR *source)
36 if (!source->buffer) return 0;
38 while (source->buffer[i]!=0x0000)
45 /*******************************************************************
46 This should be moved in a more generic lib.
47 ********************************************************************/
48 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
50 if(!prs_uint16("year", ps, depth, &(systime->year)))
52 if(!prs_uint16("month", ps, depth, &(systime->month)))
54 if(!prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)))
56 if(!prs_uint16("day", ps, depth, &(systime->day)))
58 if(!prs_uint16("hour", ps, depth, &(systime->hour)))
60 if(!prs_uint16("minute", ps, depth, &(systime->minute)))
62 if(!prs_uint16("second", ps, depth, &(systime->second)))
64 if(!prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)))
70 /*******************************************************************
71 ********************************************************************/
72 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
74 systime->year=unixtime->tm_year+1900;
75 systime->month=unixtime->tm_mon+1;
76 systime->dayofweek=unixtime->tm_wday;
77 systime->day=unixtime->tm_mday;
78 systime->hour=unixtime->tm_hour;
79 systime->minute=unixtime->tm_min;
80 systime->second=unixtime->tm_sec;
81 systime->milliseconds=0;
86 /*******************************************************************
87 reads or writes an DOC_INFO structure.
88 ********************************************************************/
89 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
91 if (info_1 == NULL) return False;
93 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
99 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
101 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
103 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
106 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
108 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
110 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
116 /*******************************************************************
117 reads or writes an DOC_INFO structure.
118 ********************************************************************/
119 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
121 uint32 useless_ptr=0;
123 if (info == NULL) return False;
125 prs_debug(ps, depth, desc, "smb_io_doc_info");
131 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
134 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
137 switch (info->switch_value)
140 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
145 this is just a placeholder
147 MSDN July 1998 says doc_info_2 is only on
148 Windows 95, and as Win95 doesn't do RPC to print
149 this case is nearly impossible
151 Maybe one day with Windows for dishwasher 2037 ...
154 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
157 DEBUG(0,("Something is obviously wrong somewhere !\n"));
164 /*******************************************************************
165 reads or writes an DOC_INFO_CONTAINER structure.
166 ********************************************************************/
167 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
169 if (cont == NULL) return False;
171 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
177 if(!prs_uint32("level", ps, depth, &cont->level))
180 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
186 /*******************************************************************
187 reads or writes an NOTIFY OPTION TYPE structure.
188 ********************************************************************/
189 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
191 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
197 if(!prs_uint16("type", ps, depth, &type->type))
199 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
201 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
203 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
205 if(!prs_uint32("count", ps, depth, &type->count))
207 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
213 /*******************************************************************
214 reads or writes an NOTIFY OPTION TYPE DATA.
215 ********************************************************************/
216 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
220 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
223 /* if there are no fields just return */
224 if (type->fields_ptr==0)
230 if(!prs_uint32("count2", ps, depth, &type->count2))
233 if (type->count2 != type->count)
234 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
236 /* parse the option type data */
237 for(i=0;i<type->count2;i++)
238 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
243 /*******************************************************************
244 reads or writes an NOTIFY OPTION structure.
245 ********************************************************************/
246 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
250 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
253 if(!prs_uint32("count", ps, depth, &ctr->count))
257 if (UNMARSHALLING(ps))
258 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)malloc(ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
261 /* the option type struct */
262 for(i=0;i<ctr->count;i++)
263 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
266 /* the type associated with the option type struct */
267 for(i=0;i<ctr->count;i++)
268 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
274 /*******************************************************************
275 reads or writes an NOTIFY OPTION structure.
276 ********************************************************************/
277 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
279 prs_debug(ps, depth, desc, "smb_io_notify_option");
282 if(!prs_uint32("version", ps, depth, &option->version))
284 if(!prs_uint32("flags", ps, depth, &option->flags))
286 if(!prs_uint32("count", ps, depth, &option->count))
288 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
291 /* marshalling or unmarshalling, that would work */
292 if (option->option_type_ptr!=0) {
293 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
297 option->ctr.type=NULL;
304 /*******************************************************************
305 reads or writes an NOTIFY INFO DATA structure.
306 ********************************************************************/
307 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
309 uint32 useless_ptr=0xADDE0FF0;
311 uint32 how_many_words;
315 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
318 how_many_words=data->size;
319 if (how_many_words==POINTER) {
320 how_many_words=TWO_VALUE;
323 isvalue=data->enc_type;
327 if(!prs_uint16("type", ps, depth, &data->type))
329 if(!prs_uint16("field", ps, depth, &data->field))
333 if(!prs_uint32("how many words", ps, depth, &how_many_words))
335 if(!prs_uint32("id", ps, depth, &data->id))
337 if(!prs_uint32("how many words", ps, depth, &how_many_words))
344 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
346 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
351 /* length in ascii including \0 */
352 x=2*(data->notify_data.data.length+1);
353 if(!prs_uint32("string length", ps, depth, &x ))
355 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
363 /*******************************************************************
364 reads or writes an NOTIFY INFO DATA structure.
365 ********************************************************************/
366 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
367 prs_struct *ps, int depth)
372 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
378 isvalue=data->enc_type;
380 if (isvalue==False) {
381 /* length of string in unicode include \0 */
382 x=data->notify_data.data.length+1;
383 if(!prs_uint32("string length", ps, depth, &x ))
385 if(!prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x))
394 /*******************************************************************
395 reads or writes an NOTIFY INFO structure.
396 ********************************************************************/
397 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
401 prs_debug(ps, depth, desc, "smb_io_notify_info");
407 if(!prs_uint32("count", ps, depth, &info->count))
409 if(!prs_uint32("version", ps, depth, &info->version))
411 if(!prs_uint32("flags", ps, depth, &info->flags))
413 if(!prs_uint32("count", ps, depth, &info->count))
416 for (i=0;i<info->count;i++) {
417 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
421 /* now do the strings at the end of the stream */
422 for (i=0;i<info->count;i++) {
423 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
431 /*******************************************************************
432 ********************************************************************/
433 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
435 prs_debug(ps, depth, desc, "");
444 if (!prs_uint32("size", ps, depth, &q_u->size))
446 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
448 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
450 if (!prs_uint32("build", ps, depth, &q_u->build))
452 if (!prs_uint32("major", ps, depth, &q_u->major))
454 if (!prs_uint32("minor", ps, depth, &q_u->minor))
456 if (!prs_uint32("processor", ps, depth, &q_u->processor))
459 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
463 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
469 /*******************************************************************
470 ********************************************************************/
471 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
476 prs_debug(ps, depth, desc, "spool_io_user_level");
481 if (!prs_uint32("level", ps, depth, &q_u->level))
483 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
486 switch (q_u->level) {
488 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
498 /*******************************************************************
499 * read or write a DEVICEMODE struct.
500 * on reading allocate memory for the private member
501 ********************************************************************/
502 static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
504 prs_debug(ps, depth, desc, "spoolss_io_devmode");
507 if (UNMARSHALLING(ps)) {
508 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
509 if (devmode->devicename.buffer == NULL)
513 if (!prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
515 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
517 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
519 if (!prs_uint16("size", ps, depth, &devmode->size))
521 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
523 if (!prs_uint32("fields", ps, depth, &devmode->fields))
525 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
527 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
529 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
531 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
533 if (!prs_uint16("scale", ps, depth, &devmode->scale))
535 if (!prs_uint16("copies", ps, depth, &devmode->copies))
537 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
539 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
541 if (!prs_uint16("color", ps, depth, &devmode->color))
543 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
545 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
547 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
549 if (!prs_uint16("collate", ps, depth, &devmode->collate))
552 if (UNMARSHALLING(ps)) {
553 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
554 if (devmode->formname.buffer == NULL)
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) {
590 if (UNMARSHALLING(ps)) {
591 devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8));
592 if(devmode->private == NULL)
594 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
597 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
598 if (!prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra))
605 void free_spoolss_devmode(DEVICEMODE *devmode)
610 safe_free(devmode->private);
614 /*******************************************************************
615 Read or write a DEVICEMODE container
616 ********************************************************************/
617 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
622 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
628 if (!prs_uint32("size", ps, depth, &dm_c->size))
631 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
634 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
635 if (UNMARSHALLING(ps))
636 /* if while reading there is no DEVMODE ... */
641 /* so we have a DEVICEMODE to follow */
642 if (UNMARSHALLING(ps)) {
643 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
644 dm_c->devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE));
645 if(dm_c->devmode == NULL)
647 ZERO_STRUCTP(dm_c->devmode);
650 /* this is bad code, shouldn't be there */
651 if (!prs_uint32("size", ps, depth, &dm_c->size))
654 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
660 /*******************************************************************
661 ********************************************************************/
662 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
667 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
670 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
673 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
679 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
682 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
688 /*******************************************************************
690 ********************************************************************/
691 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
692 const fstring printername,
693 const fstring datatype,
694 uint32 access_required,
695 const fstring clientname,
696 const fstring user_name)
698 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
699 q_u->printername_ptr = (printername!=NULL)?1:0;
700 init_unistr2(&q_u->printername, printername, strlen(printername));
702 q_u->printer_default.datatype_ptr = 0;
704 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
705 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
707 q_u->printer_default.devmode_cont.size=0;
708 q_u->printer_default.devmode_cont.devmode_ptr=0;
709 q_u->printer_default.devmode_cont.devmode=NULL;
710 q_u->printer_default.access_required=access_required;
712 q_u->user_ctr.level=1;
714 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
715 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
716 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
717 q_u->user_ctr.user1.build=1381;
718 q_u->user_ctr.user1.major=2;
719 q_u->user_ctr.user1.minor=0;
720 q_u->user_ctr.user1.processor=0;
721 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
722 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
727 /*******************************************************************
729 ********************************************************************/
730 BOOL make_spoolss_q_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name,
731 const char* clientname, const char* user_name,
732 uint32 level, PRINTER_INFO_2 *info)
734 DEBUG(5,("make_spoolss_q_addprinterex\n"));
736 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
737 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
741 q_u->info.level = level;
742 q_u->info.info_ptr = (info!=NULL)?1:0;
746 /* init q_u->info.info2 from *info */
747 if (!make_spool_printer_info_2( &q_u->info.info_2, info))
749 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
757 q_u->unk0 = q_u->unk1 = q_u->unk2 = q_u->unk3 = 0;
761 q_u->user_ctr.level=1;
763 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
764 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
765 q_u->user_ctr.user1.build=1381;
766 q_u->user_ctr.user1.major=2;
767 q_u->user_ctr.user1.minor=0;
768 q_u->user_ctr.user1.processor=0;
769 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
770 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
771 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
772 q_u->user_ctr.user1.client_name.uni_str_len + 2;
777 /*******************************************************************
778 free dynamically allocated members
779 ********************************************************************/
780 void free_spoolss_q_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u)
782 switch (q_u->info.level)
785 if (q_u->info.info_1 != NULL)
787 free(q_u->info.info_1);
788 q_u->info.info_1 = NULL;
792 if (q_u->info.info_2 != NULL)
794 free(q_u->info.info_2);
795 q_u->info.info_2 = NULL;
799 if (q_u->info.info_3 != NULL)
801 free(q_u->info.info_3);
802 q_u->info.info_3 = NULL;
811 /*******************************************************************
812 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
813 *******************************************************************/
814 BOOL make_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
815 PRINTER_INFO_2 *info)
818 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
820 /* allocate the necessary memory */
821 inf = (SPOOL_PRINTER_INFO_LEVEL_2*)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
822 if (spool_info2 == NULL)
824 DEBUG(0,("make_spool_printer_info_2: Unable to malloc SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
830 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
831 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
832 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
833 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
834 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
835 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
836 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
837 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
838 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
839 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
840 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
841 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
842 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
843 inf->attributes = info->attributes;
844 inf->priority = info->priority;
845 inf->default_priority = info->defaultpriority;
846 inf->starttime = info->starttime;
847 inf->untiltime = info->untiltime;
848 inf->cjobs = info->cjobs;
849 inf->averageppm = info->averageppm;
850 init_unistr2_from_unistr(&inf->servername, &info->servername);
851 init_unistr2_from_unistr(&inf->printername, &info->printername);
852 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
853 init_unistr2_from_unistr(&inf->portname, &info->portname);
854 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
855 init_unistr2_from_unistr(&inf->comment, &info->comment);
856 init_unistr2_from_unistr(&inf->location, &info->location);
857 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
858 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
859 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
860 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
861 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
869 /*******************************************************************
871 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
872 ********************************************************************/
873 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
878 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
884 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
886 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
892 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
895 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
897 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
903 void free_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u)
905 free_spoolss_devmode(q_u->printer_default.devmode_cont.devmode);
908 /*******************************************************************
910 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
911 * called from spoolss_open_printer_ex (cli_spoolss.c)
912 ********************************************************************/
913 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
915 if (r_u == NULL) return False;
917 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
923 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
926 if (!prs_uint32("status code", ps, depth, &(r_u->status)))
932 /*******************************************************************
934 ********************************************************************/
935 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
936 const POLICY_HND *handle,
937 UNISTR2 *valuename, uint32 size)
939 if (q_u == NULL) return False;
941 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
943 q_u->handle = *handle;
944 copy_unistr2(&q_u->valuename, valuename);
951 /*******************************************************************
953 * called from spoolss_q_getprinterdata (srv_spoolss.c)
954 ********************************************************************/
955 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
960 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
965 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
969 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
973 if (!prs_uint32("size", ps, depth, &(q_u->size)))
979 /*******************************************************************
981 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
982 ********************************************************************/
983 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
988 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
993 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
997 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
1003 /*******************************************************************
1004 * write a structure.
1005 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1006 ********************************************************************/
1007 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1009 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1011 if(!prs_uint32("status", ps, depth, &r_u->status))
1017 /*******************************************************************
1018 * write a structure.
1019 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1020 ********************************************************************/
1021 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1026 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1031 if (!prs_uint32("type", ps, depth, &r_u->type))
1033 if (!prs_uint32("size", ps, depth, &r_u->size))
1036 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1042 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1044 if (!prs_uint32("status", ps, depth, &r_u->status))
1050 /*******************************************************************
1052 ********************************************************************/
1053 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1055 if (q_u == NULL) return False;
1057 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1059 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
1064 /*******************************************************************
1066 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1067 * called from spoolss_abortprinter (cli_spoolss.c)
1068 ********************************************************************/
1069 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1071 if (q_u == NULL) return False;
1073 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1079 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1085 /*******************************************************************
1086 * write a structure.
1087 * called from spoolss_r_abortprinter (srv_spoolss.c)
1088 ********************************************************************/
1089 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1091 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1093 if(!prs_uint32("status", ps, depth, &r_u->status))
1099 /*******************************************************************
1101 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1102 * called from spoolss_deleteprinter (cli_spoolss.c)
1103 ********************************************************************/
1104 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1106 if (q_u == NULL) return False;
1108 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1114 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1120 /*******************************************************************
1121 * write a structure.
1122 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1123 * called from spoolss_deleteprinter (cli_spoolss.c)
1124 ********************************************************************/
1125 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1127 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1133 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1135 if (!prs_uint32("status", ps, depth, &r_u->status))
1142 /*******************************************************************
1144 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1145 * called from spoolss_closeprinter (cli_spoolss.c)
1146 ********************************************************************/
1147 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1149 if (q_u == NULL) return False;
1151 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1157 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1163 /*******************************************************************
1164 * write a structure.
1165 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1166 * called from spoolss_closeprinter (cli_spoolss.c)
1167 ********************************************************************/
1168 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1170 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1176 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1178 if (!prs_uint32("status", ps, depth, &r_u->status))
1184 /*******************************************************************
1186 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1187 ********************************************************************/
1188 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1190 if (q_u == NULL) return False;
1192 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1198 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1201 if(!smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth))
1207 /*******************************************************************
1208 * write a structure.
1209 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1210 ********************************************************************/
1211 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1213 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1215 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1217 if(!prs_uint32("status", ps, depth, &r_u->status))
1223 /*******************************************************************
1225 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1226 ********************************************************************/
1227 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1229 if (q_u == NULL) return False;
1231 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1237 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1243 /*******************************************************************
1244 * write a structure.
1245 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1246 ********************************************************************/
1247 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1249 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1251 if(!prs_uint32("status", ps, depth, &r_u->status))
1257 /*******************************************************************
1259 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1260 ********************************************************************/
1261 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1263 if (q_u == NULL) return False;
1265 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1271 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1277 /*******************************************************************
1278 * write a structure.
1279 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1280 ********************************************************************/
1281 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1283 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1285 if(!prs_uint32("status", ps, depth, &r_u->status))
1291 /*******************************************************************
1293 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1294 ********************************************************************/
1295 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1297 if (q_u == NULL) return False;
1299 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1305 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1311 /*******************************************************************
1312 * write a structure.
1313 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1314 ********************************************************************/
1315 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1317 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1319 if(!prs_uint32("status", ps, depth, &r_u->status))
1325 /*******************************************************************
1327 * called from spoolss_q_writeprinter (srv_spoolss.c)
1328 ********************************************************************/
1329 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1331 if (q_u == NULL) return False;
1333 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1339 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1341 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1344 if (q_u->buffer_size!=0)
1346 q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8));
1347 if(q_u->buffer == NULL)
1349 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1354 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1360 /*******************************************************************
1361 * write a structure.
1362 * called from spoolss_r_writeprinter (srv_spoolss.c)
1363 ********************************************************************/
1364 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1366 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1368 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1370 if(!prs_uint32("status", ps, depth, &r_u->status))
1376 /*******************************************************************
1378 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1379 ********************************************************************/
1380 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1382 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1388 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1390 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1392 if(!prs_uint32("options", ps, depth, &q_u->options))
1394 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1396 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1402 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1405 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1408 if (q_u->option_ptr!=0) {
1410 if (UNMARSHALLING(ps))
1411 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1414 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1421 /*******************************************************************
1422 * write a structure.
1423 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1424 ********************************************************************/
1425 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1427 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1430 if(!prs_uint32("status", ps, depth, &r_u->status))
1436 /*******************************************************************
1438 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1439 ********************************************************************/
1440 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1442 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1448 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1451 if(!prs_uint32("change", ps, depth, &q_u->change))
1454 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1457 if (q_u->option_ptr!=0) {
1459 if (UNMARSHALLING(ps))
1460 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1463 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1470 /*******************************************************************
1471 * write a structure.
1472 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1473 ********************************************************************/
1474 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1476 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1482 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1485 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1490 if(!prs_uint32("status", ps, depth, &r_u->status))
1496 /*******************************************************************
1497 * return the length of a uint16 (obvious, but the code is clean)
1498 ********************************************************************/
1499 static uint32 size_of_uint16(uint16 *value)
1501 return (sizeof(*value));
1504 /*******************************************************************
1505 * return the length of a uint32 (obvious, but the code is clean)
1506 ********************************************************************/
1507 static uint32 size_of_uint32(uint32 *value)
1509 return (sizeof(*value));
1511 /*******************************************************************
1512 * return the length of a NTTIME (obvious, but the code is clean)
1513 ********************************************************************/
1514 static uint32 size_of_nttime(NTTIME *value)
1516 return (sizeof(*value));
1519 /*******************************************************************
1520 * return the length of a UNICODE string in number of char, includes:
1521 * - the leading zero
1522 * - the relative pointer size
1523 ********************************************************************/
1524 static uint32 size_of_relative_string(UNISTR *string)
1528 size=str_len_uni(string); /* the string length */
1529 size=size+1; /* add the leading zero */
1530 size=size*2; /* convert in char */
1531 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1532 size += ((4 - (size & 3)) & 3);
1533 size=size+4; /* add the size of the ptr */
1538 /*******************************************************************
1539 * return the length of a uint32 (obvious, but the code is clean)
1540 ********************************************************************/
1541 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1546 return (4+devmode->size+devmode->driverextra);
1549 /*******************************************************************
1550 * return the length of a uint32 (obvious, but the code is clean)
1551 ********************************************************************/
1552 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1557 return (sizeof(SYSTEMTIME) +4);
1560 /*******************************************************************
1561 * write a UNICODE string.
1562 * used by all the RPC structs passing a buffer
1563 ********************************************************************/
1564 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1569 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1572 /* there should be no align here as it can mess up
1573 parsing a NEW_BUFFER->prs */
1579 if (!prs_unistr("unistr", ps, depth, uni))
1586 /*******************************************************************
1587 * write a UNICODE string and its relative pointer.
1588 * used by all the RPC structs passing a buffer
1590 * As I'm a nice guy, I'm forcing myself to explain this code.
1591 * MS did a good job in the overall spoolss code except in some
1592 * functions where they are passing the API buffer directly in the
1593 * RPC request/reply. That's to maintain compatiility at the API level.
1594 * They could have done it the good way the first time.
1596 * So what happen is: the strings are written at the buffer's end,
1597 * in the reverse order of the original structure. Some pointers to
1598 * the strings are also in the buffer. Those are relative to the
1601 * If you don't understand or want to change that function,
1602 * first get in touch with me: jfm@samba.org
1604 ********************************************************************/
1605 static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1607 prs_struct *ps=&buffer->prs;
1609 if (MARSHALLING(ps)) {
1610 uint32 struct_offset = prs_offset(ps);
1611 uint32 relative_offset;
1613 buffer->string_at_end -= (size_of_relative_string(string) - 4);
1614 if(!prs_set_offset(ps, buffer->string_at_end))
1618 buffer->string_at_end = prs_offset(ps);
1620 /* write the string */
1621 if (!smb_io_unistr(desc, string, ps, depth))
1624 if(!prs_set_offset(ps, struct_offset))
1627 relative_offset=buffer->string_at_end - buffer->struct_start;
1628 /* write its offset */
1629 if (!prs_uint32("offset", ps, depth, &relative_offset))
1635 /* read the offset */
1636 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1639 old_offset = prs_offset(ps);
1640 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1643 /* read the string */
1644 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1647 if(!prs_set_offset(ps, old_offset))
1654 /*******************************************************************
1655 * write a array of UNICODE strings and its relative pointer.
1656 * used by 2 RPC structs
1657 ********************************************************************/
1658 static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1662 prs_struct *ps=&buffer->prs;
1664 if (MARSHALLING(ps)) {
1665 uint32 struct_offset = prs_offset(ps);
1666 uint32 relative_offset;
1673 /* first write the last 0 */
1674 buffer->string_at_end -= 2;
1675 if(!prs_set_offset(ps, buffer->string_at_end))
1678 if(!prs_uint16("leading zero", ps, depth, &zero))
1681 while (p && (*p!=0)) {
1685 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
1686 if (chaine.buffer == NULL)
1689 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1691 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1693 if(!prs_set_offset(ps, buffer->string_at_end)) {
1694 free(chaine.buffer);
1698 /* write the string */
1699 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth)) {
1700 free(chaine.buffer);
1706 free(chaine.buffer);
1709 if(!prs_set_offset(ps, struct_offset))
1712 relative_offset=buffer->string_at_end - buffer->struct_start;
1713 /* write its offset */
1714 if (!prs_uint32("offset", ps, depth, &relative_offset))
1719 uint16 *chaine2=NULL;
1725 /* read the offset */
1726 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1729 old_offset = prs_offset(ps);
1730 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1734 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1737 l_chaine=str_len_uni(&chaine);
1739 /* we're going to add two more bytes here in case this
1740 is the last string in the array and we need to add
1741 an extra NULL for termination */
1744 if((chaine2=(uint16 *)Realloc(chaine2, (l_chaine2+l_chaine+2)*sizeof(uint16))) == NULL)
1746 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1747 l_chaine2+=l_chaine+1;
1750 } while(l_chaine!=0);
1752 /* the end should be bould NULL terminated so add
1753 the second one here */
1756 chaine2[l_chaine2] = '\0';
1760 if(!prs_set_offset(ps, old_offset))
1767 /*******************************************************************
1768 Parse a DEVMODE structure and its relative pointer.
1769 ********************************************************************/
1770 static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth,
1773 prs_struct *ps= &buffer->prs;
1775 prs_debug(ps, depth, desc, "new_smb_io_relsecdesc");
1778 if (MARSHALLING(ps)) {
1779 uint32 struct_offset = prs_offset(ps);
1780 uint32 relative_offset;
1783 relative_offset = 0;
1784 if (!prs_uint32("offset", ps, depth, &relative_offset))
1789 if (*secdesc != NULL) {
1790 buffer->string_at_end -= sec_desc_size(*secdesc);
1792 if(!prs_set_offset(ps, buffer->string_at_end))
1794 /* write the secdesc */
1795 if (!sec_io_desc(desc, secdesc, ps, depth))
1798 if(!prs_set_offset(ps, struct_offset))
1802 relative_offset=buffer->string_at_end - buffer->struct_start;
1803 /* write its offset */
1805 if (!prs_uint32("offset", ps, depth, &relative_offset))
1810 /* read the offset */
1811 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1814 old_offset = prs_offset(ps);
1815 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1819 if (!sec_io_desc(desc, secdesc, ps, depth))
1822 if(!prs_set_offset(ps, old_offset))
1828 /*******************************************************************
1829 Parse a DEVMODE structure and its relative pointer.
1830 ********************************************************************/
1831 static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1833 prs_struct *ps=&buffer->prs;
1835 prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
1838 if (MARSHALLING(ps)) {
1839 uint32 struct_offset = prs_offset(ps);
1840 uint32 relative_offset;
1842 if (*devmode == NULL) {
1844 if (!prs_uint32("offset", ps, depth, &relative_offset))
1846 DEBUG(8, ("boing, the devmode was NULL\n"));
1851 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1853 if(!prs_set_offset(ps, buffer->string_at_end))
1856 /* write the DEVMODE */
1857 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1860 if(!prs_set_offset(ps, struct_offset))
1863 relative_offset=buffer->string_at_end - buffer->struct_start;
1864 /* write its offset */
1865 if (!prs_uint32("offset", ps, depth, &relative_offset))
1871 /* read the offset */
1872 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1875 old_offset = prs_offset(ps);
1876 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1879 /* read the string */
1880 if((*devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL)
1882 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1885 if(!prs_set_offset(ps, old_offset))
1892 /*******************************************************************
1893 Parse a PRINTER_INFO_0 structure.
1894 ********************************************************************/
1895 BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1897 prs_struct *ps=&buffer->prs;
1899 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1902 buffer->struct_start=prs_offset(ps);
1904 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1906 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1909 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1911 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1913 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1916 if(!prs_uint16("year", ps, depth, &info->year))
1918 if(!prs_uint16("month", ps, depth, &info->month))
1920 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1922 if(!prs_uint16("day", ps, depth, &info->day))
1924 if(!prs_uint16("hour", ps, depth, &info->hour))
1926 if(!prs_uint16("minute", ps, depth, &info->minute))
1928 if(!prs_uint16("second", ps, depth, &info->second))
1930 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1933 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1935 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1938 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1940 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1942 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1944 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1946 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1948 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1950 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1952 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1954 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1956 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1958 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1960 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
1962 if(!prs_uint32("change_id", ps, depth, &info->change_id))
1964 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
1966 if(!prs_uint32("status" , ps, depth, &info->status))
1968 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
1970 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
1972 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
1974 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
1976 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
1978 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
1980 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
1982 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
1984 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
1986 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
1992 /*******************************************************************
1993 Parse a PRINTER_INFO_1 structure.
1994 ********************************************************************/
1995 BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
1997 prs_struct *ps=&buffer->prs;
1999 prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
2002 buffer->struct_start=prs_offset(ps);
2004 if (!prs_uint32("flags", ps, depth, &info->flags))
2006 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
2008 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2010 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
2016 /*******************************************************************
2017 Parse a PRINTER_INFO_2 structure.
2018 ********************************************************************/
2019 BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2021 prs_struct *ps=&buffer->prs;
2023 prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
2026 buffer->struct_start=prs_offset(ps);
2028 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
2030 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
2032 if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
2034 if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
2036 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
2038 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
2040 if (!new_smb_io_relstr("location", buffer, depth, &info->location))
2043 /* NT parses the DEVMODE at the end of the struct */
2044 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2047 if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2049 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2051 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
2053 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
2056 if (!new_smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2059 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2061 if (!prs_uint32("priority", ps, depth, &info->priority))
2063 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2065 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2067 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2069 if (!prs_uint32("status", ps, depth, &info->status))
2071 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2073 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2077 if (!prs_uint32_post("secdesc_ptr", ps, depth, NULL, sec_offset, info->secdesc ? prs_offset(ps)-buffer->struct_start : 0 ))
2080 if (!sec_io_desc("secdesc", &info->secdesc, ps, depth))
2086 /*******************************************************************
2087 Parse a PRINTER_INFO_3 structure.
2088 ********************************************************************/
2089 BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2091 prs_struct *ps=&buffer->prs;
2093 prs_debug(ps, depth, desc, "new_smb_io_printer_info_3");
2096 buffer->struct_start=prs_offset(ps);
2098 if (!prs_uint32("flags", ps, depth, &info->flags))
2100 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2106 /*******************************************************************
2107 Parse a PORT_INFO_1 structure.
2108 ********************************************************************/
2109 BOOL new_smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2111 prs_struct *ps=&buffer->prs;
2113 prs_debug(ps, depth, desc, "new_smb_io_port_info_1");
2116 buffer->struct_start=prs_offset(ps);
2118 if (!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2124 /*******************************************************************
2125 Parse a PORT_INFO_2 structure.
2126 ********************************************************************/
2127 BOOL new_smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2129 prs_struct *ps=&buffer->prs;
2131 prs_debug(ps, depth, desc, "new_smb_io_port_info_2");
2134 buffer->struct_start=prs_offset(ps);
2136 if (!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2138 if (!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2140 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
2142 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2144 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2150 /*******************************************************************
2151 Parse a DRIVER_INFO_1 structure.
2152 ********************************************************************/
2153 BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2155 prs_struct *ps=&buffer->prs;
2157 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
2160 buffer->struct_start=prs_offset(ps);
2162 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2169 /*******************************************************************
2170 Parse a DRIVER_INFO_2 structure.
2171 ********************************************************************/
2172 BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2174 prs_struct *ps=&buffer->prs;
2176 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
2179 buffer->struct_start=prs_offset(ps);
2181 if (!prs_uint32("version", ps, depth, &info->version))
2183 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2185 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
2187 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2189 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
2191 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
2198 /*******************************************************************
2199 Parse a DRIVER_INFO_3 structure.
2200 ********************************************************************/
2201 BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2203 prs_struct *ps=&buffer->prs;
2205 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
2208 buffer->struct_start=prs_offset(ps);
2210 if (!prs_uint32("version", ps, depth, &info->version))
2212 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2214 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
2216 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2218 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
2220 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
2222 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2225 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2228 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2230 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2236 /*******************************************************************
2237 Parse a DRIVER_INFO_6 structure.
2238 ********************************************************************/
2239 BOOL new_smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2241 prs_struct *ps=&buffer->prs;
2243 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_6");
2246 buffer->struct_start=prs_offset(ps);
2248 if (!prs_uint32("version", ps, depth, &info->version))
2250 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2252 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
2254 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2256 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
2258 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
2260 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2263 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2266 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2268 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2271 if (!new_smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2274 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2276 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2279 if (!prs_uint32("padding", ps, depth, &info->padding))
2282 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2285 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2288 if (!new_smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2290 if (!new_smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2292 if (!new_smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2294 if (!new_smb_io_relstr("provider", buffer, depth, &info->provider))
2301 /*******************************************************************
2302 Parse a JOB_INFO_1 structure.
2303 ********************************************************************/
2304 BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2306 prs_struct *ps=&buffer->prs;
2308 prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
2311 buffer->struct_start=prs_offset(ps);
2313 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2315 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
2317 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
2319 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
2321 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
2323 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
2325 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
2327 if (!prs_uint32("status", ps, depth, &info->status))
2329 if (!prs_uint32("priority", ps, depth, &info->priority))
2331 if (!prs_uint32("position", ps, depth, &info->position))
2333 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2335 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2337 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2343 /*******************************************************************
2344 Parse a JOB_INFO_2 structure.
2345 ********************************************************************/
2346 BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2349 prs_struct *ps=&buffer->prs;
2351 prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
2354 buffer->struct_start=prs_offset(ps);
2356 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2358 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
2360 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
2362 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
2364 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
2366 if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2368 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
2371 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2373 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
2375 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
2377 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2379 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
2382 /* SEC_DESC sec_desc;*/
2383 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2386 if (!prs_uint32("status",ps, depth, &info->status))
2388 if (!prs_uint32("priority",ps, depth, &info->priority))
2390 if (!prs_uint32("position",ps, depth, &info->position))
2392 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2394 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2396 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2398 if (!prs_uint32("size",ps, depth, &info->size))
2400 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2402 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2404 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2410 /*******************************************************************
2411 ********************************************************************/
2412 BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2414 prs_struct *ps=&buffer->prs;
2416 prs_debug(ps, depth, desc, "new_smb_io_form_1");
2419 buffer->struct_start=prs_offset(ps);
2421 if (!prs_uint32("flag", ps, depth, &info->flag))
2424 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2427 if (!prs_uint32("width", ps, depth, &info->width))
2429 if (!prs_uint32("length", ps, depth, &info->length))
2431 if (!prs_uint32("left", ps, depth, &info->left))
2433 if (!prs_uint32("top", ps, depth, &info->top))
2435 if (!prs_uint32("right", ps, depth, &info->right))
2437 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2443 /*******************************************************************
2444 Read/write a BUFFER struct.
2445 ********************************************************************/
2446 static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER *buffer)
2451 prs_debug(ps, depth, desc, "new_spoolss_io_buffer");
2454 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2458 if (UNMARSHALLING(ps)) {
2460 buffer->string_at_end=0;
2462 if (buffer->ptr==0) {
2463 if (!prs_init(&buffer->prs, 0, 4, prs_get_mem_context(ps), UNMARSHALL))
2468 if (!prs_uint32("size", ps, depth, &buffer->size))
2471 if (!prs_init(&buffer->prs, buffer->size, 4, prs_get_mem_context(ps), UNMARSHALL))
2474 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2477 if (!prs_set_offset(&buffer->prs, 0))
2480 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2483 buffer->string_at_end=buffer->size;
2492 if (!prs_uint32("size", ps, depth, &buffer->size))
2494 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2501 /*******************************************************************
2502 move a BUFFER from the query to the reply.
2503 ********************************************************************/
2504 void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2506 prs_switch_type(&src->prs, MARSHALL);
2507 if(!prs_set_offset(&src->prs, 0))
2509 prs_force_dynamic(&(src->prs));
2514 /*******************************************************************
2515 create a BUFFER struct.
2516 ********************************************************************/
2517 BOOL new_spoolss_allocate_buffer(NEW_BUFFER **buffer)
2522 if((*buffer=(NEW_BUFFER *)malloc(sizeof(NEW_BUFFER))) == NULL) {
2523 DEBUG(0,("new_spoolss_allocate_buffer: malloc fail for size %u.\n",
2524 (unsigned int)sizeof(NEW_BUFFER) ));
2530 (*buffer)->string_at_end=0;
2534 /*******************************************************************
2535 Destroy a BUFFER struct.
2536 ********************************************************************/
2537 void new_spoolss_free_buffer(NEW_BUFFER *buffer)
2542 prs_mem_free(&buffer->prs);
2545 buffer->string_at_end=0;
2550 /*******************************************************************
2551 Get the size of a BUFFER struct.
2552 ********************************************************************/
2553 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2555 return (buffer->size);
2559 /*******************************************************************
2560 Parse a DRIVER_DIRECTORY_1 structure.
2561 ********************************************************************/
2562 BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2564 prs_struct *ps=&buffer->prs;
2566 prs_debug(ps, depth, desc, "new_smb_io_driverdir_1");
2569 buffer->struct_start=prs_offset(ps);
2571 if (!smb_io_unistr(desc, &info->name, ps, depth))
2577 /*******************************************************************
2578 Parse a PORT_INFO_1 structure.
2579 ********************************************************************/
2580 BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2582 prs_struct *ps=&buffer->prs;
2584 prs_debug(ps, depth, desc, "new_smb_io_port_1");
2587 buffer->struct_start=prs_offset(ps);
2589 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2595 /*******************************************************************
2596 Parse a PORT_INFO_2 structure.
2597 ********************************************************************/
2598 BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2600 prs_struct *ps=&buffer->prs;
2602 prs_debug(ps, depth, desc, "new_smb_io_port_2");
2605 buffer->struct_start=prs_offset(ps);
2607 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2609 if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2611 if(!new_smb_io_relstr("description", buffer, depth, &info->description))
2613 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2615 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2622 /*******************************************************************
2623 ********************************************************************/
2624 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2626 prs_struct *ps=&buffer->prs;
2628 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2631 buffer->struct_start=prs_offset(ps);
2633 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2639 /*******************************************************************
2640 ********************************************************************/
2641 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2643 prs_struct *ps=&buffer->prs;
2645 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2648 buffer->struct_start=prs_offset(ps);
2650 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2656 /*******************************************************************
2657 ********************************************************************/
2658 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2660 prs_struct *ps=&buffer->prs;
2662 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2665 buffer->struct_start=prs_offset(ps);
2667 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2673 /*******************************************************************
2674 ********************************************************************/
2675 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2677 prs_struct *ps=&buffer->prs;
2679 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2682 buffer->struct_start=prs_offset(ps);
2684 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2686 if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
2688 if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2694 /*******************************************************************
2695 return the size required by a struct in the stream
2696 ********************************************************************/
2697 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2701 size+=size_of_relative_string( &info->printername );
2702 size+=size_of_relative_string( &info->servername );
2704 size+=size_of_uint32( &info->cjobs);
2705 size+=size_of_uint32( &info->total_jobs);
2706 size+=size_of_uint32( &info->total_bytes);
2708 size+=size_of_uint16( &info->year);
2709 size+=size_of_uint16( &info->month);
2710 size+=size_of_uint16( &info->dayofweek);
2711 size+=size_of_uint16( &info->day);
2712 size+=size_of_uint16( &info->hour);
2713 size+=size_of_uint16( &info->minute);
2714 size+=size_of_uint16( &info->second);
2715 size+=size_of_uint16( &info->milliseconds);
2717 size+=size_of_uint32( &info->global_counter);
2718 size+=size_of_uint32( &info->total_pages);
2720 size+=size_of_uint16( &info->major_version);
2721 size+=size_of_uint16( &info->build_version);
2723 size+=size_of_uint32( &info->unknown7);
2724 size+=size_of_uint32( &info->unknown8);
2725 size+=size_of_uint32( &info->unknown9);
2726 size+=size_of_uint32( &info->session_counter);
2727 size+=size_of_uint32( &info->unknown11);
2728 size+=size_of_uint32( &info->printer_errors);
2729 size+=size_of_uint32( &info->unknown13);
2730 size+=size_of_uint32( &info->unknown14);
2731 size+=size_of_uint32( &info->unknown15);
2732 size+=size_of_uint32( &info->unknown16);
2733 size+=size_of_uint32( &info->change_id);
2734 size+=size_of_uint32( &info->unknown18);
2735 size+=size_of_uint32( &info->status);
2736 size+=size_of_uint32( &info->unknown20);
2737 size+=size_of_uint32( &info->c_setprinter);
2739 size+=size_of_uint16( &info->unknown22);
2740 size+=size_of_uint16( &info->unknown23);
2741 size+=size_of_uint16( &info->unknown24);
2742 size+=size_of_uint16( &info->unknown25);
2743 size+=size_of_uint16( &info->unknown26);
2744 size+=size_of_uint16( &info->unknown27);
2745 size+=size_of_uint16( &info->unknown28);
2746 size+=size_of_uint16( &info->unknown29);
2751 /*******************************************************************
2752 return the size required by a struct in the stream
2753 ********************************************************************/
2754 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2758 size+=size_of_uint32( &info->flags );
2759 size+=size_of_relative_string( &info->description );
2760 size+=size_of_relative_string( &info->name );
2761 size+=size_of_relative_string( &info->comment );
2766 /*******************************************************************
2767 return the size required by a struct in the stream
2768 ********************************************************************/
2769 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2774 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2775 size += sec_desc_size( info->secdesc );
2777 size+=size_of_device_mode( info->devmode );
2779 size+=size_of_relative_string( &info->servername );
2780 size+=size_of_relative_string( &info->printername );
2781 size+=size_of_relative_string( &info->sharename );
2782 size+=size_of_relative_string( &info->portname );
2783 size+=size_of_relative_string( &info->drivername );
2784 size+=size_of_relative_string( &info->comment );
2785 size+=size_of_relative_string( &info->location );
2787 size+=size_of_relative_string( &info->sepfile );
2788 size+=size_of_relative_string( &info->printprocessor );
2789 size+=size_of_relative_string( &info->datatype );
2790 size+=size_of_relative_string( &info->parameters );
2792 size+=size_of_uint32( &info->attributes );
2793 size+=size_of_uint32( &info->priority );
2794 size+=size_of_uint32( &info->defaultpriority );
2795 size+=size_of_uint32( &info->starttime );
2796 size+=size_of_uint32( &info->untiltime );
2797 size+=size_of_uint32( &info->status );
2798 size+=size_of_uint32( &info->cjobs );
2799 size+=size_of_uint32( &info->averageppm );
2803 /*******************************************************************
2804 return the size required by a struct in the stream
2805 ********************************************************************/
2806 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2808 /* The 4 is for the self relative pointer.. */
2809 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2810 return 4 + (uint32)sec_desc_size( info->secdesc );
2813 /*******************************************************************
2814 return the size required by a struct in the stream
2815 ********************************************************************/
2816 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2819 size+=size_of_relative_string( &info->name );
2824 /*******************************************************************
2825 return the size required by a struct in the stream
2826 ********************************************************************/
2827 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2830 size+=size_of_uint32( &info->version );
2831 size+=size_of_relative_string( &info->name );
2832 size+=size_of_relative_string( &info->architecture );
2833 size+=size_of_relative_string( &info->driverpath );
2834 size+=size_of_relative_string( &info->datafile );
2835 size+=size_of_relative_string( &info->configfile );
2840 /*******************************************************************
2841 return the size required by a string array.
2842 ********************************************************************/
2843 uint32 spoolss_size_string_array(uint16 *string)
2848 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2850 i=i+2; /* to count all chars including the leading zero */
2851 i=2*i; /* because we need the value in bytes */
2852 i=i+4; /* the offset pointer size */
2857 /*******************************************************************
2858 return the size required by a struct in the stream
2859 ********************************************************************/
2860 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
2864 size+=size_of_uint32( &info->version );
2865 size+=size_of_relative_string( &info->name );
2866 size+=size_of_relative_string( &info->architecture );
2867 size+=size_of_relative_string( &info->driverpath );
2868 size+=size_of_relative_string( &info->datafile );
2869 size+=size_of_relative_string( &info->configfile );
2870 size+=size_of_relative_string( &info->helpfile );
2871 size+=size_of_relative_string( &info->monitorname );
2872 size+=size_of_relative_string( &info->defaultdatatype );
2874 size+=spoolss_size_string_array(info->dependentfiles);
2879 /*******************************************************************
2880 return the size required by a struct in the stream
2881 ********************************************************************/
2882 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
2886 size+=size_of_uint32( &info->version );
2887 size+=size_of_relative_string( &info->name );
2888 size+=size_of_relative_string( &info->architecture );
2889 size+=size_of_relative_string( &info->driverpath );
2890 size+=size_of_relative_string( &info->datafile );
2891 size+=size_of_relative_string( &info->configfile );
2892 size+=size_of_relative_string( &info->helpfile );
2894 size+=spoolss_size_string_array(info->dependentfiles);
2896 size+=size_of_relative_string( &info->monitorname );
2897 size+=size_of_relative_string( &info->defaultdatatype );
2899 size+=spoolss_size_string_array(info->previousdrivernames);
2901 size+=size_of_nttime(&info->driver_date);
2902 size+=size_of_uint32( &info->padding );
2903 size+=size_of_uint32( &info->driver_version_low );
2904 size+=size_of_uint32( &info->driver_version_high );
2905 size+=size_of_relative_string( &info->mfgname );
2906 size+=size_of_relative_string( &info->oem_url );
2907 size+=size_of_relative_string( &info->hardware_id );
2908 size+=size_of_relative_string( &info->provider );
2914 /*******************************************************************
2915 return the size required by a struct in the stream
2916 ********************************************************************/
2917 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
2920 size+=size_of_uint32( &info->jobid );
2921 size+=size_of_relative_string( &info->printername );
2922 size+=size_of_relative_string( &info->machinename );
2923 size+=size_of_relative_string( &info->username );
2924 size+=size_of_relative_string( &info->document );
2925 size+=size_of_relative_string( &info->datatype );
2926 size+=size_of_relative_string( &info->text_status );
2927 size+=size_of_uint32( &info->status );
2928 size+=size_of_uint32( &info->priority );
2929 size+=size_of_uint32( &info->position );
2930 size+=size_of_uint32( &info->totalpages );
2931 size+=size_of_uint32( &info->pagesprinted );
2932 size+=size_of_systemtime( &info->submitted );
2937 /*******************************************************************
2938 return the size required by a struct in the stream
2939 ********************************************************************/
2940 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
2944 size+=4; /* size of sec desc ptr */
2946 size+=size_of_uint32( &info->jobid );
2947 size+=size_of_relative_string( &info->printername );
2948 size+=size_of_relative_string( &info->machinename );
2949 size+=size_of_relative_string( &info->username );
2950 size+=size_of_relative_string( &info->document );
2951 size+=size_of_relative_string( &info->notifyname );
2952 size+=size_of_relative_string( &info->datatype );
2953 size+=size_of_relative_string( &info->printprocessor );
2954 size+=size_of_relative_string( &info->parameters );
2955 size+=size_of_relative_string( &info->drivername );
2956 size+=size_of_device_mode( info->devmode );
2957 size+=size_of_relative_string( &info->text_status );
2958 /* SEC_DESC sec_desc;*/
2959 size+=size_of_uint32( &info->status );
2960 size+=size_of_uint32( &info->priority );
2961 size+=size_of_uint32( &info->position );
2962 size+=size_of_uint32( &info->starttime );
2963 size+=size_of_uint32( &info->untiltime );
2964 size+=size_of_uint32( &info->totalpages );
2965 size+=size_of_uint32( &info->size );
2966 size+=size_of_systemtime( &info->submitted );
2967 size+=size_of_uint32( &info->timeelapsed );
2968 size+=size_of_uint32( &info->pagesprinted );
2973 /*******************************************************************
2974 return the size required by a struct in the stream
2975 ********************************************************************/
2976 uint32 spoolss_size_form_1(FORM_1 *info)
2980 size+=size_of_uint32( &info->flag );
2981 size+=size_of_relative_string( &info->name );
2982 size+=size_of_uint32( &info->width );
2983 size+=size_of_uint32( &info->length );
2984 size+=size_of_uint32( &info->left );
2985 size+=size_of_uint32( &info->top );
2986 size+=size_of_uint32( &info->right );
2987 size+=size_of_uint32( &info->bottom );
2992 /*******************************************************************
2993 return the size required by a struct in the stream
2994 ********************************************************************/
2995 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
2999 size+=size_of_relative_string( &info->port_name );
3004 /*******************************************************************
3005 return the size required by a struct in the stream
3006 ********************************************************************/
3007 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3011 size=str_len_uni(&info->name); /* the string length */
3012 size=size+1; /* add the leading zero */
3013 size=size*2; /* convert in char */
3018 /*******************************************************************
3019 return the size required by a struct in the stream
3020 ********************************************************************/
3021 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3025 size+=size_of_relative_string( &info->port_name );
3026 size+=size_of_relative_string( &info->monitor_name );
3027 size+=size_of_relative_string( &info->description );
3029 size+=size_of_uint32( &info->port_type );
3030 size+=size_of_uint32( &info->reserved );
3035 /*******************************************************************
3036 return the size required by a struct in the stream
3037 ********************************************************************/
3038 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3041 size+=size_of_relative_string( &info->name );
3046 /*******************************************************************
3047 return the size required by a struct in the stream
3048 ********************************************************************/
3049 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3052 size+=size_of_relative_string( &info->name );
3057 /*******************************************************************
3058 return the size required by a struct in the stream
3059 ********************************************************************/
3060 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3063 size+=size_of_relative_string( &info->name );
3068 /*******************************************************************
3069 return the size required by a struct in the stream
3070 ********************************************************************/
3071 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3074 size+=size_of_relative_string( &info->name);
3075 size+=size_of_relative_string( &info->environment);
3076 size+=size_of_relative_string( &info->dll_name);
3081 /*******************************************************************
3083 ********************************************************************/
3084 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3085 const POLICY_HND *hnd,
3086 const fstring architecture,
3087 uint32 level, uint32 clientmajor, uint32 clientminor,
3088 NEW_BUFFER *buffer, uint32 offered)
3093 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3095 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3098 q_u->clientmajorversion=clientmajor;
3099 q_u->clientminorversion=clientminor;
3102 q_u->offered=offered;
3107 /*******************************************************************
3109 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3110 ********************************************************************/
3111 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3113 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3119 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3121 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3123 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3128 if(!prs_uint32("level", ps, depth, &q_u->level))
3131 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3137 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3140 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3142 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3148 /*******************************************************************
3150 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3151 ********************************************************************/
3152 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3154 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3160 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3165 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3167 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3169 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3171 if (!prs_uint32("status", ps, depth, &r_u->status))
3177 /*******************************************************************
3179 ********************************************************************/
3180 BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags,
3181 fstring servername, uint32 level,
3182 NEW_BUFFER *buffer, uint32 offered)
3186 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3187 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3191 q_u->offered=offered;
3196 /*******************************************************************
3198 ********************************************************************/
3199 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3200 fstring servername, uint32 level,
3201 NEW_BUFFER *buffer, uint32 offered)
3203 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3204 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3208 q_u->offered=offered;
3213 /*******************************************************************
3215 * called from spoolss_enumprinters (srv_spoolss.c)
3216 ********************************************************************/
3217 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3219 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3225 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3227 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3230 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3235 if (!prs_uint32("level", ps, depth, &q_u->level))
3238 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3243 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3249 /*******************************************************************
3250 Parse a SPOOL_R_ENUMPRINTERS structure.
3251 ********************************************************************/
3252 BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3254 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
3260 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3266 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3269 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3272 if (!prs_uint32("status", ps, depth, &r_u->status))
3278 /*******************************************************************
3279 * write a structure.
3280 * called from spoolss_r_enum_printers (srv_spoolss.c)
3282 ********************************************************************/
3283 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3285 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3291 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3297 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3300 if (!prs_uint32("status", ps, depth, &r_u->status))
3306 /*******************************************************************
3308 * called from spoolss_getprinter (srv_spoolss.c)
3309 ********************************************************************/
3310 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3312 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3318 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3320 if (!prs_uint32("level", ps, depth, &q_u->level))
3323 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3328 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3334 /*******************************************************************
3336 ********************************************************************/
3337 BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level,
3338 NEW_BUFFER *buffer, uint32 offered)
3344 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3348 q_u->offered=offered;
3353 /*******************************************************************
3354 ********************************************************************/
3355 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3357 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3363 if(!prs_uint32("status", ps, depth, &r_u->status))
3369 /*******************************************************************
3370 Delete the dynamic parts of a SPOOL_Q_SETPRINTER struct.
3371 ********************************************************************/
3373 void free_spoolss_q_setprinter(SPOOL_Q_SETPRINTER *q_u)
3375 free_spool_printer_info_level(&q_u->info);
3376 free_sec_desc_buf( &q_u->secdesc_ctr );
3377 free_devmode( q_u->devmode_ctr.devmode );
3380 /*******************************************************************
3381 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3382 ********************************************************************/
3384 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3386 uint32 ptr_sec_desc = 0;
3388 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3394 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3396 if(!prs_uint32("level", ps, depth, &q_u->level))
3399 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3402 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3409 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3414 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3420 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3424 if(!prs_uint32("command", ps, depth, &q_u->command))
3430 /*******************************************************************
3431 ********************************************************************/
3432 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3434 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3440 if(!prs_uint32("status", ps, depth, &r_u->status))
3446 /*******************************************************************
3447 ********************************************************************/
3448 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3451 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3457 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3464 /*******************************************************************
3465 ********************************************************************/
3466 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3468 prs_debug(ps, depth, desc, "");
3474 if(!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3480 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3483 if(!prs_uint32("status", ps, depth, &r_u->status))
3489 /*******************************************************************
3490 ********************************************************************/
3491 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3493 prs_debug(ps, depth, desc, "");
3499 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3501 if(!prs_uint32("level", ps, depth, &q_u->level))
3504 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3510 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3516 /*******************************************************************
3517 ********************************************************************/
3518 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3520 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3526 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3532 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3535 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3538 if (!prs_uint32("status", ps, depth, &r_u->status))
3545 /*******************************************************************
3546 ********************************************************************/
3547 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3558 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3559 q_u->firstjob = firstjob;
3560 q_u->numofjobs = numofjobs;
3562 q_u->buffer= buffer;
3563 q_u->offered = offered;
3567 /*******************************************************************
3568 ********************************************************************/
3569 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3571 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3577 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3580 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3582 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3584 if (!prs_uint32("level", ps, depth, &q_u->level))
3587 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3590 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3596 /*******************************************************************
3597 ********************************************************************/
3598 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3600 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3606 if(!prs_uint32("status", ps, depth, &r_u->status))
3612 /*******************************************************************
3613 ********************************************************************/
3614 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3616 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3622 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3624 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3630 /*******************************************************************
3631 ********************************************************************/
3632 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3634 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3640 if(!prs_uint32("status", ps, depth, &r_u->status))
3646 /*******************************************************************
3647 ********************************************************************/
3648 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3650 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3656 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3658 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3661 * level is usually 0. If (level!=0) then I'm in trouble !
3662 * I will try to generate setjob command with level!=0, one day.
3664 if(!prs_uint32("level", ps, depth, &q_u->level))
3666 if(!prs_uint32("command", ps, depth, &q_u->command))
3672 /*******************************************************************
3673 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3674 ********************************************************************/
3675 BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3677 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
3683 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3689 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3692 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3695 if (!prs_uint32("status", ps, depth, &r_u->status))
3701 /*******************************************************************
3703 ********************************************************************/
3704 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
3706 const char *environment,
3708 NEW_BUFFER *buffer, uint32 offered)
3710 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
3711 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
3715 q_u->offered=offered;
3720 /*******************************************************************
3721 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3722 ********************************************************************/
3723 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3726 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3732 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3734 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3739 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3741 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3746 if (!prs_uint32("level", ps, depth, &q_u->level))
3749 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3755 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3761 /*******************************************************************
3762 ********************************************************************/
3763 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
3766 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
3771 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3773 if (!prs_uint32("level", ps, depth, &q_u->level))
3776 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3781 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3787 /*******************************************************************
3788 ********************************************************************/
3789 BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
3791 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumforms");
3797 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3803 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
3806 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
3809 if (!prs_uint32("status", ps, depth, &r_u->status))
3815 /*******************************************************************
3816 ********************************************************************/
3817 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
3820 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
3825 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3827 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
3833 if (!prs_uint32("level", ps, depth, &q_u->level))
3836 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3841 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3847 /*******************************************************************
3848 ********************************************************************/
3849 BOOL new_spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
3851 prs_debug(ps, depth, desc, "new_spoolss_io_r_getform");
3857 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3863 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
3866 if (!prs_uint32("status", ps, depth, &r_u->status))
3871 /*******************************************************************
3872 Parse a SPOOL_R_ENUMPORTS structure.
3873 ********************************************************************/
3874 BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
3876 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
3882 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3888 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3891 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3894 if (!prs_uint32("status", ps, depth, &r_u->status))
3900 /*******************************************************************
3901 ********************************************************************/
3902 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
3904 prs_debug(ps, depth, desc, "");
3910 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
3912 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
3917 if (!prs_uint32("level", ps, depth, &q_u->level))
3920 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3925 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3931 /*******************************************************************
3932 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
3933 ********************************************************************/
3934 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
3936 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
3942 if(!prs_uint32("flags", ps, depth, &il->flags))
3944 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
3946 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3948 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3951 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
3953 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3955 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3961 /*******************************************************************
3962 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
3963 ********************************************************************/
3964 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
3966 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
3972 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3978 /*******************************************************************
3979 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
3980 ********************************************************************/
3981 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
3983 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
3989 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
3991 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
3993 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
3995 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
3998 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4000 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4002 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4004 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4006 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4008 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4010 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4012 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4014 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4017 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4019 if(!prs_uint32("priority", ps, depth, &il->priority))
4021 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4023 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4025 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4027 if(!prs_uint32("status", ps, depth, &il->status))
4029 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4031 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4034 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4036 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4038 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4040 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4042 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4044 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4046 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4048 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4050 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4052 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4054 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4060 /*******************************************************************
4061 ********************************************************************/
4062 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4064 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4069 if(!prs_uint32("level", ps, depth, &il->level))
4071 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4074 /* if no struct inside just return */
4075 if (il->info_ptr==0) {
4076 if (UNMARSHALLING(ps)) {
4083 switch (il->level) {
4085 * level 0 is used by setprinter when managing the queue
4086 * (hold, stop, start a queue)
4090 /* DOCUMENT ME!!! What is level 1 used for? */
4093 if (UNMARSHALLING(ps)) {
4094 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4096 ZERO_STRUCTP(il->info_1);
4098 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth)) {
4099 if (UNMARSHALLING(ps))
4100 safe_free(il->info_1);
4106 * level 2 is used by addprinter
4107 * and by setprinter when updating printer's info
4110 if (UNMARSHALLING(ps)) {
4111 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4113 ZERO_STRUCTP(il->info_2);
4115 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth)) {
4116 if (UNMARSHALLING(ps))
4117 safe_free(il->info_2);
4121 /* DOCUMENT ME!!! What is level 3 used for? */
4124 if (UNMARSHALLING(ps)) {
4125 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4127 ZERO_STRUCTP(il->info_3);
4129 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth)) {
4130 if (UNMARSHALLING(ps))
4131 safe_free(il->info_3);
4141 /*******************************************************************
4142 ********************************************************************/
4143 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4145 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4150 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4152 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4158 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4161 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4164 /* the 4 unknown are all 0 */
4167 * en fait ils sont pas inconnu
4168 * par recoupement avec rpcSetPrinter
4169 * c'est le devicemode
4170 * et le security descriptor.
4175 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
4177 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
4179 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
4181 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
4184 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4186 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4192 /*******************************************************************
4193 ********************************************************************/
4194 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4195 prs_struct *ps, int depth)
4197 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4200 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4203 if(!prs_uint32("status", ps, depth, &r_u->status))
4209 /*******************************************************************
4210 ********************************************************************/
4211 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4212 prs_struct *ps, int depth)
4214 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4216 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4220 if (UNMARSHALLING(ps)) {
4221 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4234 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4236 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4238 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4240 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4242 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4244 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4246 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4248 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4250 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4252 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4254 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4260 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4262 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4264 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4266 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4268 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4270 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4272 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4274 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4280 if (il->dependentfiles_ptr)
4281 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4286 void free_spool_printer_driver_info_level_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u)
4288 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il = *q_u;
4296 /*******************************************************************
4297 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4298 ********************************************************************/
4299 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4300 prs_struct *ps, int depth)
4302 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4304 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4308 if (UNMARSHALLING(ps)) {
4309 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4323 /* parse the main elements the packet */
4325 if(!prs_uint32("version", ps, depth, &il->version))
4327 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4329 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4331 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4333 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4335 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4337 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4339 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4341 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4343 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4345 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4347 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4349 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4351 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4353 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4355 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4357 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4359 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4361 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4363 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4366 /* parse the structures in the packet */
4368 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4372 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4376 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4380 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4384 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4388 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4392 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4396 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4400 if (il->dependentfiles_ptr) {
4401 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4406 if (il->previousnames_ptr) {
4407 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4412 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4416 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4420 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4424 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4430 void free_spool_printer_driver_info_level_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u)
4432 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il = *q_u;
4441 /*******************************************************************
4442 convert a buffer of UNICODE strings null terminated
4443 the buffer is terminated by a NULL
4445 convert to an dos codepage array (null terminated)
4447 dynamically allocate memory
4449 ********************************************************************/
4450 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4456 if (buf5==NULL) return False;
4458 src = (char *)buf5->buffer;
4461 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4462 unistr_to_dos(f, src, sizeof(f)-1);
4463 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4464 *ar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
4465 fstrcpy((*ar)[n], f);
4468 fstrcpy((*ar)[n], "");
4473 /*******************************************************************
4474 read a UNICODE array with null terminated strings
4475 and null terminated array
4476 and size of array at beginning
4477 ********************************************************************/
4478 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4480 if (buffer==NULL) return False;
4483 buffer->uni_str_len=buffer->uni_max_len;
4485 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4488 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4494 /*******************************************************************
4495 ********************************************************************/
4496 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4498 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4503 if(!prs_uint32("level", ps, depth, &il->level))
4505 if(!prs_uint32("ptr", ps, depth, &il->ptr))
4511 switch (il->level) {
4513 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
4517 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
4527 void free_spool_printer_driver_info_level(SPOOL_PRINTER_DRIVER_INFO_LEVEL *il)
4532 switch (il->level) {
4534 free_spool_printer_driver_info_level_3(&il->info_3);
4537 free_spool_printer_driver_info_level_6(&il->info_6);
4542 /*******************************************************************
4543 init a SPOOL_Q_ADDPRINTERDRIVER struct
4544 ******************************************************************/
4545 BOOL make_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u,
4546 const char* srv_name, uint32 level,
4547 PRINTER_DRIVER_CTR *info)
4549 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
4551 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
4552 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
4556 q_u->info.level = level;
4557 q_u->info.ptr = (info!=NULL)?1:0;
4560 /* info level 3 is supported by Windows 95/98,
4563 q_u->info.info_3=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)
4564 malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4565 make_spool_driver_info_3(q_u->info.info_3, info->info3);
4568 /* info level 6 is supported by WinME and Win2k */
4570 /* WRITEME!! will add later --jerry */
4573 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown \
4574 info level [%d]\n", level));
4582 BOOL make_spool_driver_info_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *spool_drv_info,
4583 DRIVER_INFO_3 *info3)
4586 uint16 *ptr = info3->dependentfiles;
4588 BOOL null_char = False;
4590 spool_drv_info->cversion = info3->version;
4591 spool_drv_info->name_ptr = (info3->name.buffer!=NULL)?1:0;
4592 spool_drv_info->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
4593 spool_drv_info->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
4594 spool_drv_info->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
4595 spool_drv_info->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
4596 spool_drv_info->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
4597 spool_drv_info->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
4598 spool_drv_info->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
4600 init_unistr2_from_unistr(&spool_drv_info->name, &info3->name);
4601 init_unistr2_from_unistr(&spool_drv_info->environment, &info3->architecture);
4602 init_unistr2_from_unistr(&spool_drv_info->driverpath, &info3->driverpath);
4603 init_unistr2_from_unistr(&spool_drv_info->datafile, &info3->datafile);
4604 init_unistr2_from_unistr(&spool_drv_info->configfile, &info3->configfile);
4605 init_unistr2_from_unistr(&spool_drv_info->helpfile, &info3->helpfile);
4606 init_unistr2_from_unistr(&spool_drv_info->monitorname, &info3->monitorname);
4607 init_unistr2_from_unistr(&spool_drv_info->defaultdatatype, &info3->defaultdatatype);
4614 /* the null_char BOOL is used to help locate
4615 two '\0's back to back */
4630 spool_drv_info->dependentfiles_ptr = (info3->dependentfiles!=NULL)?1:0;
4631 spool_drv_info->dependentfilessize = len;
4632 make_spool_buffer5(&spool_drv_info->dependentfiles, len, info3->dependentfiles);
4637 void free_spool_driver_info_3 (SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *info)
4641 free_spool_buffer5(&info->dependentfiles);
4647 /*******************************************************************
4648 make a BUFFER5 struct from a uint16*
4649 ******************************************************************/
4650 BOOL make_spool_buffer5(BUFFER5 *buf5, uint32 len, uint16 *src)
4653 buf5->buf_len = len;
4654 if((buf5->buffer=(uint16*)malloc(sizeof(uint16)*len)) == NULL)
4656 DEBUG(0,("make_spool_buffer5: Unable to malloc memory for buffer!\n"));
4660 memcpy(buf5->buffer, src, sizeof(uint16)*len);
4666 void free_spool_buffer5(BUFFER5 *buf)
4677 /*******************************************************************
4678 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
4679 ********************************************************************/
4680 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4682 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4688 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4690 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4695 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4698 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4704 /*******************************************************************
4705 Free the dynamic parts of a printer driver.
4706 ********************************************************************/
4708 void free_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u)
4710 free_spool_printer_driver_info_level(&q_u->info);
4713 /*******************************************************************
4714 ********************************************************************/
4715 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4717 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4720 if(!prs_uint32("status", ps, depth, &q_u->status))
4727 /*******************************************************************
4728 ********************************************************************/
4729 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
4730 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
4732 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
4734 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
4738 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
4746 d->cversion=uni->cversion;
4748 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4749 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4750 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4751 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4752 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4753 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4754 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4755 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4757 DEBUGADD(8,( "version: %d\n", d->cversion));
4758 DEBUGADD(8,( "name: %s\n", d->name));
4759 DEBUGADD(8,( "environment: %s\n", d->environment));
4760 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4761 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4762 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4763 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4764 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4765 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4767 uniarray_2_dosarray(&(uni->dependentfiles), &(d->dependentfiles) );
4772 /*******************************************************************
4773 ********************************************************************/
4774 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
4775 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
4777 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
4779 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
4783 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
4791 d->version=uni->version;
4793 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4794 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4795 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4796 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4797 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4798 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4799 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4800 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4802 DEBUGADD(8,( "version: %d\n", d->version));
4803 DEBUGADD(8,( "name: %s\n", d->name));
4804 DEBUGADD(8,( "environment: %s\n", d->environment));
4805 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4806 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4807 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4808 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4809 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4810 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4812 uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
4813 uniarray_2_dosarray(&uni->previousnames, &d->previousnames );
4818 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
4819 NT_PRINTER_INFO_LEVEL_2 **asc)
4821 NT_PRINTER_INFO_LEVEL_2 *d;
4824 DEBUG(7,("Converting from UNICODE to ASCII\n"));
4825 time_unix=time(NULL);
4828 DEBUGADD(8,("allocating memory\n"));
4830 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
4835 /* we allocate memory iff called from
4836 * addprinter(ex) so we can do one time stuff here.
4838 (*asc)->setuptime=time_unix;
4841 DEBUGADD(8,("start converting\n"));
4845 d->attributes=uni->attributes;
4846 d->priority=uni->priority;
4847 d->default_priority=uni->default_priority;
4848 d->starttime=uni->starttime;
4849 d->untiltime=uni->untiltime;
4850 d->status=uni->status;
4851 d->cjobs=uni->cjobs;
4853 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
4854 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
4855 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
4856 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
4857 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
4858 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
4859 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
4860 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
4861 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
4862 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
4863 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
4868 /*******************************************************************
4870 ********************************************************************/
4871 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
4872 fstring servername, fstring env_name, uint32 level,
4873 NEW_BUFFER *buffer, uint32 offered)
4875 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
4876 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
4880 q_u->offered=offered;
4886 /*******************************************************************
4887 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
4888 ********************************************************************/
4889 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
4891 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
4896 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4898 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
4904 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
4906 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4912 if(!prs_uint32("level", ps, depth, &q_u->level))
4915 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4921 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4927 /*******************************************************************
4928 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
4929 ********************************************************************/
4930 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
4932 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
4938 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4944 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4947 if (!prs_uint32("status", ps, depth, &r_u->status))
4953 /*******************************************************************
4954 ********************************************************************/
4955 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
4957 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
4963 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4969 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4972 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4975 if (!prs_uint32("status", ps, depth, &r_u->status))
4981 /*******************************************************************
4982 ********************************************************************/
4983 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
4985 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
4991 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4993 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4999 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5001 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5007 if (!prs_uint32("level", ps, depth, &q_u->level))
5010 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5016 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5022 /*******************************************************************
5023 ********************************************************************/
5024 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5026 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5032 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
5038 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5041 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5044 if (!prs_uint32("status", ps, depth, &r_u->status))
5050 /*******************************************************************
5051 ********************************************************************/
5052 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5054 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5060 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5062 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5068 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5070 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5076 if (!prs_uint32("level", ps, depth, &q_u->level))
5079 if(!new_spoolss_io_buffer("buffer", ps, depth, q_u->buffer))
5085 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5091 /*******************************************************************
5092 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5093 ********************************************************************/
5094 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5096 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5102 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5104 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5110 if (!prs_uint32("level", ps, depth, &q_u->level))
5113 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5119 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5125 /*******************************************************************
5126 ********************************************************************/
5127 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5129 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5135 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
5141 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5144 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5147 if (!prs_uint32("status", ps, depth, &r_u->status))
5153 /*******************************************************************
5154 ********************************************************************/
5155 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5157 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5162 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5164 if(!prs_uint16s(False, "value", ps, depth, r_u->value, r_u->valuesize))
5170 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5173 if(!prs_uint32("type", ps, depth, &r_u->type))
5176 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5178 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5183 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5185 if(!prs_uint32("status", ps, depth, &r_u->status))
5191 /*******************************************************************
5192 ********************************************************************/
5193 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5195 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5200 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5202 if(!prs_uint32("index", ps, depth, &q_u->index))
5204 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5206 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5212 /*******************************************************************
5213 ********************************************************************/
5214 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5215 const POLICY_HND *hnd,
5216 uint32 idx, uint32 valuelen, uint32 datalen)
5218 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5220 q_u->valuesize=valuelen;
5221 q_u->datasize=datalen;
5226 /*******************************************************************
5227 ********************************************************************/
5228 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5230 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5235 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5237 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5243 if(!prs_uint32("type", ps, depth, &q_u->type))
5246 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5255 q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8));
5256 if(q_u->data == NULL)
5258 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5265 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5271 void free_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u)
5273 safe_free(q_u->data);
5276 /*******************************************************************
5277 ********************************************************************/
5278 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5280 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5285 if(!prs_uint32("status", ps, depth, &r_u->status))
5292 /*******************************************************************
5293 ********************************************************************/
5294 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5295 uint32 type, const uint8 *data, uint32 len)
5297 DEBUG(5,("converting a specific param struct\n"));
5301 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5304 ZERO_STRUCTP(*param);
5305 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5307 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5308 (*param)->type = type;
5310 /* le champ data n'est pas NULL termine */
5311 /* on stocke donc la longueur */
5313 (*param)->data_len=len;
5316 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5317 if((*param)->data == NULL)
5319 memcpy((*param)->data, data, len);
5322 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5327 /*******************************************************************
5328 ********************************************************************/
5329 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5331 prs_debug(ps, depth, desc, "spoolss_io_addform");
5338 if(!prs_uint32("flags", ps, depth, &f->flags))
5340 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5342 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5344 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5346 if(!prs_uint32("left", ps, depth, &f->left))
5348 if(!prs_uint32("top", ps, depth, &f->top))
5350 if(!prs_uint32("right", ps, depth, &f->right))
5352 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5355 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5362 /*******************************************************************
5363 ********************************************************************/
5364 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5366 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5371 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5373 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5379 /*******************************************************************
5380 ********************************************************************/
5381 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5383 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5388 if(!prs_uint32("status", ps, depth, &r_u->status))
5394 /*******************************************************************
5395 ********************************************************************/
5396 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
5398 uint32 useless_ptr=0;
5399 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
5404 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5406 if(!prs_uint32("level", ps, depth, &q_u->level))
5408 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5413 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5415 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5422 /*******************************************************************
5423 ********************************************************************/
5424 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
5426 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
5431 if(!prs_uint32("status", ps, depth, &r_u->status))
5437 /*******************************************************************
5438 ********************************************************************/
5439 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
5441 uint32 useless_ptr=0;
5442 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
5447 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5449 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
5455 if(!prs_uint32("level", ps, depth, &q_u->level))
5457 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5462 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5464 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5471 /*******************************************************************
5472 ********************************************************************/
5473 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
5475 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
5480 if(!prs_uint32("status", ps, depth, &r_u->status))
5486 /*******************************************************************
5487 Parse a SPOOL_R_GETJOB structure.
5488 ********************************************************************/
5489 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
5491 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
5497 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
5503 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5506 if (!prs_uint32("status", ps, depth, &r_u->status))
5512 /*******************************************************************
5513 Parse a SPOOL_Q_GETJOB structure.
5514 ********************************************************************/
5515 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
5517 prs_debug(ps, depth, desc, "");
5523 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5525 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
5527 if(!prs_uint32("level", ps, depth, &q_u->level))
5530 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5536 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5542 void free_devmode(DEVICEMODE *devmode)
5544 if (devmode!=NULL) {
5545 safe_free(devmode->private);
5550 void free_printer_info_1(PRINTER_INFO_1 *printer)
5555 void free_printer_info_2(PRINTER_INFO_2 *printer)
5557 if (printer!=NULL) {
5558 free_devmode(printer->devmode);
5559 printer->devmode = NULL;
5560 if (printer->secdesc != NULL)
5561 free_sec_desc(&printer->secdesc);
5566 void free_printer_info_3(PRINTER_INFO_3 *printer)
5568 if (printer!=NULL) {
5569 if (printer->secdesc != NULL)
5570 free_sec_desc(&printer->secdesc);
5575 void free_spool_printer_info_1(SPOOL_PRINTER_INFO_LEVEL_1 *printer)
5580 void free_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 *printer)
5582 if (printer!=NULL) {
5583 if (printer->secdesc != NULL)
5584 free_sec_desc_buf(&printer->secdesc);
5589 void free_spool_printer_info_3(SPOOL_PRINTER_INFO_LEVEL_3 *printer)
5594 void free_spool_printer_info_level(SPOOL_PRINTER_INFO_LEVEL *pil)
5599 switch (pil->level) {
5601 free_spool_printer_info_1(pil->info_1);
5604 free_spool_printer_info_2(pil->info_2);
5607 free_spool_printer_info_3(pil->info_3);
5614 static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from)
5616 PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2));
5619 memcpy(copy, from, sizeof(*copy));
5626 void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries)
5628 void(*fn)(void*) = (void(*)(void*))&free_printer_info_2;
5629 free_void_array(num_entries, (void**)entries, *fn);
5632 PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
5633 const PRINTER_INFO_2 *prt)
5635 void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
5636 return (PRINTER_INFO_2*)add_copy_to_array(len,
5637 (void***)array, (const void*)prt, *fn, True);
5640 static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from)
5642 PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
5645 memcpy(copy, from, sizeof(*copy));
5652 void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries)
5654 void(*fn)(void*) = (void(*)(void*))&free;
5655 free_void_array(num_entries, (void**)entries, *fn);
5658 PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
5659 const PRINTER_INFO_1 *prt)
5661 void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
5662 return (PRINTER_INFO_1*)add_copy_to_array(len,
5663 (void***)array, (const void*)prt, *fn, True);
5666 static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from)
5668 JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
5673 memcpy(copy, from, sizeof(*copy));
5683 void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries)
5685 void(*fn)(void*) = (void(*)(void*))&free;
5686 free_void_array(num_entries, (void**)entries, *fn);
5689 JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
5690 const JOB_INFO_1 *job)
5692 void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
5693 return (JOB_INFO_1*)add_copy_to_array(len,
5694 (void***)array, (const void*)job, *fn, True);
5697 static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from)
5699 JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
5704 memcpy(copy, from, sizeof(*copy));
5714 void free_job_info_2(JOB_INFO_2 *job)
5718 free_devmode(job->devmode);
5723 void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries)
5725 void(*fn)(void*) = (void(*)(void*))&free_job_info_2;
5726 free_void_array(num_entries, (void**)entries, *fn);
5729 JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
5730 const JOB_INFO_2 *job)
5732 void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
5733 return (JOB_INFO_2*)add_copy_to_array(len,
5734 (void***)array, (const void*)job, *fn, True);
5737 /*******************************************************************
5739 ********************************************************************/
5740 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
5741 const fstring string, uint32 printer, uint32 type)
5746 init_unistr2(&q_u->string, string, strlen(string)+1);
5748 q_u->printer=printer;
5757 /*******************************************************************
5758 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
5759 ********************************************************************/
5760 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
5762 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
5768 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
5774 if(!prs_uint32("printer", ps, depth, &q_u->printer))
5776 if(!prs_uint32("type", ps, depth, &q_u->type))
5779 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5781 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5787 /*******************************************************************
5788 Parse a SPOOL_R_REPLYOPENPRINTER structure.
5789 ********************************************************************/
5790 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
5792 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
5798 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5801 if (!prs_uint32("status", ps, depth, &r_u->status))
5807 /*******************************************************************
5809 ********************************************************************/
5810 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
5815 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5820 /*******************************************************************
5821 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
5822 ********************************************************************/
5823 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
5825 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5831 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5837 /*******************************************************************
5838 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
5839 ********************************************************************/
5840 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
5842 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
5848 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5851 if (!prs_uint32("status", ps, depth, &r_u->status))
5857 /*******************************************************************
5859 ********************************************************************/
5860 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
5861 uint32 change_low, uint32 change_high)
5866 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5868 q_u->change_low=change_low;
5869 q_u->change_high=change_high;
5876 q_u->info.version=2;
5877 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
5883 /*******************************************************************
5884 Parse a SPOOL_Q_REPLY_RRPCN structure.
5885 ********************************************************************/
5886 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
5888 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5894 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5897 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
5900 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
5903 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5906 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5909 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
5912 if(q_u->info_ptr!=0)
5913 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
5919 /*******************************************************************
5920 Parse a SPOOL_R_REPLY_RRPCN structure.
5921 ********************************************************************/
5922 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
5924 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
5930 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
5933 if (!prs_uint32("status", ps, depth, &r_u->status))