2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 extern int DEBUGLEVEL;
27 static TDB_CONTEXT *tdb; /* used for driver files */
29 #define FORMS_PREFIX "FORMS/"
30 #define DRIVERS_PREFIX "DRIVERS/"
31 #define PRINTERS_PREFIX "PRINTERS/"
33 #define DATABASE_VERSION 1
35 /****************************************************************************
36 open the NT printing tdb
37 ****************************************************************************/
38 int nt_printing_init(void)
40 static pid_t local_pid;
42 if (tdb && local_pid == sys_getpid()) return True;
43 tdb = tdb_open(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
44 DEBUG(0,("Failed to open nt drivers database\n"));
46 local_pid = sys_getpid();
48 /* handle a Samba upgrade */
50 if (tdb_fetch_int(tdb, "INFO/version") != DATABASE_VERSION) {
51 tdb_traverse(tdb, (tdb_traverse_func)tdb_delete, NULL);
52 tdb_store_int(tdb, "INFO/version", DATABASE_VERSION);
60 /****************************************************************************
61 get a form struct list
62 ****************************************************************************/
63 int get_ntforms(nt_forms_struct **list)
70 for (kbuf = tdb_firstkey(tdb);
72 free(kbuf.dptr), kbuf = tdb_nextkey(tdb, kbuf)) {
73 if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) != 0) continue;
75 dbuf = tdb_fetch(tdb, kbuf);
76 if (!dbuf.dptr) continue;
78 fstrcpy(form.name, kbuf.dptr+strlen(FORMS_PREFIX));
79 ret = tdb_unpack(dbuf.dptr, dbuf.dsize, "ddddddd",
80 &form.flag, &form.width, &form.length, &form.left,
81 &form.top, &form.right, &form.bottom);
83 if (ret != dbuf.dsize) continue;
85 *list = Realloc(*list, sizeof(nt_forms_struct)*(n+1));
93 /****************************************************************************
94 write a form struct list
95 ****************************************************************************/
96 int write_ntforms(nt_forms_struct **list, int number)
103 for (i=0;i<number;i++) {
104 len = tdb_pack(buf, sizeof(buf), "ddddddd",
105 (*list)[i].flag, (*list)[i].width, (*list)[i].length,
106 (*list)[i].left, (*list)[i].top, (*list)[i].right,
108 if (len > sizeof(buf)) break;
109 slprintf(key, sizeof(key), "%s/%s", FORMS_PREFIX, (*list)[i].name);
110 kbuf.dsize = strlen(key)+1;
114 if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) break;
120 /****************************************************************************
121 add a form struct at the end of the list
122 ****************************************************************************/
123 BOOL add_a_form(nt_forms_struct **list, const FORM *form, int *count)
130 * NT tries to add forms even when
131 * they are already in the base
132 * only update the values if already present
137 unistr2_to_ascii(form_name, &(form->name), sizeof(form_name)-1);
138 for (n=0; n<*count && update==False; n++)
140 if (!strncmp((*list)[n].name, form_name, strlen(form_name)))
142 DEBUG(103, ("NT workaround, [%s] already exists\n", form_name));
149 if((*list=Realloc(*list, (n+1)*sizeof(nt_forms_struct))) == NULL)
151 unistr2_to_ascii((*list)[n].name, &(form->name), sizeof((*list)[n].name)-1);
155 (*list)[n].flag=form->flags;
156 (*list)[n].width=form->size_x;
157 (*list)[n].length=form->size_y;
158 (*list)[n].left=form->left;
159 (*list)[n].top=form->top;
160 (*list)[n].right=form->right;
161 (*list)[n].bottom=form->bottom;
166 /****************************************************************************
168 ****************************************************************************/
169 void update_a_form(nt_forms_struct **list, const FORM *form, int count)
173 unistr2_to_ascii(form_name, &(form->name), sizeof(form_name)-1);
175 DEBUG(106, ("[%s]\n", form_name));
176 for (n=0; n<count; n++)
178 DEBUGADD(106, ("n [%d]:[%s]\n", n, (*list)[n].name));
179 if (!strncmp((*list)[n].name, form_name, strlen(form_name)))
183 if (n==count) return;
185 (*list)[n].flag=form->flags;
186 (*list)[n].width=form->size_x;
187 (*list)[n].length=form->size_y;
188 (*list)[n].left=form->left;
189 (*list)[n].top=form->top;
190 (*list)[n].right=form->right;
191 (*list)[n].bottom=form->bottom;
194 /****************************************************************************
195 get the nt drivers list
197 traverse the database and look-up the matching names
198 ****************************************************************************/
199 int get_ntdrivers(fstring **list, char *architecture)
206 get_short_archi(short_archi, architecture);
207 slprintf(key, sizeof(key), "%s/%s/", DRIVERS_PREFIX, short_archi);
209 for (kbuf = tdb_firstkey(tdb);
211 free(kbuf.dptr), kbuf = tdb_nextkey(tdb, kbuf)) {
212 if (strncmp(kbuf.dptr, key, strlen(key)) != 0) continue;
214 if((*list = Realloc(*list, sizeof(fstring)*(total+1))) == NULL)
217 fstrcpy((*list)[total], kbuf.dptr+strlen(key));
224 /****************************************************************************
225 function to do the mapping between the long architecture name and
227 ****************************************************************************/
228 void get_short_archi(char *short_archi, char *long_archi)
235 struct table archi_table[]=
237 {"Windows 4.0", "WIN40" },
238 {"Windows NT x86", "W32X86" },
239 {"Windows NT R4000", "W32mips" },
240 {"Windows NT Alpha_AXP", "W32alpha" },
241 {"Windows NT PowerPC", "W32ppc" },
247 DEBUG(107,("Getting architecture dependant directory\n"));
250 } while ( (archi_table[i].long_archi!=NULL ) && strncmp(long_archi, archi_table[i].long_archi, strlen(long_archi)) );
252 if (archi_table[i].long_archi==NULL)
254 DEBUGADD(107,("Unknown architecture [%s] !\n", long_archi));
256 StrnCpy (short_archi, archi_table[i].short_archi, strlen(archi_table[i].short_archi));
258 DEBUGADD(108,("index: [%d]\n", i));
259 DEBUGADD(108,("long architecture: [%s]\n", long_archi));
260 DEBUGADD(108,("short architecture: [%s]\n", short_archi));
263 /****************************************************************************
264 ****************************************************************************/
265 static uint32 add_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 *driver)
268 fstring architecture;
274 get_short_archi(architecture, driver->environment);
275 slprintf(key, sizeof(key), "%s/%s/%s", DRIVERS_PREFIX, architecture, driver->name);
278 * cversion must be 2.
279 * when adding a printer ON the SERVER
280 * rpcAddPrinterDriver defines it to zero
292 len += tdb_pack(buf+len, buflen-len, "dffffffff",
301 driver->defaultdatatype);
303 if (driver->dependentfiles) {
304 for (i=0; *driver->dependentfiles[i]; i++) {
305 len += tdb_pack(buf+len, buflen-len, "f",
306 driver->dependentfiles[i]);
311 buf = (char *)Realloc(buf, len);
318 kbuf.dsize = strlen(key)+1;
322 ret = tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
328 /****************************************************************************
329 ****************************************************************************/
330 static uint32 add_a_printer_driver_6(NT_PRINTER_DRIVER_INFO_LEVEL_6 *driver)
332 NT_PRINTER_DRIVER_INFO_LEVEL_3 info3;
334 info3.cversion = driver->version;
335 fstrcpy(info3.environment,driver->environment);
336 fstrcpy(info3.driverpath,driver->driverpath);
337 fstrcpy(info3.datafile,driver->datafile);
338 fstrcpy(info3.configfile,driver->configfile);
339 fstrcpy(info3.helpfile,driver->helpfile);
340 fstrcpy(info3.monitorname,driver->monitorname);
341 fstrcpy(info3.defaultdatatype,driver->defaultdatatype);
342 info3.dependentfiles = driver->dependentfiles;
344 return add_a_printer_driver_3(&info3);
348 /****************************************************************************
349 ****************************************************************************/
350 static uint32 get_a_printer_driver_3_default(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, fstring in_prt, fstring in_arch)
352 NT_PRINTER_DRIVER_INFO_LEVEL_3 info;
357 snum = lp_servicenumber(in_prt);
359 fstrcpy(info.name, lp_printerdriver(snum));
360 fstrcpy(info.defaultdatatype, "RAW");
362 info.dependentfiles=(fstring *)malloc(sizeof(fstring));
363 fstrcpy(info.dependentfiles[0], "");
365 *info_ptr = memdup(&info, sizeof(info));
370 /****************************************************************************
371 ****************************************************************************/
372 static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, fstring in_prt, fstring in_arch)
374 NT_PRINTER_DRIVER_INFO_LEVEL_3 driver;
376 fstring architecture;
383 get_short_archi(architecture, in_arch);
384 slprintf(key, sizeof(key), "%s/%s/%s", DRIVERS_PREFIX, architecture, in_prt);
387 kbuf.dsize = strlen(key)+1;
389 dbuf = tdb_fetch(tdb, kbuf);
390 if (!dbuf.dptr) return get_a_printer_driver_3_default(info_ptr, in_prt, in_arch);
392 len += tdb_unpack(dbuf.dptr, dbuf.dsize, "dffffffff",
401 driver.defaultdatatype);
404 while (len < dbuf.dsize) {
405 driver.dependentfiles = (fstring *)Realloc(driver.dependentfiles,
406 sizeof(fstring)*(i+2));
407 len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "f",
408 driver.dependentfiles[i]);
411 fstrcpy(driver.dependentfiles[i], "");
417 /****************************************************************************
418 debugging function, dump at level 6 the struct in the logs
419 ****************************************************************************/
420 static uint32 dump_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
423 NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3;
426 DEBUG(106,("Dumping printer driver at level [%d]\n", level));
432 if (driver.info_3 == NULL)
437 DEBUGADD(106,("version:[%d]\n", info3->cversion));
438 DEBUGADD(106,("name:[%s]\n", info3->name));
439 DEBUGADD(106,("environment:[%s]\n", info3->environment));
440 DEBUGADD(106,("driverpath:[%s]\n", info3->driverpath));
441 DEBUGADD(106,("datafile:[%s]\n", info3->datafile));
442 DEBUGADD(106,("configfile:[%s]\n", info3->configfile));
443 DEBUGADD(106,("helpfile:[%s]\n", info3->helpfile));
444 DEBUGADD(106,("monitorname:[%s]\n", info3->monitorname));
445 DEBUGADD(106,("defaultdatatype:[%s]\n", info3->defaultdatatype));
447 for (i=0; *info3->dependentfiles[i]; i++) {
448 DEBUGADD(106,("dependentfile:[%s]\n",
449 info3->dependentfiles[i]));
456 DEBUGADD(1,("Level not implemented\n"));
464 /****************************************************************************
465 ****************************************************************************/
466 static int pack_devicemode(NT_DEVICEMODE *nt_devmode, char *buf, int buflen)
470 len += tdb_pack(buf+len, buflen-len, "p", nt_devmode);
472 if (!nt_devmode) return len;
474 len += tdb_pack(buf+len, buflen-len, "fddddddddddddddddddddddp",
475 nt_devmode->formname,
476 nt_devmode->specversion,
477 nt_devmode->driverversion,
479 nt_devmode->driverextra,
481 nt_devmode->orientation,
482 nt_devmode->papersize,
483 nt_devmode->paperlength,
484 nt_devmode->paperwidth,
487 nt_devmode->defaultsource,
488 nt_devmode->printquality,
491 nt_devmode->yresolution,
492 nt_devmode->ttoption,
494 nt_devmode->icmmethod,
495 nt_devmode->icmintent,
496 nt_devmode->mediatype,
497 nt_devmode->dithertype,
498 nt_devmode->private);
500 if (nt_devmode->private) {
501 len += tdb_pack(buf+len, buflen-len, "B",
502 nt_devmode->driverextra,
503 nt_devmode->private);
509 /****************************************************************************
510 ****************************************************************************/
511 static int pack_specifics(NT_PRINTER_PARAM *param, char *buf, int buflen)
515 while (param != NULL) {
516 len += tdb_pack(buf+len, buflen-len, "pfdB",
525 len += tdb_pack(buf+len, buflen-len, "p", param);
531 /****************************************************************************
532 delete a printer - this just deletes the printer info file, any open
533 handles are not affected
534 ****************************************************************************/
535 uint32 del_a_printer(char *portname)
540 slprintf(key, sizeof(key), "%s/%s",
541 PRINTERS_PREFIX, portname);
544 kbuf.dsize=strlen(key)+1;
546 tdb_delete(tdb, kbuf);
550 /****************************************************************************
551 ****************************************************************************/
552 static uint32 add_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info)
556 int buflen, len, ret;
560 * in addprinter: no servername and the printer is the name
561 * in setprinter: servername is \\server
562 * and printer is \\server\\printer
564 * Samba manages only local printers.
565 * we currently don't support things like path=\\other_server\printer
567 if (info->servername[0]!='\0')
569 trim_string(info->printername, info->servername, NULL);
570 trim_string(info->printername, "\\", NULL);
571 info->servername[0]='\0';
575 * JFM: one day I'll forget.
576 * below that's info->portname because that's the SAMBA sharename
577 * and I made NT 'thinks' it's the portname
578 * the info->sharename is the thing you can name when you add a printer
579 * that's the short-name when you create shared printer for 95/98
580 * So I've made a limitation in SAMBA: you can only have 1 printer model
581 * behind a SAMBA share.
590 len += tdb_pack(buf+len, buflen-len, "dddddddddddffffffffff",
593 info->default_priority,
609 info->printprocessor,
613 len += pack_devicemode(info->devmode, buf+len, buflen-len);
614 len += pack_specifics(info->specific, buf+len, buflen-len);
617 buf = (char *)Realloc(buf, len);
623 slprintf(key, sizeof(key), "%s/%s",
624 PRINTERS_PREFIX, info->portname);
627 kbuf.dsize = strlen(key)+1;
631 ret = tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
639 /****************************************************************************
640 ****************************************************************************/
641 BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param)
643 NT_PRINTER_PARAM *current;
645 DEBUG(108,("add_a_specific_param\n"));
649 if (info_2->specific == NULL)
651 info_2->specific=param;
655 current=info_2->specific;
656 while (current->next != NULL) {
657 current=current->next;
664 /****************************************************************************
665 ****************************************************************************/
666 BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param)
668 NT_PRINTER_PARAM *current;
669 NT_PRINTER_PARAM *previous;
671 current=info_2->specific;
674 if (current==NULL) return (False);
676 if ( !strcmp(current->value, param->value) &&
677 (strlen(current->value)==strlen(param->value)) )
679 DEBUG(109,("deleting first value\n"));
680 info_2->specific=current->next;
681 safe_free(current->data);
683 DEBUG(109,("deleted first value\n"));
687 current=previous->next;
689 while ( current!=NULL )
691 if (!strcmp(current->value, param->value) &&
692 strlen(current->value)==strlen(param->value) )
694 DEBUG(109,("deleting current value\n"));
695 previous->next=current->next;
697 DEBUG(109,("deleted current value\n"));
701 previous=previous->next;
702 current=current->next;
707 /****************************************************************************
708 Clean up and deallocate a (maybe partially) allocated NT_PRINTER_PARAM.
709 ****************************************************************************/
710 static void free_nt_printer_param(NT_PRINTER_PARAM **param_ptr)
712 NT_PRINTER_PARAM *param = *param_ptr;
717 DEBUG(106,("free_nt_printer_param: deleting param [%s]\n", param->value));
726 /****************************************************************************
727 Clean up and deallocate a (maybe partially) allocated NT_DEVICEMODE.
728 ****************************************************************************/
729 static void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr)
731 NT_DEVICEMODE *nt_devmode = *devmode_ptr;
733 if(nt_devmode == NULL)
736 DEBUG(106,("free_nt_devicemode: deleting DEVMODE\n"));
738 if(nt_devmode->private)
739 free(nt_devmode->private);
745 /****************************************************************************
746 Clean up and deallocate a (maybe partially) allocated NT_PRINTER_INFO_LEVEL_2.
747 ****************************************************************************/
748 static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr)
750 NT_PRINTER_INFO_LEVEL_2 *info = *info_ptr;
751 NT_PRINTER_PARAM *param_ptr;
756 DEBUG(106,("free_nt_printer_info_level_2: deleting info\n"));
758 free_nt_devicemode(&info->devmode);
759 free_sec_desc_buf(&info->secdesc);
761 for(param_ptr = info->specific; param_ptr; ) {
762 NT_PRINTER_PARAM *tofree = param_ptr;
764 param_ptr = param_ptr->next;
765 free_nt_printer_param(&tofree);
773 /****************************************************************************
774 ****************************************************************************/
775 static int unpack_devicemode(NT_DEVICEMODE **nt_devmode, char *buf, int buflen)
778 NT_DEVICEMODE devmode;
780 ZERO_STRUCT(devmode);
782 len += tdb_unpack(buf+len, buflen-len, "p", *nt_devmode);
784 if (!*nt_devmode) return len;
786 len += tdb_unpack(buf+len, buflen-len, "fddddddddddddddddddddddp",
788 &devmode.specversion,
789 &devmode.driverversion,
791 &devmode.driverextra,
793 &devmode.orientation,
795 &devmode.paperlength,
799 &devmode.defaultsource,
800 &devmode.printquality,
803 &devmode.yresolution,
812 if (devmode.private) {
813 devmode.private = (uint8 *)malloc(devmode.driverextra);
814 if (!devmode.private) return 2;
815 len += tdb_unpack(buf+len, buflen-len, "B",
820 *nt_devmode = (NT_DEVICEMODE *)memdup(&devmode, sizeof(devmode));
825 /****************************************************************************
826 ****************************************************************************/
827 static int unpack_specifics(NT_PRINTER_PARAM **list, char *buf, int buflen)
830 NT_PRINTER_PARAM param, *p;
835 len += tdb_unpack(buf+len, buflen-len, "p", &p);
838 len += tdb_unpack(buf+len, buflen-len, "fdB",
844 *list = memdup(¶m, sizeof(param));
851 /****************************************************************************
852 get a default printer info 2 struct
853 ****************************************************************************/
854 static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename)
856 extern pstring global_myname;
858 NT_PRINTER_INFO_LEVEL_2 info;
859 NT_DEVICEMODE devmode;
862 ZERO_STRUCT(devmode);
864 init_devicemode(&devmode);
866 snum = lp_servicenumber(sharename);
868 fstrcpy(info.servername, global_myname);
869 fstrcpy(info.printername, sharename);
870 fstrcpy(info.portname, sharename);
871 fstrcpy(info.drivername, lp_printerdriver(snum));
872 fstrcpy(info.printprocessor, "winprint");
873 fstrcpy(info.datatype, "RAW");
875 info.devmode = (NT_DEVICEMODE *)memdup(&devmode, sizeof(devmode));
878 * put a better system here, please.
880 info.secdesc.len = 0; /* convertperms_unix_to_sd(&sbuf, False,
882 &info.secdesc.sec); */
883 info.secdesc.max_len = info.secdesc.len;
885 *info_ptr = (NT_PRINTER_INFO_LEVEL_2 *)memdup(&info, sizeof(info));
886 if (! *info_ptr) return 2;
891 /****************************************************************************
892 ****************************************************************************/
893 static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename)
896 NT_PRINTER_INFO_LEVEL_2 info;
902 slprintf(key, sizeof(key), "%s/%s",
903 PRINTERS_PREFIX, sharename);
906 kbuf.dsize = strlen(key)+1;
908 dbuf = tdb_fetch(tdb, kbuf);
909 if (!dbuf.dptr) return get_a_printer_2_default(info_ptr, sharename);
911 len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "dddddddddddffffffffff",
914 &info.default_priority,
934 len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len);
936 len += unpack_secdesc(&info.devmode,dbuf.dptr+len, dbuf.dsize-len);
938 len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len);
940 *info_ptr=memdup(&info, sizeof(info));
945 /****************************************************************************
946 debugging function, dump at level 6 the struct in the logs
947 ****************************************************************************/
948 static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
951 NT_PRINTER_INFO_LEVEL_2 *info2;
953 DEBUG(106,("Dumping printer at level [%d]\n", level));
959 if (printer.info_2 == NULL)
963 info2=printer.info_2;
965 DEBUGADD(106,("attributes:[%d]\n", info2->attributes));
966 DEBUGADD(106,("priority:[%d]\n", info2->priority));
967 DEBUGADD(106,("default_priority:[%d]\n", info2->default_priority));
968 DEBUGADD(106,("starttime:[%d]\n", info2->starttime));
969 DEBUGADD(106,("untiltime:[%d]\n", info2->untiltime));
970 DEBUGADD(106,("status:[%d]\n", info2->status));
971 DEBUGADD(106,("cjobs:[%d]\n", info2->cjobs));
972 DEBUGADD(106,("averageppm:[%d]\n", info2->averageppm));
973 DEBUGADD(106,("changeid:[%d]\n", info2->changeid));
974 DEBUGADD(106,("c_setprinter:[%d]\n", info2->c_setprinter));
975 DEBUGADD(106,("setuptime:[%d]\n", info2->setuptime));
977 DEBUGADD(106,("servername:[%s]\n", info2->servername));
978 DEBUGADD(106,("printername:[%s]\n", info2->printername));
979 DEBUGADD(106,("sharename:[%s]\n", info2->sharename));
980 DEBUGADD(106,("portname:[%s]\n", info2->portname));
981 DEBUGADD(106,("drivername:[%s]\n", info2->drivername));
982 DEBUGADD(106,("location:[%s]\n", info2->location));
983 DEBUGADD(106,("sepfile:[%s]\n", info2->sepfile));
984 DEBUGADD(106,("printprocessor:[%s]\n", info2->printprocessor));
985 DEBUGADD(106,("datatype:[%s]\n", info2->datatype));
986 DEBUGADD(106,("parameters:[%s]\n", info2->parameters));
992 DEBUGADD(1,("Level not implemented\n"));
1001 * The function below are the high level ones.
1002 * only those ones must be called from the spoolss code.
1007 /****************************************************************************
1008 ****************************************************************************/
1009 uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
1013 dump_a_printer(printer, level);
1019 success=add_a_printer_2(printer.info_2);
1030 /****************************************************************************
1031 ****************************************************************************/
1032 uint32 get_a_printer(NT_PRINTER_INFO_LEVEL *printer, uint32 level, fstring sharename)
1036 DEBUG(10,("get_a_printer: [%s] level %u\n", sharename, (unsigned int)level));
1042 printer->info_2=NULL;
1043 success=get_a_printer_2(&(printer->info_2), sharename);
1051 dump_a_printer(*printer, level);
1053 DEBUG(10,("get_a_printer: [%s] level %u returning %u\n", sharename, (unsigned int)level, (unsigned int)success));
1058 /****************************************************************************
1059 ****************************************************************************/
1060 uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
1063 DEBUG(104,("freeing a printer at level [%d]\n", level));
1069 if (printer.info_2 != NULL)
1071 free_nt_printer_info_level_2(&printer.info_2);
1087 /****************************************************************************
1088 ****************************************************************************/
1089 uint32 add_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
1092 DEBUG(104,("adding a printer at level [%d]\n", level));
1093 dump_a_printer_driver(driver, level);
1099 success=add_a_printer_driver_3(driver.info_3);
1105 success=add_a_printer_driver_6(driver.info_6);
1115 /****************************************************************************
1116 ****************************************************************************/
1117 uint32 get_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL *driver, uint32 level,
1118 fstring printername, fstring architecture)
1126 success=get_a_printer_driver_3(&(driver->info_3),
1136 if (success == 0) dump_a_printer_driver(*driver, level);
1140 /****************************************************************************
1141 ****************************************************************************/
1142 uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
1145 NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3;
1151 if (driver.info_3 != NULL)
1153 info3=driver.info_3;
1154 if (info3->dependentfiles)
1155 free(info3->dependentfiles);
1157 ZERO_STRUCTP(info3);
1173 /****************************************************************************
1174 ****************************************************************************/
1175 BOOL get_specific_param_by_index(NT_PRINTER_INFO_LEVEL printer, uint32 level, uint32 param_index,
1176 fstring value, uint8 **data, uint32 *type, uint32 *len)
1178 /* right now that's enough ! */
1179 NT_PRINTER_PARAM *param;
1182 param=printer.info_2->specific;
1184 while (param != NULL && i <= param_index)
1193 /* exited because it exist */
1195 StrnCpy(value, param->value, sizeof(fstring)-1);
1196 *data=(uint8 *)malloc(param->data_len*sizeof(uint8));
1199 memcpy(*data, param->data, param->data_len);
1200 *len=param->data_len;
1204 /****************************************************************************
1205 ****************************************************************************/
1206 BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
1207 fstring value, uint8 **data, uint32 *type, uint32 *len)
1209 /* right now that's enough ! */
1210 NT_PRINTER_PARAM *param;
1212 DEBUG(105, ("get_specific_param\n"));
1214 param=printer.info_2->specific;
1216 while (param != NULL)
1218 if ( !strcmp(value, param->value)
1219 && strlen(value)==strlen(param->value))
1225 DEBUG(106, ("found one param\n"));
1228 /* exited because it exist */
1231 *data=(uint8 *)malloc(param->data_len*sizeof(uint8));
1234 memcpy(*data, param->data, param->data_len);
1235 *len=param->data_len;
1237 DEBUG(106, ("exit of get_specific_param:true\n"));
1240 DEBUG(106, ("exit of get_specific_param:false\n"));
1244 /****************************************************************************
1245 ****************************************************************************/
1246 void init_devicemode(NT_DEVICEMODE *nt_devmode)
1249 * should I init this ones ???
1250 nt_devmode->devicename
1252 fstrcpy(nt_devmode->formname, "A4");
1254 nt_devmode->specversion = 0x0401;
1255 nt_devmode->driverversion = 0x0400;
1256 nt_devmode->size = 0x00DC;
1257 nt_devmode->driverextra = 0x0000;
1258 nt_devmode->fields = FORMNAME | TTOPTION | PRINTQUALITY |
1259 DEFAULTSOURCE | COPIES | SCALE |
1260 PAPERSIZE | ORIENTATION;
1261 nt_devmode->orientation = 1;
1262 nt_devmode->papersize = PAPER_A4;
1263 nt_devmode->paperlength = 0;
1264 nt_devmode->paperwidth = 0;
1265 nt_devmode->scale = 0x64;
1266 nt_devmode->copies = 01;
1267 nt_devmode->defaultsource = BIN_FORMSOURCE;
1268 nt_devmode->printquality = 0x0258;
1269 nt_devmode->color = COLOR_MONOCHROME;
1270 nt_devmode->duplex = DUP_SIMPLEX;
1271 nt_devmode->yresolution = 0;
1272 nt_devmode->ttoption = TT_SUBDEV;
1273 nt_devmode->collate = COLLATE_FALSE;
1274 nt_devmode->icmmethod = 0;
1275 nt_devmode->icmintent = 0;
1276 nt_devmode->mediatype = 0;
1277 nt_devmode->dithertype = 0;
1279 /* non utilisés par un driver d'imprimante */
1280 nt_devmode->logpixels = 0;
1281 nt_devmode->bitsperpel = 0;
1282 nt_devmode->pelswidth = 0;
1283 nt_devmode->pelsheight = 0;
1284 nt_devmode->displayflags = 0;
1285 nt_devmode->displayfrequency = 0;
1286 nt_devmode->reserved1 = 0;
1287 nt_devmode->reserved2 = 0;
1288 nt_devmode->panningwidth = 0;
1289 nt_devmode->panningheight = 0;
1291 nt_devmode->private=NULL;
1297 1: level not implemented
1298 2: file doesn't exist
1299 3: can't allocate memory
1300 4: can't free memory
1301 5: non existant struct
1305 A printer and a printer driver are 2 different things.
1306 NT manages them separatelly, Samba does the same.
1307 Why ? Simply because it's easier and it makes sense !
1309 Now explanation: You have 3 printers behind your samba server,
1310 2 of them are the same make and model (laser A and B). But laser B
1311 has an 3000 sheet feeder and laser A doesn't such an option.
1312 Your third printer is an old dot-matrix model for the accounting :-).
1314 If the /usr/local/samba/lib directory (default dir), you will have
1315 5 files to describe all of this.
1317 3 files for the printers (1 by printer):
1320 NTprinter_accounting
1321 2 files for the drivers (1 for the laser and 1 for the dot matrix)
1322 NTdriver_printer model X
1323 NTdriver_printer model Y
1325 jfm: I should use this comment for the text file to explain
1326 same thing for the forms BTW.
1327 Je devrais mettre mes commentaires en francais, ca serait mieux :-)