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 /* These are already in little endian format. Don't byte swap. */
386 if(!prs_uint8s(True,"string",ps,depth,(uint8 *)data->notify_data.data.string,x*2))
395 /*******************************************************************
396 reads or writes an NOTIFY INFO structure.
397 ********************************************************************/
398 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
402 prs_debug(ps, depth, desc, "smb_io_notify_info");
408 if(!prs_uint32("count", ps, depth, &info->count))
410 if(!prs_uint32("version", ps, depth, &info->version))
412 if(!prs_uint32("flags", ps, depth, &info->flags))
414 if(!prs_uint32("count", ps, depth, &info->count))
417 for (i=0;i<info->count;i++) {
418 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
422 /* now do the strings at the end of the stream */
423 for (i=0;i<info->count;i++) {
424 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
432 /*******************************************************************
433 ********************************************************************/
434 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
436 prs_debug(ps, depth, desc, "");
445 if (!prs_uint32("size", ps, depth, &q_u->size))
447 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
449 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
451 if (!prs_uint32("build", ps, depth, &q_u->build))
453 if (!prs_uint32("major", ps, depth, &q_u->major))
455 if (!prs_uint32("minor", ps, depth, &q_u->minor))
457 if (!prs_uint32("processor", ps, depth, &q_u->processor))
460 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
464 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
470 /*******************************************************************
471 ********************************************************************/
472 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
477 prs_debug(ps, depth, desc, "spool_io_user_level");
482 if (!prs_uint32("level", ps, depth, &q_u->level))
484 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
487 switch (q_u->level) {
489 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
499 /*******************************************************************
500 * read or write a DEVICEMODE struct.
501 * on reading allocate memory for the private member
502 ********************************************************************/
503 static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
505 prs_debug(ps, depth, desc, "spoolss_io_devmode");
508 if (UNMARSHALLING(ps)) {
509 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
510 if (devmode->devicename.buffer == NULL)
514 if (!prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
516 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
518 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
520 if (!prs_uint16("size", ps, depth, &devmode->size))
522 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
524 if (!prs_uint32("fields", ps, depth, &devmode->fields))
526 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
528 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
530 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
532 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
534 if (!prs_uint16("scale", ps, depth, &devmode->scale))
536 if (!prs_uint16("copies", ps, depth, &devmode->copies))
538 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
540 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
542 if (!prs_uint16("color", ps, depth, &devmode->color))
544 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
546 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
548 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
550 if (!prs_uint16("collate", ps, depth, &devmode->collate))
553 if (UNMARSHALLING(ps)) {
554 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
555 if (devmode->formname.buffer == NULL)
559 if (!prs_uint16s(True, "formname", ps, depth, devmode->formname.buffer, 32))
561 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
563 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
565 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
567 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
569 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
571 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
573 if (!prs_uint32("icmmethod", ps, depth, &devmode->icmmethod))
575 if (!prs_uint32("icmintent", ps, depth, &devmode->icmintent))
577 if (!prs_uint32("mediatype", ps, depth, &devmode->mediatype))
579 if (!prs_uint32("dithertype", ps, depth, &devmode->dithertype))
581 if (!prs_uint32("reserved1", ps, depth, &devmode->reserved1))
583 if (!prs_uint32("reserved2", ps, depth, &devmode->reserved2))
585 if (!prs_uint32("panningwidth", ps, depth, &devmode->panningwidth))
587 if (!prs_uint32("panningheight", ps, depth, &devmode->panningheight))
590 if (devmode->driverextra!=0) {
591 if (UNMARSHALLING(ps)) {
592 devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8));
593 if(devmode->private == NULL)
595 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
598 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
599 if (!prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra))
606 void free_spoolss_devmode(DEVICEMODE *devmode)
611 safe_free(devmode->private);
615 /*******************************************************************
616 Read or write a DEVICEMODE container
617 ********************************************************************/
618 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
623 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
629 if (!prs_uint32("size", ps, depth, &dm_c->size))
632 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
635 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
636 if (UNMARSHALLING(ps))
637 /* if while reading there is no DEVMODE ... */
642 /* so we have a DEVICEMODE to follow */
643 if (UNMARSHALLING(ps)) {
644 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
645 dm_c->devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE));
646 if(dm_c->devmode == NULL)
648 ZERO_STRUCTP(dm_c->devmode);
651 /* this is bad code, shouldn't be there */
652 if (!prs_uint32("size", ps, depth, &dm_c->size))
655 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
661 /*******************************************************************
662 ********************************************************************/
663 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
668 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
671 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
674 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
680 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
683 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
689 /*******************************************************************
691 ********************************************************************/
692 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
693 const fstring printername,
694 const fstring datatype,
695 uint32 access_required,
696 const fstring clientname,
697 const fstring user_name)
699 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
700 q_u->printername_ptr = (printername!=NULL)?1:0;
701 init_unistr2(&q_u->printername, printername, strlen(printername));
703 q_u->printer_default.datatype_ptr = 0;
705 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
706 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
708 q_u->printer_default.devmode_cont.size=0;
709 q_u->printer_default.devmode_cont.devmode_ptr=0;
710 q_u->printer_default.devmode_cont.devmode=NULL;
711 q_u->printer_default.access_required=access_required;
713 q_u->user_ctr.level=1;
715 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
716 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
717 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
718 q_u->user_ctr.user1.build=1381;
719 q_u->user_ctr.user1.major=2;
720 q_u->user_ctr.user1.minor=0;
721 q_u->user_ctr.user1.processor=0;
722 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
723 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
728 /*******************************************************************
730 ********************************************************************/
731 BOOL make_spoolss_q_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name,
732 const char* clientname, const char* user_name,
733 uint32 level, PRINTER_INFO_2 *info)
735 DEBUG(5,("make_spoolss_q_addprinterex\n"));
737 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
738 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
742 q_u->info.level = level;
743 q_u->info.info_ptr = (info!=NULL)?1:0;
747 /* init q_u->info.info2 from *info */
748 if (!make_spool_printer_info_2( &q_u->info.info_2, info))
750 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
758 q_u->unk0 = q_u->unk1 = q_u->unk2 = q_u->unk3 = 0;
762 q_u->user_ctr.level=1;
764 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
765 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
766 q_u->user_ctr.user1.build=1381;
767 q_u->user_ctr.user1.major=2;
768 q_u->user_ctr.user1.minor=0;
769 q_u->user_ctr.user1.processor=0;
770 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
771 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
772 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
773 q_u->user_ctr.user1.client_name.uni_str_len + 2;
778 /*******************************************************************
779 free dynamically allocated members
780 ********************************************************************/
781 void free_spoolss_q_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u)
783 switch (q_u->info.level)
786 if (q_u->info.info_1 != NULL)
788 free(q_u->info.info_1);
789 q_u->info.info_1 = NULL;
793 if (q_u->info.info_2 != NULL)
795 free(q_u->info.info_2);
796 q_u->info.info_2 = NULL;
800 if (q_u->info.info_3 != NULL)
802 free(q_u->info.info_3);
803 q_u->info.info_3 = NULL;
812 /*******************************************************************
813 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
814 *******************************************************************/
815 BOOL make_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
816 PRINTER_INFO_2 *info)
819 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
821 /* allocate the necessary memory */
822 inf = (SPOOL_PRINTER_INFO_LEVEL_2*)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
823 if (spool_info2 == NULL)
825 DEBUG(0,("make_spool_printer_info_2: Unable to malloc SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
831 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
832 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
833 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
834 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
835 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
836 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
837 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
838 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
839 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
840 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
841 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
842 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
843 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
844 inf->attributes = info->attributes;
845 inf->priority = info->priority;
846 inf->default_priority = info->defaultpriority;
847 inf->starttime = info->starttime;
848 inf->untiltime = info->untiltime;
849 inf->cjobs = info->cjobs;
850 inf->averageppm = info->averageppm;
851 init_unistr2_from_unistr(&inf->servername, &info->servername);
852 init_unistr2_from_unistr(&inf->printername, &info->printername);
853 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
854 init_unistr2_from_unistr(&inf->portname, &info->portname);
855 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
856 init_unistr2_from_unistr(&inf->comment, &info->comment);
857 init_unistr2_from_unistr(&inf->location, &info->location);
858 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
859 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
860 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
861 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
862 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
870 /*******************************************************************
872 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
873 ********************************************************************/
874 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
879 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
885 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
887 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
893 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
896 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
898 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
904 void free_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u)
906 free_spoolss_devmode(q_u->printer_default.devmode_cont.devmode);
909 /*******************************************************************
911 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
912 * called from spoolss_open_printer_ex (cli_spoolss.c)
913 ********************************************************************/
914 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
916 if (r_u == NULL) return False;
918 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
924 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
927 if (!prs_uint32("status code", ps, depth, &(r_u->status)))
933 /*******************************************************************
935 ********************************************************************/
936 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
937 const POLICY_HND *handle,
938 UNISTR2 *valuename, uint32 size)
940 if (q_u == NULL) return False;
942 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
944 q_u->handle = *handle;
945 copy_unistr2(&q_u->valuename, valuename);
952 /*******************************************************************
954 * called from spoolss_q_getprinterdata (srv_spoolss.c)
955 ********************************************************************/
956 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
961 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
966 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
970 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
974 if (!prs_uint32("size", ps, depth, &(q_u->size)))
980 /*******************************************************************
982 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
983 ********************************************************************/
984 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
989 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
994 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
998 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
1004 /*******************************************************************
1005 * write a structure.
1006 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1007 ********************************************************************/
1008 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1010 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1012 if(!prs_uint32("status", ps, depth, &r_u->status))
1018 /*******************************************************************
1019 * write a structure.
1020 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1021 ********************************************************************/
1022 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1027 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1032 if (!prs_uint32("type", ps, depth, &r_u->type))
1034 if (!prs_uint32("size", ps, depth, &r_u->size))
1037 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1043 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1045 if (!prs_uint32("status", ps, depth, &r_u->status))
1051 /*******************************************************************
1053 ********************************************************************/
1054 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1056 if (q_u == NULL) return False;
1058 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1060 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
1065 /*******************************************************************
1067 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1068 * called from spoolss_abortprinter (cli_spoolss.c)
1069 ********************************************************************/
1070 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1072 if (q_u == NULL) return False;
1074 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1080 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1086 /*******************************************************************
1087 * write a structure.
1088 * called from spoolss_r_abortprinter (srv_spoolss.c)
1089 ********************************************************************/
1090 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1092 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1094 if(!prs_uint32("status", ps, depth, &r_u->status))
1100 /*******************************************************************
1102 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1103 * called from spoolss_deleteprinter (cli_spoolss.c)
1104 ********************************************************************/
1105 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1107 if (q_u == NULL) return False;
1109 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1115 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1121 /*******************************************************************
1122 * write a structure.
1123 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1124 * called from spoolss_deleteprinter (cli_spoolss.c)
1125 ********************************************************************/
1126 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1128 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1134 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1136 if (!prs_uint32("status", ps, depth, &r_u->status))
1143 /*******************************************************************
1145 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1146 * called from spoolss_closeprinter (cli_spoolss.c)
1147 ********************************************************************/
1148 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1150 if (q_u == NULL) return False;
1152 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1158 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1164 /*******************************************************************
1165 * write a structure.
1166 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1167 * called from spoolss_closeprinter (cli_spoolss.c)
1168 ********************************************************************/
1169 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1171 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1177 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1179 if (!prs_uint32("status", ps, depth, &r_u->status))
1185 /*******************************************************************
1187 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1188 ********************************************************************/
1189 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1191 if (q_u == NULL) return False;
1193 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1199 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1202 if(!smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth))
1208 /*******************************************************************
1209 * write a structure.
1210 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1211 ********************************************************************/
1212 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1214 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1216 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1218 if(!prs_uint32("status", ps, depth, &r_u->status))
1224 /*******************************************************************
1226 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1227 ********************************************************************/
1228 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1230 if (q_u == NULL) return False;
1232 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1238 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1244 /*******************************************************************
1245 * write a structure.
1246 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1247 ********************************************************************/
1248 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1250 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1252 if(!prs_uint32("status", ps, depth, &r_u->status))
1258 /*******************************************************************
1260 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1261 ********************************************************************/
1262 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1264 if (q_u == NULL) return False;
1266 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1272 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1278 /*******************************************************************
1279 * write a structure.
1280 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1281 ********************************************************************/
1282 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1284 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1286 if(!prs_uint32("status", ps, depth, &r_u->status))
1292 /*******************************************************************
1294 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1295 ********************************************************************/
1296 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1298 if (q_u == NULL) return False;
1300 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1306 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1312 /*******************************************************************
1313 * write a structure.
1314 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1315 ********************************************************************/
1316 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1318 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1320 if(!prs_uint32("status", ps, depth, &r_u->status))
1326 /*******************************************************************
1328 * called from spoolss_q_writeprinter (srv_spoolss.c)
1329 ********************************************************************/
1330 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1332 if (q_u == NULL) return False;
1334 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1340 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1342 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1345 if (q_u->buffer_size!=0)
1347 q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8));
1348 if(q_u->buffer == NULL)
1350 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1355 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1361 /*******************************************************************
1362 * write a structure.
1363 * called from spoolss_r_writeprinter (srv_spoolss.c)
1364 ********************************************************************/
1365 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1367 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1369 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1371 if(!prs_uint32("status", ps, depth, &r_u->status))
1377 /*******************************************************************
1379 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1380 ********************************************************************/
1381 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1383 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1389 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1391 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1393 if(!prs_uint32("options", ps, depth, &q_u->options))
1395 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1397 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1403 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1406 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1409 if (q_u->option_ptr!=0) {
1411 if (UNMARSHALLING(ps))
1412 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1415 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1422 /*******************************************************************
1423 * write a structure.
1424 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1425 ********************************************************************/
1426 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1428 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1431 if(!prs_uint32("status", ps, depth, &r_u->status))
1437 /*******************************************************************
1439 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1440 ********************************************************************/
1441 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1443 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1449 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1452 if(!prs_uint32("change", ps, depth, &q_u->change))
1455 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1458 if (q_u->option_ptr!=0) {
1460 if (UNMARSHALLING(ps))
1461 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1464 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1471 /*******************************************************************
1472 * write a structure.
1473 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1474 ********************************************************************/
1475 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1477 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1483 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1486 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1491 if(!prs_uint32("status", ps, depth, &r_u->status))
1497 /*******************************************************************
1498 * return the length of a uint16 (obvious, but the code is clean)
1499 ********************************************************************/
1500 static uint32 size_of_uint16(uint16 *value)
1502 return (sizeof(*value));
1505 /*******************************************************************
1506 * return the length of a uint32 (obvious, but the code is clean)
1507 ********************************************************************/
1508 static uint32 size_of_uint32(uint32 *value)
1510 return (sizeof(*value));
1512 /*******************************************************************
1513 * return the length of a NTTIME (obvious, but the code is clean)
1514 ********************************************************************/
1515 static uint32 size_of_nttime(NTTIME *value)
1517 return (sizeof(*value));
1520 /*******************************************************************
1521 * return the length of a UNICODE string in number of char, includes:
1522 * - the leading zero
1523 * - the relative pointer size
1524 ********************************************************************/
1525 static uint32 size_of_relative_string(UNISTR *string)
1529 size=str_len_uni(string); /* the string length */
1530 size=size+1; /* add the leading zero */
1531 size=size*2; /* convert in char */
1532 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1533 size += ((4 - (size & 3)) & 3);
1534 size=size+4; /* add the size of the ptr */
1539 /*******************************************************************
1540 * return the length of a uint32 (obvious, but the code is clean)
1541 ********************************************************************/
1542 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1547 return (4+devmode->size+devmode->driverextra);
1550 /*******************************************************************
1551 * return the length of a uint32 (obvious, but the code is clean)
1552 ********************************************************************/
1553 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1558 return (sizeof(SYSTEMTIME) +4);
1561 /*******************************************************************
1562 * write a UNICODE string.
1563 * used by all the RPC structs passing a buffer
1564 ********************************************************************/
1565 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1570 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1573 /* there should be no align here as it can mess up
1574 parsing a NEW_BUFFER->prs */
1580 if (!prs_unistr("unistr", ps, depth, uni))
1587 /*******************************************************************
1588 * write a UNICODE string and its relative pointer.
1589 * used by all the RPC structs passing a buffer
1591 * As I'm a nice guy, I'm forcing myself to explain this code.
1592 * MS did a good job in the overall spoolss code except in some
1593 * functions where they are passing the API buffer directly in the
1594 * RPC request/reply. That's to maintain compatiility at the API level.
1595 * They could have done it the good way the first time.
1597 * So what happen is: the strings are written at the buffer's end,
1598 * in the reverse order of the original structure. Some pointers to
1599 * the strings are also in the buffer. Those are relative to the
1602 * If you don't understand or want to change that function,
1603 * first get in touch with me: jfm@samba.org
1605 ********************************************************************/
1606 static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1608 prs_struct *ps=&buffer->prs;
1610 if (MARSHALLING(ps)) {
1611 uint32 struct_offset = prs_offset(ps);
1612 uint32 relative_offset;
1614 buffer->string_at_end -= (size_of_relative_string(string) - 4);
1615 if(!prs_set_offset(ps, buffer->string_at_end))
1619 buffer->string_at_end = prs_offset(ps);
1621 /* write the string */
1622 if (!smb_io_unistr(desc, string, ps, depth))
1625 if(!prs_set_offset(ps, struct_offset))
1628 relative_offset=buffer->string_at_end - buffer->struct_start;
1629 /* write its offset */
1630 if (!prs_uint32("offset", ps, depth, &relative_offset))
1636 /* read the offset */
1637 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1640 old_offset = prs_offset(ps);
1641 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1644 /* read the string */
1645 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1648 if(!prs_set_offset(ps, old_offset))
1655 /*******************************************************************
1656 * write a array of UNICODE strings and its relative pointer.
1657 * used by 2 RPC structs
1658 ********************************************************************/
1659 static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1663 prs_struct *ps=&buffer->prs;
1665 if (MARSHALLING(ps)) {
1666 uint32 struct_offset = prs_offset(ps);
1667 uint32 relative_offset;
1674 /* first write the last 0 */
1675 buffer->string_at_end -= 2;
1676 if(!prs_set_offset(ps, buffer->string_at_end))
1679 if(!prs_uint16("leading zero", ps, depth, &zero))
1682 while (p && (*p!=0)) {
1686 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
1687 if (chaine.buffer == NULL)
1690 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1692 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1694 if(!prs_set_offset(ps, buffer->string_at_end)) {
1695 free(chaine.buffer);
1699 /* write the string */
1700 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth)) {
1701 free(chaine.buffer);
1707 free(chaine.buffer);
1710 if(!prs_set_offset(ps, struct_offset))
1713 relative_offset=buffer->string_at_end - buffer->struct_start;
1714 /* write its offset */
1715 if (!prs_uint32("offset", ps, depth, &relative_offset))
1720 uint16 *chaine2=NULL;
1726 /* read the offset */
1727 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1730 old_offset = prs_offset(ps);
1731 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1735 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1738 l_chaine=str_len_uni(&chaine);
1740 /* we're going to add two more bytes here in case this
1741 is the last string in the array and we need to add
1742 an extra NULL for termination */
1745 if((chaine2=(uint16 *)Realloc(chaine2, (l_chaine2+l_chaine+2)*sizeof(uint16))) == NULL)
1747 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1748 l_chaine2+=l_chaine+1;
1751 } while(l_chaine!=0);
1753 /* the end should be bould NULL terminated so add
1754 the second one here */
1757 chaine2[l_chaine2] = '\0';
1761 if(!prs_set_offset(ps, old_offset))
1768 /*******************************************************************
1769 Parse a DEVMODE structure and its relative pointer.
1770 ********************************************************************/
1771 static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth,
1774 prs_struct *ps= &buffer->prs;
1776 prs_debug(ps, depth, desc, "new_smb_io_relsecdesc");
1779 if (MARSHALLING(ps)) {
1780 uint32 struct_offset = prs_offset(ps);
1781 uint32 relative_offset;
1784 relative_offset = 0;
1785 if (!prs_uint32("offset", ps, depth, &relative_offset))
1790 if (*secdesc != NULL) {
1791 buffer->string_at_end -= sec_desc_size(*secdesc);
1793 if(!prs_set_offset(ps, buffer->string_at_end))
1795 /* write the secdesc */
1796 if (!sec_io_desc(desc, secdesc, ps, depth))
1799 if(!prs_set_offset(ps, struct_offset))
1803 relative_offset=buffer->string_at_end - buffer->struct_start;
1804 /* write its offset */
1806 if (!prs_uint32("offset", ps, depth, &relative_offset))
1811 /* read the offset */
1812 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1815 old_offset = prs_offset(ps);
1816 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1820 if (!sec_io_desc(desc, secdesc, ps, depth))
1823 if(!prs_set_offset(ps, old_offset))
1829 /*******************************************************************
1830 Parse a DEVMODE structure and its relative pointer.
1831 ********************************************************************/
1832 static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1834 prs_struct *ps=&buffer->prs;
1836 prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
1839 if (MARSHALLING(ps)) {
1840 uint32 struct_offset = prs_offset(ps);
1841 uint32 relative_offset;
1843 if (*devmode == NULL) {
1845 if (!prs_uint32("offset", ps, depth, &relative_offset))
1847 DEBUG(8, ("boing, the devmode was NULL\n"));
1852 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1854 if(!prs_set_offset(ps, buffer->string_at_end))
1857 /* write the DEVMODE */
1858 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1861 if(!prs_set_offset(ps, struct_offset))
1864 relative_offset=buffer->string_at_end - buffer->struct_start;
1865 /* write its offset */
1866 if (!prs_uint32("offset", ps, depth, &relative_offset))
1872 /* read the offset */
1873 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1876 old_offset = prs_offset(ps);
1877 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1880 /* read the string */
1881 if((*devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL)
1883 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1886 if(!prs_set_offset(ps, old_offset))
1893 /*******************************************************************
1894 Parse a PRINTER_INFO_0 structure.
1895 ********************************************************************/
1896 BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1898 prs_struct *ps=&buffer->prs;
1900 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1903 buffer->struct_start=prs_offset(ps);
1905 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1907 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1910 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1912 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1914 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1917 if(!prs_uint16("year", ps, depth, &info->year))
1919 if(!prs_uint16("month", ps, depth, &info->month))
1921 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1923 if(!prs_uint16("day", ps, depth, &info->day))
1925 if(!prs_uint16("hour", ps, depth, &info->hour))
1927 if(!prs_uint16("minute", ps, depth, &info->minute))
1929 if(!prs_uint16("second", ps, depth, &info->second))
1931 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1934 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1936 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1939 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1941 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1943 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1945 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1947 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1949 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1951 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1953 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1955 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1957 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1959 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1961 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
1963 if(!prs_uint32("change_id", ps, depth, &info->change_id))
1965 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
1967 if(!prs_uint32("status" , ps, depth, &info->status))
1969 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
1971 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
1973 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
1975 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
1977 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
1979 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
1981 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
1983 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
1985 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
1987 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
1993 /*******************************************************************
1994 Parse a PRINTER_INFO_1 structure.
1995 ********************************************************************/
1996 BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
1998 prs_struct *ps=&buffer->prs;
2000 prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
2003 buffer->struct_start=prs_offset(ps);
2005 if (!prs_uint32("flags", ps, depth, &info->flags))
2007 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
2009 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2011 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
2017 /*******************************************************************
2018 Parse a PRINTER_INFO_2 structure.
2019 ********************************************************************/
2020 BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2022 prs_struct *ps=&buffer->prs;
2024 prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
2027 buffer->struct_start=prs_offset(ps);
2029 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
2031 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
2033 if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
2035 if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
2037 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
2039 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
2041 if (!new_smb_io_relstr("location", buffer, depth, &info->location))
2044 /* NT parses the DEVMODE at the end of the struct */
2045 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2048 if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2050 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2052 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
2054 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
2057 if (!new_smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2060 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2062 if (!prs_uint32("priority", ps, depth, &info->priority))
2064 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2066 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2068 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2070 if (!prs_uint32("status", ps, depth, &info->status))
2072 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2074 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2078 if (!prs_uint32_post("secdesc_ptr", ps, depth, NULL, sec_offset, info->secdesc ? prs_offset(ps)-buffer->struct_start : 0 ))
2081 if (!sec_io_desc("secdesc", &info->secdesc, ps, depth))
2087 /*******************************************************************
2088 Parse a PRINTER_INFO_3 structure.
2089 ********************************************************************/
2090 BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2092 prs_struct *ps=&buffer->prs;
2094 prs_debug(ps, depth, desc, "new_smb_io_printer_info_3");
2097 buffer->struct_start=prs_offset(ps);
2099 if (!prs_uint32("flags", ps, depth, &info->flags))
2101 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2107 /*******************************************************************
2108 Parse a PORT_INFO_1 structure.
2109 ********************************************************************/
2110 BOOL new_smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2112 prs_struct *ps=&buffer->prs;
2114 prs_debug(ps, depth, desc, "new_smb_io_port_info_1");
2117 buffer->struct_start=prs_offset(ps);
2119 if (!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2125 /*******************************************************************
2126 Parse a PORT_INFO_2 structure.
2127 ********************************************************************/
2128 BOOL new_smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2130 prs_struct *ps=&buffer->prs;
2132 prs_debug(ps, depth, desc, "new_smb_io_port_info_2");
2135 buffer->struct_start=prs_offset(ps);
2137 if (!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2139 if (!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2141 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
2143 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2145 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2151 /*******************************************************************
2152 Parse a DRIVER_INFO_1 structure.
2153 ********************************************************************/
2154 BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2156 prs_struct *ps=&buffer->prs;
2158 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
2161 buffer->struct_start=prs_offset(ps);
2163 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2170 /*******************************************************************
2171 Parse a DRIVER_INFO_2 structure.
2172 ********************************************************************/
2173 BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2175 prs_struct *ps=&buffer->prs;
2177 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
2180 buffer->struct_start=prs_offset(ps);
2182 if (!prs_uint32("version", ps, depth, &info->version))
2184 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2186 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
2188 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2190 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
2192 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
2199 /*******************************************************************
2200 Parse a DRIVER_INFO_3 structure.
2201 ********************************************************************/
2202 BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2204 prs_struct *ps=&buffer->prs;
2206 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
2209 buffer->struct_start=prs_offset(ps);
2211 if (!prs_uint32("version", ps, depth, &info->version))
2213 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2215 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
2217 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2219 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
2221 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
2223 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2226 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2229 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2231 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2237 /*******************************************************************
2238 Parse a DRIVER_INFO_6 structure.
2239 ********************************************************************/
2240 BOOL new_smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2242 prs_struct *ps=&buffer->prs;
2244 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_6");
2247 buffer->struct_start=prs_offset(ps);
2249 if (!prs_uint32("version", ps, depth, &info->version))
2251 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2253 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
2255 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2257 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
2259 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
2261 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2264 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2267 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2269 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2272 if (!new_smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2275 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2277 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2280 if (!prs_uint32("padding", ps, depth, &info->padding))
2283 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2286 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2289 if (!new_smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2291 if (!new_smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2293 if (!new_smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2295 if (!new_smb_io_relstr("provider", buffer, depth, &info->provider))
2302 /*******************************************************************
2303 Parse a JOB_INFO_1 structure.
2304 ********************************************************************/
2305 BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2307 prs_struct *ps=&buffer->prs;
2309 prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
2312 buffer->struct_start=prs_offset(ps);
2314 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2316 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
2318 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
2320 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
2322 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
2324 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
2326 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
2328 if (!prs_uint32("status", ps, depth, &info->status))
2330 if (!prs_uint32("priority", ps, depth, &info->priority))
2332 if (!prs_uint32("position", ps, depth, &info->position))
2334 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2336 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2338 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2344 /*******************************************************************
2345 Parse a JOB_INFO_2 structure.
2346 ********************************************************************/
2347 BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2350 prs_struct *ps=&buffer->prs;
2352 prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
2355 buffer->struct_start=prs_offset(ps);
2357 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2359 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
2361 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
2363 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
2365 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
2367 if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2369 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
2372 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2374 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
2376 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
2378 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2380 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
2383 /* SEC_DESC sec_desc;*/
2384 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2387 if (!prs_uint32("status",ps, depth, &info->status))
2389 if (!prs_uint32("priority",ps, depth, &info->priority))
2391 if (!prs_uint32("position",ps, depth, &info->position))
2393 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2395 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2397 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2399 if (!prs_uint32("size",ps, depth, &info->size))
2401 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2403 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2405 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2411 /*******************************************************************
2412 ********************************************************************/
2413 BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2415 prs_struct *ps=&buffer->prs;
2417 prs_debug(ps, depth, desc, "new_smb_io_form_1");
2420 buffer->struct_start=prs_offset(ps);
2422 if (!prs_uint32("flag", ps, depth, &info->flag))
2425 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2428 if (!prs_uint32("width", ps, depth, &info->width))
2430 if (!prs_uint32("length", ps, depth, &info->length))
2432 if (!prs_uint32("left", ps, depth, &info->left))
2434 if (!prs_uint32("top", ps, depth, &info->top))
2436 if (!prs_uint32("right", ps, depth, &info->right))
2438 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2444 /*******************************************************************
2445 Read/write a BUFFER struct.
2446 ********************************************************************/
2447 static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER *buffer)
2452 prs_debug(ps, depth, desc, "new_spoolss_io_buffer");
2455 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2459 if (UNMARSHALLING(ps)) {
2461 buffer->string_at_end=0;
2463 if (buffer->ptr==0) {
2464 if (!prs_init(&buffer->prs, 0, 4, prs_get_mem_context(ps), UNMARSHALL))
2469 if (!prs_uint32("size", ps, depth, &buffer->size))
2472 if (!prs_init(&buffer->prs, buffer->size, 4, prs_get_mem_context(ps), UNMARSHALL))
2475 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2478 if (!prs_set_offset(&buffer->prs, 0))
2481 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2484 buffer->string_at_end=buffer->size;
2493 if (!prs_uint32("size", ps, depth, &buffer->size))
2495 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2502 /*******************************************************************
2503 move a BUFFER from the query to the reply.
2504 ********************************************************************/
2505 void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2507 prs_switch_type(&src->prs, MARSHALL);
2508 if(!prs_set_offset(&src->prs, 0))
2510 prs_force_dynamic(&(src->prs));
2515 /*******************************************************************
2516 create a BUFFER struct.
2517 ********************************************************************/
2518 BOOL new_spoolss_allocate_buffer(NEW_BUFFER **buffer)
2523 if((*buffer=(NEW_BUFFER *)malloc(sizeof(NEW_BUFFER))) == NULL) {
2524 DEBUG(0,("new_spoolss_allocate_buffer: malloc fail for size %u.\n",
2525 (unsigned int)sizeof(NEW_BUFFER) ));
2531 (*buffer)->string_at_end=0;
2535 /*******************************************************************
2536 Destroy a BUFFER struct.
2537 ********************************************************************/
2538 void new_spoolss_free_buffer(NEW_BUFFER *buffer)
2543 prs_mem_free(&buffer->prs);
2546 buffer->string_at_end=0;
2551 /*******************************************************************
2552 Get the size of a BUFFER struct.
2553 ********************************************************************/
2554 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2556 return (buffer->size);
2560 /*******************************************************************
2561 Parse a DRIVER_DIRECTORY_1 structure.
2562 ********************************************************************/
2563 BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2565 prs_struct *ps=&buffer->prs;
2567 prs_debug(ps, depth, desc, "new_smb_io_driverdir_1");
2570 buffer->struct_start=prs_offset(ps);
2572 if (!smb_io_unistr(desc, &info->name, ps, depth))
2578 /*******************************************************************
2579 Parse a PORT_INFO_1 structure.
2580 ********************************************************************/
2581 BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2583 prs_struct *ps=&buffer->prs;
2585 prs_debug(ps, depth, desc, "new_smb_io_port_1");
2588 buffer->struct_start=prs_offset(ps);
2590 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2596 /*******************************************************************
2597 Parse a PORT_INFO_2 structure.
2598 ********************************************************************/
2599 BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2601 prs_struct *ps=&buffer->prs;
2603 prs_debug(ps, depth, desc, "new_smb_io_port_2");
2606 buffer->struct_start=prs_offset(ps);
2608 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2610 if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2612 if(!new_smb_io_relstr("description", buffer, depth, &info->description))
2614 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2616 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2623 /*******************************************************************
2624 ********************************************************************/
2625 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2627 prs_struct *ps=&buffer->prs;
2629 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2632 buffer->struct_start=prs_offset(ps);
2634 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2640 /*******************************************************************
2641 ********************************************************************/
2642 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2644 prs_struct *ps=&buffer->prs;
2646 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2649 buffer->struct_start=prs_offset(ps);
2651 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2657 /*******************************************************************
2658 ********************************************************************/
2659 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2661 prs_struct *ps=&buffer->prs;
2663 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2666 buffer->struct_start=prs_offset(ps);
2668 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2674 /*******************************************************************
2675 ********************************************************************/
2676 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2678 prs_struct *ps=&buffer->prs;
2680 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2683 buffer->struct_start=prs_offset(ps);
2685 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2687 if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
2689 if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2695 /*******************************************************************
2696 return the size required by a struct in the stream
2697 ********************************************************************/
2698 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2702 size+=size_of_relative_string( &info->printername );
2703 size+=size_of_relative_string( &info->servername );
2705 size+=size_of_uint32( &info->cjobs);
2706 size+=size_of_uint32( &info->total_jobs);
2707 size+=size_of_uint32( &info->total_bytes);
2709 size+=size_of_uint16( &info->year);
2710 size+=size_of_uint16( &info->month);
2711 size+=size_of_uint16( &info->dayofweek);
2712 size+=size_of_uint16( &info->day);
2713 size+=size_of_uint16( &info->hour);
2714 size+=size_of_uint16( &info->minute);
2715 size+=size_of_uint16( &info->second);
2716 size+=size_of_uint16( &info->milliseconds);
2718 size+=size_of_uint32( &info->global_counter);
2719 size+=size_of_uint32( &info->total_pages);
2721 size+=size_of_uint16( &info->major_version);
2722 size+=size_of_uint16( &info->build_version);
2724 size+=size_of_uint32( &info->unknown7);
2725 size+=size_of_uint32( &info->unknown8);
2726 size+=size_of_uint32( &info->unknown9);
2727 size+=size_of_uint32( &info->session_counter);
2728 size+=size_of_uint32( &info->unknown11);
2729 size+=size_of_uint32( &info->printer_errors);
2730 size+=size_of_uint32( &info->unknown13);
2731 size+=size_of_uint32( &info->unknown14);
2732 size+=size_of_uint32( &info->unknown15);
2733 size+=size_of_uint32( &info->unknown16);
2734 size+=size_of_uint32( &info->change_id);
2735 size+=size_of_uint32( &info->unknown18);
2736 size+=size_of_uint32( &info->status);
2737 size+=size_of_uint32( &info->unknown20);
2738 size+=size_of_uint32( &info->c_setprinter);
2740 size+=size_of_uint16( &info->unknown22);
2741 size+=size_of_uint16( &info->unknown23);
2742 size+=size_of_uint16( &info->unknown24);
2743 size+=size_of_uint16( &info->unknown25);
2744 size+=size_of_uint16( &info->unknown26);
2745 size+=size_of_uint16( &info->unknown27);
2746 size+=size_of_uint16( &info->unknown28);
2747 size+=size_of_uint16( &info->unknown29);
2752 /*******************************************************************
2753 return the size required by a struct in the stream
2754 ********************************************************************/
2755 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2759 size+=size_of_uint32( &info->flags );
2760 size+=size_of_relative_string( &info->description );
2761 size+=size_of_relative_string( &info->name );
2762 size+=size_of_relative_string( &info->comment );
2767 /*******************************************************************
2768 return the size required by a struct in the stream
2769 ********************************************************************/
2770 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2775 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2776 size += sec_desc_size( info->secdesc );
2778 size+=size_of_device_mode( info->devmode );
2780 size+=size_of_relative_string( &info->servername );
2781 size+=size_of_relative_string( &info->printername );
2782 size+=size_of_relative_string( &info->sharename );
2783 size+=size_of_relative_string( &info->portname );
2784 size+=size_of_relative_string( &info->drivername );
2785 size+=size_of_relative_string( &info->comment );
2786 size+=size_of_relative_string( &info->location );
2788 size+=size_of_relative_string( &info->sepfile );
2789 size+=size_of_relative_string( &info->printprocessor );
2790 size+=size_of_relative_string( &info->datatype );
2791 size+=size_of_relative_string( &info->parameters );
2793 size+=size_of_uint32( &info->attributes );
2794 size+=size_of_uint32( &info->priority );
2795 size+=size_of_uint32( &info->defaultpriority );
2796 size+=size_of_uint32( &info->starttime );
2797 size+=size_of_uint32( &info->untiltime );
2798 size+=size_of_uint32( &info->status );
2799 size+=size_of_uint32( &info->cjobs );
2800 size+=size_of_uint32( &info->averageppm );
2804 /*******************************************************************
2805 return the size required by a struct in the stream
2806 ********************************************************************/
2807 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2809 /* The 4 is for the self relative pointer.. */
2810 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2811 return 4 + (uint32)sec_desc_size( info->secdesc );
2814 /*******************************************************************
2815 return the size required by a struct in the stream
2816 ********************************************************************/
2817 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2820 size+=size_of_relative_string( &info->name );
2825 /*******************************************************************
2826 return the size required by a struct in the stream
2827 ********************************************************************/
2828 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2831 size+=size_of_uint32( &info->version );
2832 size+=size_of_relative_string( &info->name );
2833 size+=size_of_relative_string( &info->architecture );
2834 size+=size_of_relative_string( &info->driverpath );
2835 size+=size_of_relative_string( &info->datafile );
2836 size+=size_of_relative_string( &info->configfile );
2841 /*******************************************************************
2842 return the size required by a string array.
2843 ********************************************************************/
2844 uint32 spoolss_size_string_array(uint16 *string)
2849 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2851 i=i+2; /* to count all chars including the leading zero */
2852 i=2*i; /* because we need the value in bytes */
2853 i=i+4; /* the offset pointer size */
2858 /*******************************************************************
2859 return the size required by a struct in the stream
2860 ********************************************************************/
2861 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
2865 size+=size_of_uint32( &info->version );
2866 size+=size_of_relative_string( &info->name );
2867 size+=size_of_relative_string( &info->architecture );
2868 size+=size_of_relative_string( &info->driverpath );
2869 size+=size_of_relative_string( &info->datafile );
2870 size+=size_of_relative_string( &info->configfile );
2871 size+=size_of_relative_string( &info->helpfile );
2872 size+=size_of_relative_string( &info->monitorname );
2873 size+=size_of_relative_string( &info->defaultdatatype );
2875 size+=spoolss_size_string_array(info->dependentfiles);
2880 /*******************************************************************
2881 return the size required by a struct in the stream
2882 ********************************************************************/
2883 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
2887 size+=size_of_uint32( &info->version );
2888 size+=size_of_relative_string( &info->name );
2889 size+=size_of_relative_string( &info->architecture );
2890 size+=size_of_relative_string( &info->driverpath );
2891 size+=size_of_relative_string( &info->datafile );
2892 size+=size_of_relative_string( &info->configfile );
2893 size+=size_of_relative_string( &info->helpfile );
2895 size+=spoolss_size_string_array(info->dependentfiles);
2897 size+=size_of_relative_string( &info->monitorname );
2898 size+=size_of_relative_string( &info->defaultdatatype );
2900 size+=spoolss_size_string_array(info->previousdrivernames);
2902 size+=size_of_nttime(&info->driver_date);
2903 size+=size_of_uint32( &info->padding );
2904 size+=size_of_uint32( &info->driver_version_low );
2905 size+=size_of_uint32( &info->driver_version_high );
2906 size+=size_of_relative_string( &info->mfgname );
2907 size+=size_of_relative_string( &info->oem_url );
2908 size+=size_of_relative_string( &info->hardware_id );
2909 size+=size_of_relative_string( &info->provider );
2915 /*******************************************************************
2916 return the size required by a struct in the stream
2917 ********************************************************************/
2918 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
2921 size+=size_of_uint32( &info->jobid );
2922 size+=size_of_relative_string( &info->printername );
2923 size+=size_of_relative_string( &info->machinename );
2924 size+=size_of_relative_string( &info->username );
2925 size+=size_of_relative_string( &info->document );
2926 size+=size_of_relative_string( &info->datatype );
2927 size+=size_of_relative_string( &info->text_status );
2928 size+=size_of_uint32( &info->status );
2929 size+=size_of_uint32( &info->priority );
2930 size+=size_of_uint32( &info->position );
2931 size+=size_of_uint32( &info->totalpages );
2932 size+=size_of_uint32( &info->pagesprinted );
2933 size+=size_of_systemtime( &info->submitted );
2938 /*******************************************************************
2939 return the size required by a struct in the stream
2940 ********************************************************************/
2941 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
2945 size+=4; /* size of sec desc ptr */
2947 size+=size_of_uint32( &info->jobid );
2948 size+=size_of_relative_string( &info->printername );
2949 size+=size_of_relative_string( &info->machinename );
2950 size+=size_of_relative_string( &info->username );
2951 size+=size_of_relative_string( &info->document );
2952 size+=size_of_relative_string( &info->notifyname );
2953 size+=size_of_relative_string( &info->datatype );
2954 size+=size_of_relative_string( &info->printprocessor );
2955 size+=size_of_relative_string( &info->parameters );
2956 size+=size_of_relative_string( &info->drivername );
2957 size+=size_of_device_mode( info->devmode );
2958 size+=size_of_relative_string( &info->text_status );
2959 /* SEC_DESC sec_desc;*/
2960 size+=size_of_uint32( &info->status );
2961 size+=size_of_uint32( &info->priority );
2962 size+=size_of_uint32( &info->position );
2963 size+=size_of_uint32( &info->starttime );
2964 size+=size_of_uint32( &info->untiltime );
2965 size+=size_of_uint32( &info->totalpages );
2966 size+=size_of_uint32( &info->size );
2967 size+=size_of_systemtime( &info->submitted );
2968 size+=size_of_uint32( &info->timeelapsed );
2969 size+=size_of_uint32( &info->pagesprinted );
2974 /*******************************************************************
2975 return the size required by a struct in the stream
2976 ********************************************************************/
2977 uint32 spoolss_size_form_1(FORM_1 *info)
2981 size+=size_of_uint32( &info->flag );
2982 size+=size_of_relative_string( &info->name );
2983 size+=size_of_uint32( &info->width );
2984 size+=size_of_uint32( &info->length );
2985 size+=size_of_uint32( &info->left );
2986 size+=size_of_uint32( &info->top );
2987 size+=size_of_uint32( &info->right );
2988 size+=size_of_uint32( &info->bottom );
2993 /*******************************************************************
2994 return the size required by a struct in the stream
2995 ********************************************************************/
2996 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3000 size+=size_of_relative_string( &info->port_name );
3005 /*******************************************************************
3006 return the size required by a struct in the stream
3007 ********************************************************************/
3008 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3012 size=str_len_uni(&info->name); /* the string length */
3013 size=size+1; /* add the leading zero */
3014 size=size*2; /* convert in char */
3019 /*******************************************************************
3020 return the size required by a struct in the stream
3021 ********************************************************************/
3022 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3026 size+=size_of_relative_string( &info->port_name );
3027 size+=size_of_relative_string( &info->monitor_name );
3028 size+=size_of_relative_string( &info->description );
3030 size+=size_of_uint32( &info->port_type );
3031 size+=size_of_uint32( &info->reserved );
3036 /*******************************************************************
3037 return the size required by a struct in the stream
3038 ********************************************************************/
3039 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3042 size+=size_of_relative_string( &info->name );
3047 /*******************************************************************
3048 return the size required by a struct in the stream
3049 ********************************************************************/
3050 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3053 size+=size_of_relative_string( &info->name );
3058 /*******************************************************************
3059 return the size required by a struct in the stream
3060 ********************************************************************/
3061 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3064 size+=size_of_relative_string( &info->name );
3069 /*******************************************************************
3070 return the size required by a struct in the stream
3071 ********************************************************************/
3072 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3075 size+=size_of_relative_string( &info->name);
3076 size+=size_of_relative_string( &info->environment);
3077 size+=size_of_relative_string( &info->dll_name);
3082 /*******************************************************************
3084 ********************************************************************/
3085 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3086 const POLICY_HND *hnd,
3087 const fstring architecture,
3088 uint32 level, uint32 clientmajor, uint32 clientminor,
3089 NEW_BUFFER *buffer, uint32 offered)
3094 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3096 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3099 q_u->clientmajorversion=clientmajor;
3100 q_u->clientminorversion=clientminor;
3103 q_u->offered=offered;
3108 /*******************************************************************
3110 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3111 ********************************************************************/
3112 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3114 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3120 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3122 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3124 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3129 if(!prs_uint32("level", ps, depth, &q_u->level))
3132 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3138 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3141 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3143 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3149 /*******************************************************************
3151 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3152 ********************************************************************/
3153 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3155 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3161 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3166 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3168 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3170 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3172 if (!prs_uint32("status", ps, depth, &r_u->status))
3178 /*******************************************************************
3180 ********************************************************************/
3181 BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags,
3182 fstring servername, uint32 level,
3183 NEW_BUFFER *buffer, uint32 offered)
3187 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3188 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3192 q_u->offered=offered;
3197 /*******************************************************************
3199 ********************************************************************/
3200 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3201 fstring servername, uint32 level,
3202 NEW_BUFFER *buffer, uint32 offered)
3204 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3205 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3209 q_u->offered=offered;
3214 /*******************************************************************
3216 * called from spoolss_enumprinters (srv_spoolss.c)
3217 ********************************************************************/
3218 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3220 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3226 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3228 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3231 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3236 if (!prs_uint32("level", ps, depth, &q_u->level))
3239 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3244 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3250 /*******************************************************************
3251 Parse a SPOOL_R_ENUMPRINTERS structure.
3252 ********************************************************************/
3253 BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3255 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
3261 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3267 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3270 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3273 if (!prs_uint32("status", ps, depth, &r_u->status))
3279 /*******************************************************************
3280 * write a structure.
3281 * called from spoolss_r_enum_printers (srv_spoolss.c)
3283 ********************************************************************/
3284 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3286 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3292 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3298 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3301 if (!prs_uint32("status", ps, depth, &r_u->status))
3307 /*******************************************************************
3309 * called from spoolss_getprinter (srv_spoolss.c)
3310 ********************************************************************/
3311 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3313 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3319 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3321 if (!prs_uint32("level", ps, depth, &q_u->level))
3324 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3329 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3335 /*******************************************************************
3337 ********************************************************************/
3338 BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level,
3339 NEW_BUFFER *buffer, uint32 offered)
3345 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3349 q_u->offered=offered;
3354 /*******************************************************************
3355 ********************************************************************/
3356 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3358 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3364 if(!prs_uint32("status", ps, depth, &r_u->status))
3370 /*******************************************************************
3371 Delete the dynamic parts of a SPOOL_Q_SETPRINTER struct.
3372 ********************************************************************/
3374 void free_spoolss_q_setprinter(SPOOL_Q_SETPRINTER *q_u)
3376 free_spool_printer_info_level(&q_u->info);
3377 free_sec_desc_buf( &q_u->secdesc_ctr );
3378 free_devmode( q_u->devmode_ctr.devmode );
3381 /*******************************************************************
3382 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3383 ********************************************************************/
3385 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3387 uint32 ptr_sec_desc = 0;
3389 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3395 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3397 if(!prs_uint32("level", ps, depth, &q_u->level))
3400 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3403 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3410 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3415 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3421 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3426 /* Parse a NULL security descriptor. This should really
3427 happen inside the sec_io_desc_buf() function. */
3429 prs_debug(ps, depth, "", "sec_io_desc_buf");
3430 if (!prs_uint32("size", ps, depth + 1, &dummy)) return False;
3431 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3435 if(!prs_uint32("command", ps, depth, &q_u->command))
3441 /*******************************************************************
3442 ********************************************************************/
3443 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3445 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3451 if(!prs_uint32("status", ps, depth, &r_u->status))
3457 /*******************************************************************
3458 ********************************************************************/
3459 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3462 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3468 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3475 /*******************************************************************
3476 ********************************************************************/
3477 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3479 prs_debug(ps, depth, desc, "");
3485 if(!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3491 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3494 if(!prs_uint32("status", ps, depth, &r_u->status))
3500 /*******************************************************************
3501 ********************************************************************/
3502 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3504 prs_debug(ps, depth, desc, "");
3510 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3512 if(!prs_uint32("level", ps, depth, &q_u->level))
3515 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3521 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3527 /*******************************************************************
3528 ********************************************************************/
3529 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3531 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3537 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3543 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3546 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3549 if (!prs_uint32("status", ps, depth, &r_u->status))
3556 /*******************************************************************
3557 ********************************************************************/
3558 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3569 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3570 q_u->firstjob = firstjob;
3571 q_u->numofjobs = numofjobs;
3573 q_u->buffer= buffer;
3574 q_u->offered = offered;
3578 /*******************************************************************
3579 ********************************************************************/
3580 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3582 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3588 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3591 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3593 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3595 if (!prs_uint32("level", ps, depth, &q_u->level))
3598 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3601 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3607 /*******************************************************************
3608 ********************************************************************/
3609 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3611 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3617 if(!prs_uint32("status", ps, depth, &r_u->status))
3623 /*******************************************************************
3624 ********************************************************************/
3625 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3627 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3633 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3635 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3641 /*******************************************************************
3642 ********************************************************************/
3643 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3645 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3651 if(!prs_uint32("status", ps, depth, &r_u->status))
3657 /*******************************************************************
3658 ********************************************************************/
3659 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3661 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3667 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3669 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3672 * level is usually 0. If (level!=0) then I'm in trouble !
3673 * I will try to generate setjob command with level!=0, one day.
3675 if(!prs_uint32("level", ps, depth, &q_u->level))
3677 if(!prs_uint32("command", ps, depth, &q_u->command))
3683 /*******************************************************************
3684 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3685 ********************************************************************/
3686 BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3688 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
3694 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3700 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3703 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3706 if (!prs_uint32("status", ps, depth, &r_u->status))
3712 /*******************************************************************
3714 ********************************************************************/
3715 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
3717 const char *environment,
3719 NEW_BUFFER *buffer, uint32 offered)
3721 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
3722 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
3726 q_u->offered=offered;
3731 /*******************************************************************
3732 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3733 ********************************************************************/
3734 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3737 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3743 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3745 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3750 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3752 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3757 if (!prs_uint32("level", ps, depth, &q_u->level))
3760 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3766 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3772 /*******************************************************************
3773 ********************************************************************/
3774 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
3777 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
3782 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3784 if (!prs_uint32("level", ps, depth, &q_u->level))
3787 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3792 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3798 /*******************************************************************
3799 ********************************************************************/
3800 BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
3802 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumforms");
3808 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3814 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
3817 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
3820 if (!prs_uint32("status", ps, depth, &r_u->status))
3826 /*******************************************************************
3827 ********************************************************************/
3828 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
3831 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
3836 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3838 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
3844 if (!prs_uint32("level", ps, depth, &q_u->level))
3847 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3852 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3858 /*******************************************************************
3859 ********************************************************************/
3860 BOOL new_spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
3862 prs_debug(ps, depth, desc, "new_spoolss_io_r_getform");
3868 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3874 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
3877 if (!prs_uint32("status", ps, depth, &r_u->status))
3882 /*******************************************************************
3883 Parse a SPOOL_R_ENUMPORTS structure.
3884 ********************************************************************/
3885 BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
3887 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
3893 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3899 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3902 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3905 if (!prs_uint32("status", ps, depth, &r_u->status))
3911 /*******************************************************************
3912 ********************************************************************/
3913 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
3915 prs_debug(ps, depth, desc, "");
3921 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
3923 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
3928 if (!prs_uint32("level", ps, depth, &q_u->level))
3931 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3936 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3942 /*******************************************************************
3943 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
3944 ********************************************************************/
3945 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
3947 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
3953 if(!prs_uint32("flags", ps, depth, &il->flags))
3955 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
3957 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3959 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3962 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
3964 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3966 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3972 /*******************************************************************
3973 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
3974 ********************************************************************/
3975 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
3977 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
3983 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3989 /*******************************************************************
3990 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
3991 ********************************************************************/
3992 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
3994 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4000 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4002 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4004 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4006 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4009 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4011 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4013 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4015 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4017 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4019 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4021 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4023 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4025 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4028 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4030 if(!prs_uint32("priority", ps, depth, &il->priority))
4032 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4034 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4036 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4038 if(!prs_uint32("status", ps, depth, &il->status))
4040 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4042 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4045 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4047 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4049 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4051 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4053 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4055 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4057 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4059 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4061 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4063 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4065 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4071 /*******************************************************************
4072 ********************************************************************/
4073 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4075 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4080 if(!prs_uint32("level", ps, depth, &il->level))
4082 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4085 /* if no struct inside just return */
4086 if (il->info_ptr==0) {
4087 if (UNMARSHALLING(ps)) {
4094 switch (il->level) {
4096 * level 0 is used by setprinter when managing the queue
4097 * (hold, stop, start a queue)
4101 /* DOCUMENT ME!!! What is level 1 used for? */
4104 if (UNMARSHALLING(ps)) {
4105 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4107 ZERO_STRUCTP(il->info_1);
4109 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth)) {
4110 if (UNMARSHALLING(ps))
4111 safe_free(il->info_1);
4117 * level 2 is used by addprinter
4118 * and by setprinter when updating printer's info
4121 if (UNMARSHALLING(ps)) {
4122 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4124 ZERO_STRUCTP(il->info_2);
4126 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth)) {
4127 if (UNMARSHALLING(ps))
4128 safe_free(il->info_2);
4132 /* DOCUMENT ME!!! What is level 3 used for? */
4135 if (UNMARSHALLING(ps)) {
4136 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4138 ZERO_STRUCTP(il->info_3);
4140 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth)) {
4141 if (UNMARSHALLING(ps))
4142 safe_free(il->info_3);
4152 /*******************************************************************
4153 ********************************************************************/
4154 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4156 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4161 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4163 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4169 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4172 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4175 /* the 4 unknown are all 0 */
4178 * en fait ils sont pas inconnu
4179 * par recoupement avec rpcSetPrinter
4180 * c'est le devicemode
4181 * et le security descriptor.
4186 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
4188 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
4190 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
4192 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
4195 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4197 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4203 /*******************************************************************
4204 ********************************************************************/
4205 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4206 prs_struct *ps, int depth)
4208 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4211 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4214 if(!prs_uint32("status", ps, depth, &r_u->status))
4220 /*******************************************************************
4221 ********************************************************************/
4222 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4223 prs_struct *ps, int depth)
4225 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4227 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4231 if (UNMARSHALLING(ps)) {
4232 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4245 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4247 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4249 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4251 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4253 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4255 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4257 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4259 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4261 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4263 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4265 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4271 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4273 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4275 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4277 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4279 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4281 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4283 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4285 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4291 if (il->dependentfiles_ptr)
4292 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4297 void free_spool_printer_driver_info_level_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u)
4299 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il = *q_u;
4307 /*******************************************************************
4308 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4309 ********************************************************************/
4310 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4311 prs_struct *ps, int depth)
4313 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4315 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4319 if (UNMARSHALLING(ps)) {
4320 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4334 /* parse the main elements the packet */
4336 if(!prs_uint32("version", ps, depth, &il->version))
4338 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4340 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4342 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4344 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4346 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4348 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4350 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4352 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4354 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4356 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4358 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4360 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4362 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4364 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4366 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4368 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4370 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4372 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4374 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4377 /* parse the structures in the packet */
4379 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4383 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4387 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4391 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4395 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4399 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4403 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4407 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4411 if (il->dependentfiles_ptr) {
4412 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4417 if (il->previousnames_ptr) {
4418 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4423 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4427 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4431 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4435 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4441 void free_spool_printer_driver_info_level_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u)
4443 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il = *q_u;
4452 /*******************************************************************
4453 convert a buffer of UNICODE strings null terminated
4454 the buffer is terminated by a NULL
4456 convert to an dos codepage array (null terminated)
4458 dynamically allocate memory
4460 ********************************************************************/
4461 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4467 if (buf5==NULL) return False;
4469 src = (char *)buf5->buffer;
4472 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4473 unistr_to_dos(f, src, sizeof(f)-1);
4474 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4475 *ar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
4476 fstrcpy((*ar)[n], f);
4479 fstrcpy((*ar)[n], "");
4484 /*******************************************************************
4485 read a UNICODE array with null terminated strings
4486 and null terminated array
4487 and size of array at beginning
4488 ********************************************************************/
4489 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4491 if (buffer==NULL) return False;
4494 buffer->uni_str_len=buffer->uni_max_len;
4496 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4499 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4505 /*******************************************************************
4506 ********************************************************************/
4507 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4509 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4514 if(!prs_uint32("level", ps, depth, &il->level))
4516 if(!prs_uint32("ptr", ps, depth, &il->ptr))
4522 switch (il->level) {
4524 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
4528 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
4538 void free_spool_printer_driver_info_level(SPOOL_PRINTER_DRIVER_INFO_LEVEL *il)
4543 switch (il->level) {
4545 free_spool_printer_driver_info_level_3(&il->info_3);
4548 free_spool_printer_driver_info_level_6(&il->info_6);
4553 /*******************************************************************
4554 init a SPOOL_Q_ADDPRINTERDRIVER struct
4555 ******************************************************************/
4556 BOOL make_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u,
4557 const char* srv_name, uint32 level,
4558 PRINTER_DRIVER_CTR *info)
4560 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
4562 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
4563 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
4567 q_u->info.level = level;
4568 q_u->info.ptr = (info!=NULL)?1:0;
4571 /* info level 3 is supported by Windows 95/98,
4574 q_u->info.info_3=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)
4575 malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4576 make_spool_driver_info_3(q_u->info.info_3, info->info3);
4579 /* info level 6 is supported by WinME and Win2k */
4581 /* WRITEME!! will add later --jerry */
4584 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown \
4585 info level [%d]\n", level));
4593 BOOL make_spool_driver_info_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *spool_drv_info,
4594 DRIVER_INFO_3 *info3)
4597 uint16 *ptr = info3->dependentfiles;
4599 BOOL null_char = False;
4601 spool_drv_info->cversion = info3->version;
4602 spool_drv_info->name_ptr = (info3->name.buffer!=NULL)?1:0;
4603 spool_drv_info->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
4604 spool_drv_info->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
4605 spool_drv_info->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
4606 spool_drv_info->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
4607 spool_drv_info->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
4608 spool_drv_info->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
4609 spool_drv_info->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
4611 init_unistr2_from_unistr(&spool_drv_info->name, &info3->name);
4612 init_unistr2_from_unistr(&spool_drv_info->environment, &info3->architecture);
4613 init_unistr2_from_unistr(&spool_drv_info->driverpath, &info3->driverpath);
4614 init_unistr2_from_unistr(&spool_drv_info->datafile, &info3->datafile);
4615 init_unistr2_from_unistr(&spool_drv_info->configfile, &info3->configfile);
4616 init_unistr2_from_unistr(&spool_drv_info->helpfile, &info3->helpfile);
4617 init_unistr2_from_unistr(&spool_drv_info->monitorname, &info3->monitorname);
4618 init_unistr2_from_unistr(&spool_drv_info->defaultdatatype, &info3->defaultdatatype);
4625 /* the null_char BOOL is used to help locate
4626 two '\0's back to back */
4641 spool_drv_info->dependentfiles_ptr = (info3->dependentfiles!=NULL)?1:0;
4642 spool_drv_info->dependentfilessize = len;
4643 make_spool_buffer5(&spool_drv_info->dependentfiles, len, info3->dependentfiles);
4648 void free_spool_driver_info_3 (SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *info)
4652 free_spool_buffer5(&info->dependentfiles);
4658 /*******************************************************************
4659 make a BUFFER5 struct from a uint16*
4660 ******************************************************************/
4661 BOOL make_spool_buffer5(BUFFER5 *buf5, uint32 len, uint16 *src)
4664 buf5->buf_len = len;
4665 if((buf5->buffer=(uint16*)malloc(sizeof(uint16)*len)) == NULL)
4667 DEBUG(0,("make_spool_buffer5: Unable to malloc memory for buffer!\n"));
4671 memcpy(buf5->buffer, src, sizeof(uint16)*len);
4677 void free_spool_buffer5(BUFFER5 *buf)
4688 /*******************************************************************
4689 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
4690 ********************************************************************/
4691 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4693 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4699 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4701 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4706 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4709 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4715 /*******************************************************************
4716 Free the dynamic parts of a printer driver.
4717 ********************************************************************/
4719 void free_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u)
4721 free_spool_printer_driver_info_level(&q_u->info);
4724 /*******************************************************************
4725 ********************************************************************/
4726 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4728 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4731 if(!prs_uint32("status", ps, depth, &q_u->status))
4738 /*******************************************************************
4739 ********************************************************************/
4740 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
4741 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
4743 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
4745 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
4749 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
4757 d->cversion=uni->cversion;
4759 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4760 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4761 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4762 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4763 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4764 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4765 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4766 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4768 DEBUGADD(8,( "version: %d\n", d->cversion));
4769 DEBUGADD(8,( "name: %s\n", d->name));
4770 DEBUGADD(8,( "environment: %s\n", d->environment));
4771 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4772 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4773 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4774 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4775 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4776 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4778 uniarray_2_dosarray(&(uni->dependentfiles), &(d->dependentfiles) );
4783 /*******************************************************************
4784 ********************************************************************/
4785 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
4786 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
4788 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
4790 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
4794 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
4802 d->version=uni->version;
4804 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4805 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4806 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4807 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4808 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4809 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4810 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4811 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4813 DEBUGADD(8,( "version: %d\n", d->version));
4814 DEBUGADD(8,( "name: %s\n", d->name));
4815 DEBUGADD(8,( "environment: %s\n", d->environment));
4816 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4817 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4818 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4819 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4820 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4821 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4823 uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
4824 uniarray_2_dosarray(&uni->previousnames, &d->previousnames );
4829 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
4830 NT_PRINTER_INFO_LEVEL_2 **asc)
4832 NT_PRINTER_INFO_LEVEL_2 *d;
4835 DEBUG(7,("Converting from UNICODE to ASCII\n"));
4836 time_unix=time(NULL);
4839 DEBUGADD(8,("allocating memory\n"));
4841 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
4846 /* we allocate memory iff called from
4847 * addprinter(ex) so we can do one time stuff here.
4849 (*asc)->setuptime=time_unix;
4852 DEBUGADD(8,("start converting\n"));
4856 d->attributes=uni->attributes;
4857 d->priority=uni->priority;
4858 d->default_priority=uni->default_priority;
4859 d->starttime=uni->starttime;
4860 d->untiltime=uni->untiltime;
4861 d->status=uni->status;
4862 d->cjobs=uni->cjobs;
4864 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
4865 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
4866 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
4867 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
4868 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
4869 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
4870 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
4871 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
4872 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
4873 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
4874 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
4879 /*******************************************************************
4881 ********************************************************************/
4882 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
4883 fstring servername, fstring env_name, uint32 level,
4884 NEW_BUFFER *buffer, uint32 offered)
4886 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
4887 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
4891 q_u->offered=offered;
4897 /*******************************************************************
4898 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
4899 ********************************************************************/
4900 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
4902 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
4907 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4909 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
4915 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
4917 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4923 if(!prs_uint32("level", ps, depth, &q_u->level))
4926 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4932 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4938 /*******************************************************************
4939 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
4940 ********************************************************************/
4941 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
4943 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
4949 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4955 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4958 if (!prs_uint32("status", ps, depth, &r_u->status))
4964 /*******************************************************************
4965 ********************************************************************/
4966 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
4968 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
4974 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4980 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4983 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4986 if (!prs_uint32("status", ps, depth, &r_u->status))
4992 /*******************************************************************
4993 ********************************************************************/
4994 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
4996 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5002 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5004 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5010 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5012 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5018 if (!prs_uint32("level", ps, depth, &q_u->level))
5021 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5027 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5033 /*******************************************************************
5034 ********************************************************************/
5035 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5037 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5043 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
5049 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5052 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5055 if (!prs_uint32("status", ps, depth, &r_u->status))
5061 /*******************************************************************
5062 ********************************************************************/
5063 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5065 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5071 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5073 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5079 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5081 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5087 if (!prs_uint32("level", ps, depth, &q_u->level))
5090 if(!new_spoolss_io_buffer("buffer", ps, depth, q_u->buffer))
5096 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5102 /*******************************************************************
5103 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5104 ********************************************************************/
5105 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5107 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5113 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5115 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5121 if (!prs_uint32("level", ps, depth, &q_u->level))
5124 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5130 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5136 /*******************************************************************
5137 ********************************************************************/
5138 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5140 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5146 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
5152 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5155 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5158 if (!prs_uint32("status", ps, depth, &r_u->status))
5164 /*******************************************************************
5165 ********************************************************************/
5166 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5168 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5173 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5175 if(!prs_uint16s(False, "value", ps, depth, r_u->value, r_u->valuesize))
5181 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5184 if(!prs_uint32("type", ps, depth, &r_u->type))
5187 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5189 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5194 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5196 if(!prs_uint32("status", ps, depth, &r_u->status))
5202 /*******************************************************************
5203 ********************************************************************/
5204 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5206 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5211 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5213 if(!prs_uint32("index", ps, depth, &q_u->index))
5215 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5217 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5223 /*******************************************************************
5224 ********************************************************************/
5225 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5226 const POLICY_HND *hnd,
5227 uint32 idx, uint32 valuelen, uint32 datalen)
5229 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5231 q_u->valuesize=valuelen;
5232 q_u->datasize=datalen;
5237 /*******************************************************************
5238 ********************************************************************/
5239 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5241 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5246 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5248 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5254 if(!prs_uint32("type", ps, depth, &q_u->type))
5257 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5266 q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8));
5267 if(q_u->data == NULL)
5269 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5276 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5282 void free_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u)
5284 safe_free(q_u->data);
5287 /*******************************************************************
5288 ********************************************************************/
5289 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5291 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5296 if(!prs_uint32("status", ps, depth, &r_u->status))
5303 /*******************************************************************
5304 ********************************************************************/
5305 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5306 uint32 type, const uint8 *data, uint32 len)
5308 DEBUG(5,("converting a specific param struct\n"));
5312 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5315 ZERO_STRUCTP(*param);
5316 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5318 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5319 (*param)->type = type;
5321 /* le champ data n'est pas NULL termine */
5322 /* on stocke donc la longueur */
5324 (*param)->data_len=len;
5327 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5328 if((*param)->data == NULL)
5330 memcpy((*param)->data, data, len);
5333 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5338 /*******************************************************************
5339 ********************************************************************/
5340 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5342 prs_debug(ps, depth, desc, "spoolss_io_addform");
5349 if(!prs_uint32("flags", ps, depth, &f->flags))
5351 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5353 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5355 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5357 if(!prs_uint32("left", ps, depth, &f->left))
5359 if(!prs_uint32("top", ps, depth, &f->top))
5361 if(!prs_uint32("right", ps, depth, &f->right))
5363 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5366 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5373 /*******************************************************************
5374 ********************************************************************/
5375 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5377 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5382 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5384 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5390 /*******************************************************************
5391 ********************************************************************/
5392 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5394 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5399 if(!prs_uint32("status", ps, depth, &r_u->status))
5405 /*******************************************************************
5406 ********************************************************************/
5407 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
5409 uint32 useless_ptr=0;
5410 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
5415 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5417 if(!prs_uint32("level", ps, depth, &q_u->level))
5419 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5424 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5426 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5433 /*******************************************************************
5434 ********************************************************************/
5435 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
5437 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
5442 if(!prs_uint32("status", ps, depth, &r_u->status))
5448 /*******************************************************************
5449 ********************************************************************/
5450 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
5452 uint32 useless_ptr=0;
5453 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
5458 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5460 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
5466 if(!prs_uint32("level", ps, depth, &q_u->level))
5468 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5473 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5475 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5482 /*******************************************************************
5483 ********************************************************************/
5484 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
5486 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
5491 if(!prs_uint32("status", ps, depth, &r_u->status))
5497 /*******************************************************************
5498 Parse a SPOOL_R_GETJOB structure.
5499 ********************************************************************/
5500 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
5502 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
5508 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
5514 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5517 if (!prs_uint32("status", ps, depth, &r_u->status))
5523 /*******************************************************************
5524 Parse a SPOOL_Q_GETJOB structure.
5525 ********************************************************************/
5526 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
5528 prs_debug(ps, depth, desc, "");
5534 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5536 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
5538 if(!prs_uint32("level", ps, depth, &q_u->level))
5541 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5547 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5553 void free_devmode(DEVICEMODE *devmode)
5555 if (devmode!=NULL) {
5556 safe_free(devmode->private);
5561 void free_printer_info_1(PRINTER_INFO_1 *printer)
5566 void free_printer_info_2(PRINTER_INFO_2 *printer)
5568 if (printer!=NULL) {
5569 free_devmode(printer->devmode);
5570 printer->devmode = NULL;
5571 if (printer->secdesc != NULL)
5572 free_sec_desc(&printer->secdesc);
5577 void free_printer_info_3(PRINTER_INFO_3 *printer)
5579 if (printer!=NULL) {
5580 if (printer->secdesc != NULL)
5581 free_sec_desc(&printer->secdesc);
5586 void free_spool_printer_info_1(SPOOL_PRINTER_INFO_LEVEL_1 *printer)
5591 void free_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 *printer)
5593 if (printer!=NULL) {
5594 if (printer->secdesc != NULL)
5595 free_sec_desc_buf(&printer->secdesc);
5600 void free_spool_printer_info_3(SPOOL_PRINTER_INFO_LEVEL_3 *printer)
5605 void free_spool_printer_info_level(SPOOL_PRINTER_INFO_LEVEL *pil)
5610 switch (pil->level) {
5612 free_spool_printer_info_1(pil->info_1);
5615 free_spool_printer_info_2(pil->info_2);
5618 free_spool_printer_info_3(pil->info_3);
5625 static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from)
5627 PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2));
5630 memcpy(copy, from, sizeof(*copy));
5637 void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries)
5639 void(*fn)(void*) = (void(*)(void*))&free_printer_info_2;
5640 free_void_array(num_entries, (void**)entries, *fn);
5643 PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
5644 const PRINTER_INFO_2 *prt)
5646 void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
5647 return (PRINTER_INFO_2*)add_copy_to_array(len,
5648 (void***)array, (const void*)prt, *fn, True);
5651 static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from)
5653 PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
5656 memcpy(copy, from, sizeof(*copy));
5663 void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries)
5665 void(*fn)(void*) = (void(*)(void*))&free;
5666 free_void_array(num_entries, (void**)entries, *fn);
5669 PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
5670 const PRINTER_INFO_1 *prt)
5672 void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
5673 return (PRINTER_INFO_1*)add_copy_to_array(len,
5674 (void***)array, (const void*)prt, *fn, True);
5677 static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from)
5679 JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
5684 memcpy(copy, from, sizeof(*copy));
5694 void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries)
5696 void(*fn)(void*) = (void(*)(void*))&free;
5697 free_void_array(num_entries, (void**)entries, *fn);
5700 JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
5701 const JOB_INFO_1 *job)
5703 void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
5704 return (JOB_INFO_1*)add_copy_to_array(len,
5705 (void***)array, (const void*)job, *fn, True);
5708 static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from)
5710 JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
5715 memcpy(copy, from, sizeof(*copy));
5725 void free_job_info_2(JOB_INFO_2 *job)
5729 free_devmode(job->devmode);
5734 void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries)
5736 void(*fn)(void*) = (void(*)(void*))&free_job_info_2;
5737 free_void_array(num_entries, (void**)entries, *fn);
5740 JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
5741 const JOB_INFO_2 *job)
5743 void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
5744 return (JOB_INFO_2*)add_copy_to_array(len,
5745 (void***)array, (const void*)job, *fn, True);
5748 /*******************************************************************
5750 ********************************************************************/
5751 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
5752 const fstring string, uint32 printer, uint32 type)
5757 init_unistr2(&q_u->string, string, strlen(string)+1);
5759 q_u->printer=printer;
5768 /*******************************************************************
5769 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
5770 ********************************************************************/
5771 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
5773 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
5779 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
5785 if(!prs_uint32("printer", ps, depth, &q_u->printer))
5787 if(!prs_uint32("type", ps, depth, &q_u->type))
5790 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5792 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5798 /*******************************************************************
5799 Parse a SPOOL_R_REPLYOPENPRINTER structure.
5800 ********************************************************************/
5801 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
5803 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
5809 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5812 if (!prs_uint32("status", ps, depth, &r_u->status))
5818 /*******************************************************************
5820 ********************************************************************/
5821 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
5826 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5831 /*******************************************************************
5832 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
5833 ********************************************************************/
5834 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
5836 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5842 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5848 /*******************************************************************
5849 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
5850 ********************************************************************/
5851 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
5853 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
5859 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5862 if (!prs_uint32("status", ps, depth, &r_u->status))
5868 /*******************************************************************
5870 ********************************************************************/
5871 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
5872 uint32 change_low, uint32 change_high)
5877 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5879 q_u->change_low=change_low;
5880 q_u->change_high=change_high;
5887 q_u->info.version=2;
5888 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
5894 /*******************************************************************
5895 Parse a SPOOL_Q_REPLY_RRPCN structure.
5896 ********************************************************************/
5897 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
5899 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5905 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5908 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
5911 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
5914 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5917 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5920 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
5923 if(q_u->info_ptr!=0)
5924 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
5930 /*******************************************************************
5931 Parse a SPOOL_R_REPLY_RRPCN structure.
5932 ********************************************************************/
5933 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
5935 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
5941 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
5944 if (!prs_uint32("status", ps, depth, &r_u->status))