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 BOOL 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);
45 DEBUG(0,("Failed to open nt drivers database\n"));
49 local_pid = sys_getpid();
51 /* handle a Samba upgrade */
53 if (tdb_fetch_int(tdb, "INFO/version") != DATABASE_VERSION) {
54 tdb_traverse(tdb, (tdb_traverse_func)tdb_delete, NULL);
55 tdb_store_int(tdb, "INFO/version", DATABASE_VERSION);
63 /****************************************************************************
64 get a form struct list
65 ****************************************************************************/
66 int get_ntforms(nt_forms_struct **list)
68 TDB_DATA kbuf, newkey, dbuf;
73 for (kbuf = tdb_firstkey(tdb);
75 newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
76 if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) != 0) continue;
78 dbuf = tdb_fetch(tdb, kbuf);
79 if (!dbuf.dptr) continue;
81 fstrcpy(form.name, kbuf.dptr+strlen(FORMS_PREFIX));
82 ret = tdb_unpack(dbuf.dptr, dbuf.dsize, "ddddddd",
83 &form.flag, &form.width, &form.length, &form.left,
84 &form.top, &form.right, &form.bottom);
86 if (ret != dbuf.dsize) continue;
88 *list = Realloc(*list, sizeof(nt_forms_struct)*(n+1));
96 /****************************************************************************
97 write a form struct list
98 ****************************************************************************/
99 int write_ntforms(nt_forms_struct **list, int number)
106 for (i=0;i<number;i++) {
107 len = tdb_pack(buf, sizeof(buf), "ddddddd",
108 (*list)[i].flag, (*list)[i].width, (*list)[i].length,
109 (*list)[i].left, (*list)[i].top, (*list)[i].right,
111 if (len > sizeof(buf)) break;
112 slprintf(key, sizeof(key), "%s/%s", FORMS_PREFIX, (*list)[i].name);
113 kbuf.dsize = strlen(key)+1;
117 if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) break;
123 /****************************************************************************
124 add a form struct at the end of the list
125 ****************************************************************************/
126 BOOL add_a_form(nt_forms_struct **list, const FORM *form, int *count)
133 * NT tries to add forms even when
134 * they are already in the base
135 * only update the values if already present
140 unistr2_to_ascii(form_name, &(form->name), sizeof(form_name)-1);
141 for (n=0; n<*count && update==False; n++)
143 if (!strncmp((*list)[n].name, form_name, strlen(form_name)))
145 DEBUG(103, ("NT workaround, [%s] already exists\n", form_name));
152 if((*list=Realloc(*list, (n+1)*sizeof(nt_forms_struct))) == NULL)
154 unistr2_to_ascii((*list)[n].name, &(form->name), sizeof((*list)[n].name)-1);
158 (*list)[n].flag=form->flags;
159 (*list)[n].width=form->size_x;
160 (*list)[n].length=form->size_y;
161 (*list)[n].left=form->left;
162 (*list)[n].top=form->top;
163 (*list)[n].right=form->right;
164 (*list)[n].bottom=form->bottom;
169 /****************************************************************************
171 ****************************************************************************/
172 void update_a_form(nt_forms_struct **list, const FORM *form, int count)
176 unistr2_to_ascii(form_name, &(form->name), sizeof(form_name)-1);
178 DEBUG(106, ("[%s]\n", form_name));
179 for (n=0; n<count; n++)
181 DEBUGADD(106, ("n [%d]:[%s]\n", n, (*list)[n].name));
182 if (!strncmp((*list)[n].name, form_name, strlen(form_name)))
186 if (n==count) return;
188 (*list)[n].flag=form->flags;
189 (*list)[n].width=form->size_x;
190 (*list)[n].length=form->size_y;
191 (*list)[n].left=form->left;
192 (*list)[n].top=form->top;
193 (*list)[n].right=form->right;
194 (*list)[n].bottom=form->bottom;
197 /****************************************************************************
198 get the nt drivers list
200 traverse the database and look-up the matching names
201 ****************************************************************************/
202 int get_ntdrivers(fstring **list, char *architecture)
207 TDB_DATA kbuf, newkey;
209 get_short_archi(short_archi, architecture);
210 slprintf(key, sizeof(key), "%s/%s/", DRIVERS_PREFIX, short_archi);
212 for (kbuf = tdb_firstkey(tdb);
214 newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
215 if (strncmp(kbuf.dptr, key, strlen(key)) != 0) continue;
217 if((*list = Realloc(*list, sizeof(fstring)*(total+1))) == NULL)
220 fstrcpy((*list)[total], kbuf.dptr+strlen(key));
227 /****************************************************************************
228 function to do the mapping between the long architecture name and
230 ****************************************************************************/
231 void get_short_archi(char *short_archi, char *long_archi)
238 struct table archi_table[]=
240 {"Windows 4.0", "WIN40" },
241 {"Windows NT x86", "W32X86" },
242 {"Windows NT R4000", "W32mips" },
243 {"Windows NT Alpha_AXP", "W32alpha" },
244 {"Windows NT PowerPC", "W32ppc" },
250 DEBUG(107,("Getting architecture dependant directory\n"));
253 } while ( (archi_table[i].long_archi!=NULL ) && strncmp(long_archi, archi_table[i].long_archi, strlen(long_archi)) );
255 if (archi_table[i].long_archi==NULL)
257 DEBUGADD(107,("Unknown architecture [%s] !\n", long_archi));
259 StrnCpy (short_archi, archi_table[i].short_archi, strlen(archi_table[i].short_archi));
261 DEBUGADD(108,("index: [%d]\n", i));
262 DEBUGADD(108,("long architecture: [%s]\n", long_archi));
263 DEBUGADD(108,("short architecture: [%s]\n", short_archi));
266 /****************************************************************************
267 ****************************************************************************/
268 static uint32 add_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 *driver)
271 fstring architecture;
277 get_short_archi(architecture, driver->environment);
278 slprintf(key, sizeof(key), "%s/%s/%s", DRIVERS_PREFIX, architecture, driver->name);
281 * cversion must be 2.
282 * when adding a printer ON the SERVER
283 * rpcAddPrinterDriver defines it to zero
295 len += tdb_pack(buf+len, buflen-len, "dffffffff",
304 driver->defaultdatatype);
306 if (driver->dependentfiles) {
307 for (i=0; *driver->dependentfiles[i]; i++) {
308 len += tdb_pack(buf+len, buflen-len, "f",
309 driver->dependentfiles[i]);
314 buf = (char *)Realloc(buf, len);
321 kbuf.dsize = strlen(key)+1;
325 ret = tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
331 /****************************************************************************
332 ****************************************************************************/
333 static uint32 add_a_printer_driver_6(NT_PRINTER_DRIVER_INFO_LEVEL_6 *driver)
335 NT_PRINTER_DRIVER_INFO_LEVEL_3 info3;
337 info3.cversion = driver->version;
338 fstrcpy(info3.environment,driver->environment);
339 fstrcpy(info3.driverpath,driver->driverpath);
340 fstrcpy(info3.datafile,driver->datafile);
341 fstrcpy(info3.configfile,driver->configfile);
342 fstrcpy(info3.helpfile,driver->helpfile);
343 fstrcpy(info3.monitorname,driver->monitorname);
344 fstrcpy(info3.defaultdatatype,driver->defaultdatatype);
345 info3.dependentfiles = driver->dependentfiles;
347 return add_a_printer_driver_3(&info3);
351 /****************************************************************************
352 ****************************************************************************/
353 static uint32 get_a_printer_driver_3_default(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, fstring in_prt, fstring in_arch)
355 NT_PRINTER_DRIVER_INFO_LEVEL_3 info;
360 snum = lp_servicenumber(in_prt);
362 fstrcpy(info.name, lp_printerdriver(snum));
363 fstrcpy(info.defaultdatatype, "RAW");
365 if ((info.dependentfiles=(char *)malloc(sizeof(fstring))) == NULL)
366 return ERROR_NOT_ENOUGH_MEMORY;
368 fstrcpy(info.dependentfiles[0], "");
370 *info_ptr = memdup(&info, sizeof(info));
375 /****************************************************************************
376 ****************************************************************************/
377 static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, fstring in_prt, fstring in_arch)
379 NT_PRINTER_DRIVER_INFO_LEVEL_3 driver;
381 fstring architecture;
388 get_short_archi(architecture, in_arch);
389 slprintf(key, sizeof(key), "%s/%s/%s", DRIVERS_PREFIX, architecture, in_prt);
392 kbuf.dsize = strlen(key)+1;
394 dbuf = tdb_fetch(tdb, kbuf);
395 if (!dbuf.dptr) return get_a_printer_driver_3_default(info_ptr, in_prt, in_arch);
397 len += tdb_unpack(dbuf.dptr, dbuf.dsize, "dffffffff",
406 driver.defaultdatatype);
409 while (len < dbuf.dsize) {
410 driver.dependentfiles = (fstring *)Realloc(driver.dependentfiles,
411 sizeof(fstring)*(i+2));
412 if (driver.dependentfiles == NULL)
415 len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "f",
416 &driver.dependentfiles[i]);
419 if (driver.dependentfiles != NULL)
420 fstrcpy(driver.dependentfiles[i], "");
422 safe_free(dbuf.dptr);
424 if (len != dbuf.dsize) {
425 if (driver.dependentfiles != NULL)
426 safe_free(driver.dependentfiles);
428 return get_a_printer_driver_3_default(info_ptr, in_prt, in_arch);
431 *info_ptr = (NT_PRINTER_DRIVER_INFO_LEVEL_3 *)memdup(&driver, sizeof(driver));
436 /****************************************************************************
437 debugging function, dump at level 6 the struct in the logs
438 ****************************************************************************/
439 static uint32 dump_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
442 NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3;
445 DEBUG(106,("Dumping printer driver at level [%d]\n", level));
451 if (driver.info_3 == NULL)
456 DEBUGADD(106,("version:[%d]\n", info3->cversion));
457 DEBUGADD(106,("name:[%s]\n", info3->name));
458 DEBUGADD(106,("environment:[%s]\n", info3->environment));
459 DEBUGADD(106,("driverpath:[%s]\n", info3->driverpath));
460 DEBUGADD(106,("datafile:[%s]\n", info3->datafile));
461 DEBUGADD(106,("configfile:[%s]\n", info3->configfile));
462 DEBUGADD(106,("helpfile:[%s]\n", info3->helpfile));
463 DEBUGADD(106,("monitorname:[%s]\n", info3->monitorname));
464 DEBUGADD(106,("defaultdatatype:[%s]\n", info3->defaultdatatype));
466 for (i=0; info3->dependentfiles &&
467 *info3->dependentfiles[i]; i++) {
468 DEBUGADD(106,("dependentfile:[%s]\n",
469 info3->dependentfiles[i]));
476 DEBUGADD(1,("Level not implemented\n"));
484 /****************************************************************************
485 ****************************************************************************/
486 static int pack_devicemode(NT_DEVICEMODE *nt_devmode, char *buf, int buflen)
490 len += tdb_pack(buf+len, buflen-len, "p", nt_devmode);
492 if (!nt_devmode) return len;
494 len += tdb_pack(buf+len, buflen-len, "fddddddddddddddddddddddp",
495 nt_devmode->formname,
496 nt_devmode->specversion,
497 nt_devmode->driverversion,
499 nt_devmode->driverextra,
501 nt_devmode->orientation,
502 nt_devmode->papersize,
503 nt_devmode->paperlength,
504 nt_devmode->paperwidth,
507 nt_devmode->defaultsource,
508 nt_devmode->printquality,
511 nt_devmode->yresolution,
512 nt_devmode->ttoption,
514 nt_devmode->icmmethod,
515 nt_devmode->icmintent,
516 nt_devmode->mediatype,
517 nt_devmode->dithertype,
518 nt_devmode->private);
520 if (nt_devmode->private) {
521 len += tdb_pack(buf+len, buflen-len, "B",
522 nt_devmode->driverextra,
523 nt_devmode->private);
529 /****************************************************************************
530 ****************************************************************************/
531 static int pack_specifics(NT_PRINTER_PARAM *param, char *buf, int buflen)
535 while (param != NULL) {
536 len += tdb_pack(buf+len, buflen-len, "pfdB",
545 len += tdb_pack(buf+len, buflen-len, "p", param);
551 /****************************************************************************
552 delete a printer - this just deletes the printer info file, any open
553 handles are not affected
554 ****************************************************************************/
555 uint32 del_a_printer(char *portname)
560 slprintf(key, sizeof(key), "%s/%s",
561 PRINTERS_PREFIX, portname);
564 kbuf.dsize=strlen(key)+1;
566 tdb_delete(tdb, kbuf);
570 /****************************************************************************
571 ****************************************************************************/
572 static uint32 add_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info)
576 int buflen, len, ret;
580 * in addprinter: no servername and the printer is the name
581 * in setprinter: servername is \\server
582 * and printer is \\server\\printer
584 * Samba manages only local printers.
585 * we currently don't support things like path=\\other_server\printer
587 if (info->servername[0]!='\0')
589 trim_string(info->printername, info->servername, NULL);
590 trim_string(info->printername, "\\", NULL);
591 info->servername[0]='\0';
595 * JFM: one day I'll forget.
596 * below that's info->portname because that's the SAMBA sharename
597 * and I made NT 'thinks' it's the portname
598 * the info->sharename is the thing you can name when you add a printer
599 * that's the short-name when you create shared printer for 95/98
600 * So I've made a limitation in SAMBA: you can only have 1 printer model
601 * behind a SAMBA share.
610 len += tdb_pack(buf+len, buflen-len, "dddddddddddffffffffff",
613 info->default_priority,
629 info->printprocessor,
633 len += pack_devicemode(info->devmode, buf+len, buflen-len);
634 len += pack_specifics(info->specific, buf+len, buflen-len);
637 buf = (char *)Realloc(buf, len);
643 slprintf(key, sizeof(key), "%s/%s",
644 PRINTERS_PREFIX, info->portname);
647 kbuf.dsize = strlen(key)+1;
651 ret = tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
659 /****************************************************************************
660 ****************************************************************************/
661 BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param)
663 NT_PRINTER_PARAM *current;
665 DEBUG(108,("add_a_specific_param\n"));
669 if (info_2->specific == NULL)
671 info_2->specific=param;
675 current=info_2->specific;
676 while (current->next != NULL) {
677 current=current->next;
684 /****************************************************************************
685 ****************************************************************************/
686 BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param)
688 NT_PRINTER_PARAM *current;
689 NT_PRINTER_PARAM *previous;
691 current=info_2->specific;
694 if (current==NULL) return (False);
696 if ( !strcmp(current->value, param->value) &&
697 (strlen(current->value)==strlen(param->value)) )
699 DEBUG(109,("deleting first value\n"));
700 info_2->specific=current->next;
701 safe_free(current->data);
703 DEBUG(109,("deleted first value\n"));
707 current=previous->next;
709 while ( current!=NULL )
711 if (!strcmp(current->value, param->value) &&
712 strlen(current->value)==strlen(param->value) )
714 DEBUG(109,("deleting current value\n"));
715 previous->next=current->next;
717 DEBUG(109,("deleted current value\n"));
721 previous=previous->next;
722 current=current->next;
727 /****************************************************************************
728 Clean up and deallocate a (maybe partially) allocated NT_PRINTER_PARAM.
729 ****************************************************************************/
730 static void free_nt_printer_param(NT_PRINTER_PARAM **param_ptr)
732 NT_PRINTER_PARAM *param = *param_ptr;
737 DEBUG(106,("free_nt_printer_param: deleting param [%s]\n", param->value));
740 safe_free(param->data);
746 /****************************************************************************
747 Malloc and return an NT devicemode.
748 ****************************************************************************/
750 NT_DEVICEMODE *construct_nt_devicemode(void)
753 * should I init this ones ???
754 nt_devmode->devicename
757 NT_DEVICEMODE *nt_devmode = (NT_DEVICEMODE *)malloc(sizeof(NT_DEVICEMODE));
759 if (nt_devmode == NULL) {
760 DEBUG(0,("construct_nt_devicemode: malloc fail.\n"));
764 ZERO_STRUCTP(nt_devmode);
766 fstrcpy(nt_devmode->formname, "A4");
768 nt_devmode->specversion = 0x0401;
769 nt_devmode->driverversion = 0x0400;
770 nt_devmode->size = 0x00DC;
771 nt_devmode->driverextra = 0x0000;
772 nt_devmode->fields = FORMNAME | TTOPTION | PRINTQUALITY |
773 DEFAULTSOURCE | COPIES | SCALE |
774 PAPERSIZE | ORIENTATION;
775 nt_devmode->orientation = 1;
776 nt_devmode->papersize = PAPER_A4;
777 nt_devmode->paperlength = 0;
778 nt_devmode->paperwidth = 0;
779 nt_devmode->scale = 0x64;
780 nt_devmode->copies = 01;
781 nt_devmode->defaultsource = BIN_FORMSOURCE;
782 nt_devmode->printquality = 0x0258;
783 nt_devmode->color = COLOR_MONOCHROME;
784 nt_devmode->duplex = DUP_SIMPLEX;
785 nt_devmode->yresolution = 0;
786 nt_devmode->ttoption = TT_SUBDEV;
787 nt_devmode->collate = COLLATE_FALSE;
788 nt_devmode->icmmethod = 0;
789 nt_devmode->icmintent = 0;
790 nt_devmode->mediatype = 0;
791 nt_devmode->dithertype = 0;
793 /* non utilisés par un driver d'imprimante */
794 nt_devmode->logpixels = 0;
795 nt_devmode->bitsperpel = 0;
796 nt_devmode->pelswidth = 0;
797 nt_devmode->pelsheight = 0;
798 nt_devmode->displayflags = 0;
799 nt_devmode->displayfrequency = 0;
800 nt_devmode->reserved1 = 0;
801 nt_devmode->reserved2 = 0;
802 nt_devmode->panningwidth = 0;
803 nt_devmode->panningheight = 0;
805 nt_devmode->private=NULL;
810 /****************************************************************************
811 Deepcopy an NT devicemode.
812 ****************************************************************************/
814 NT_DEVICEMODE *dup_nt_devicemode(NT_DEVICEMODE *nt_devicemode)
816 NT_DEVICEMODE *new_nt_devicemode = NULL;
818 if ((new_nt_devicemode = (NT_DEVICEMODE *)memdup(nt_devicemode, sizeof(NT_DEVICEMODE))) == NULL) {
819 DEBUG(0,("dup_nt_devicemode: malloc fail.\n"));
823 new_nt_devicemode->private = NULL;
824 if (nt_devicemode->private != NULL) {
825 if ((new_nt_devicemode->private = memdup(nt_devicemode->private, nt_devicemode->driverextra)) == NULL) {
826 safe_free(new_nt_devicemode);
827 DEBUG(0,("dup_nt_devicemode: malloc fail.\n"));
832 return new_nt_devicemode;
835 /****************************************************************************
836 Clean up and deallocate a (maybe partially) allocated NT_DEVICEMODE.
837 ****************************************************************************/
839 void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr)
841 NT_DEVICEMODE *nt_devmode = *devmode_ptr;
843 if(nt_devmode == NULL)
846 DEBUG(106,("free_nt_devicemode: deleting DEVMODE\n"));
848 if(nt_devmode->private)
849 safe_free(nt_devmode->private);
851 safe_free(nt_devmode);
855 /****************************************************************************
856 Clean up and deallocate a (maybe partially) allocated NT_PRINTER_INFO_LEVEL_2.
857 ****************************************************************************/
858 static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr)
860 NT_PRINTER_INFO_LEVEL_2 *info = *info_ptr;
861 NT_PRINTER_PARAM *param_ptr;
866 DEBUG(106,("free_nt_printer_info_level_2: deleting info\n"));
868 free_nt_devicemode(&info->devmode);
869 free_sec_desc_buf(&info->secdesc_buf);
871 for(param_ptr = info->specific; param_ptr; ) {
872 NT_PRINTER_PARAM *tofree = param_ptr;
874 param_ptr = param_ptr->next;
875 free_nt_printer_param(&tofree);
878 safe_free(*info_ptr);
883 /****************************************************************************
884 ****************************************************************************/
885 static int unpack_devicemode(NT_DEVICEMODE **nt_devmode, char *buf, int buflen)
888 NT_DEVICEMODE devmode;
890 ZERO_STRUCT(devmode);
892 len += tdb_unpack(buf+len, buflen-len, "p", nt_devmode);
894 if (!*nt_devmode) return len;
896 len += tdb_unpack(buf+len, buflen-len, "fddddddddddddddddddddddp",
898 &devmode.specversion,
899 &devmode.driverversion,
901 &devmode.driverextra,
903 &devmode.orientation,
905 &devmode.paperlength,
909 &devmode.defaultsource,
910 &devmode.printquality,
913 &devmode.yresolution,
922 if (devmode.private) {
923 devmode.private = (uint8 *)malloc(devmode.driverextra);
924 if (!devmode.private) return 2;
925 len += tdb_unpack(buf+len, buflen-len, "B",
930 *nt_devmode = (NT_DEVICEMODE *)memdup(&devmode, sizeof(devmode));
935 /****************************************************************************
936 ****************************************************************************/
937 static int unpack_specifics(NT_PRINTER_PARAM **list, char *buf, int buflen)
940 NT_PRINTER_PARAM param, *p;
945 len += tdb_unpack(buf+len, buflen-len, "p", &p);
948 len += tdb_unpack(buf+len, buflen-len, "fdB",
954 *list = memdup(¶m, sizeof(param));
961 /****************************************************************************
962 get a default printer info 2 struct
963 ****************************************************************************/
964 static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename)
966 extern pstring global_myname;
968 NT_PRINTER_INFO_LEVEL_2 info;
972 snum = lp_servicenumber(sharename);
974 fstrcpy(info.servername, global_myname);
975 fstrcpy(info.printername, sharename);
976 fstrcpy(info.portname, sharename);
977 fstrcpy(info.drivername, lp_printerdriver(snum));
978 fstrcpy(info.printprocessor, "winprint");
979 fstrcpy(info.datatype, "RAW");
981 if ((info.devmode = construct_nt_devicemode()) == NULL)
984 if (!nt_printing_getsec(sharename, &info.secdesc_buf))
987 *info_ptr = (NT_PRINTER_INFO_LEVEL_2 *)memdup(&info, sizeof(info));
989 DEBUG(0,("get_a_printer_2_default: malloc fail.\n"));
998 free_nt_devicemode(&info.devmode);
999 if (info.secdesc_buf)
1000 free_sec_desc_buf(&info.secdesc_buf);
1004 /****************************************************************************
1005 ****************************************************************************/
1006 static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename)
1009 NT_PRINTER_INFO_LEVEL_2 info;
1011 TDB_DATA kbuf, dbuf;
1015 slprintf(key, sizeof(key), "%s/%s",
1016 PRINTERS_PREFIX, sharename);
1019 kbuf.dsize = strlen(key)+1;
1021 dbuf = tdb_fetch(tdb, kbuf);
1022 if (!dbuf.dptr) return get_a_printer_2_default(info_ptr, sharename);
1024 len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "dddddddddddffffffffff",
1027 &info.default_priority,
1043 info.printprocessor,
1047 len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len);
1048 len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len);
1050 nt_printing_getsec(sharename, &info.secdesc_buf);
1052 safe_free(dbuf.dptr);
1053 *info_ptr=memdup(&info, sizeof(info));
1058 /****************************************************************************
1059 debugging function, dump at level 6 the struct in the logs
1060 ****************************************************************************/
1061 static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
1064 NT_PRINTER_INFO_LEVEL_2 *info2;
1066 DEBUG(106,("Dumping printer at level [%d]\n", level));
1072 if (printer.info_2 == NULL)
1076 info2=printer.info_2;
1078 DEBUGADD(106,("attributes:[%d]\n", info2->attributes));
1079 DEBUGADD(106,("priority:[%d]\n", info2->priority));
1080 DEBUGADD(106,("default_priority:[%d]\n", info2->default_priority));
1081 DEBUGADD(106,("starttime:[%d]\n", info2->starttime));
1082 DEBUGADD(106,("untiltime:[%d]\n", info2->untiltime));
1083 DEBUGADD(106,("status:[%d]\n", info2->status));
1084 DEBUGADD(106,("cjobs:[%d]\n", info2->cjobs));
1085 DEBUGADD(106,("averageppm:[%d]\n", info2->averageppm));
1086 DEBUGADD(106,("changeid:[%d]\n", info2->changeid));
1087 DEBUGADD(106,("c_setprinter:[%d]\n", info2->c_setprinter));
1088 DEBUGADD(106,("setuptime:[%d]\n", info2->setuptime));
1090 DEBUGADD(106,("servername:[%s]\n", info2->servername));
1091 DEBUGADD(106,("printername:[%s]\n", info2->printername));
1092 DEBUGADD(106,("sharename:[%s]\n", info2->sharename));
1093 DEBUGADD(106,("portname:[%s]\n", info2->portname));
1094 DEBUGADD(106,("drivername:[%s]\n", info2->drivername));
1095 DEBUGADD(106,("location:[%s]\n", info2->location));
1096 DEBUGADD(106,("sepfile:[%s]\n", info2->sepfile));
1097 DEBUGADD(106,("printprocessor:[%s]\n", info2->printprocessor));
1098 DEBUGADD(106,("datatype:[%s]\n", info2->datatype));
1099 DEBUGADD(106,("parameters:[%s]\n", info2->parameters));
1105 DEBUGADD(1,("Level not implemented\n"));
1114 * The function below are the high level ones.
1115 * only those ones must be called from the spoolss code.
1120 /****************************************************************************
1121 ****************************************************************************/
1122 uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
1126 dump_a_printer(printer, level);
1132 success=add_a_printer_2(printer.info_2);
1143 /****************************************************************************
1144 Get a NT_PRINTER_INFO_LEVEL struct. It returns malloced memory.
1145 ****************************************************************************/
1147 uint32 get_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, fstring sharename)
1150 NT_PRINTER_INFO_LEVEL *printer = NULL;
1154 DEBUG(10,("get_a_printer: [%s] level %u\n", sharename, (unsigned int)level));
1160 if ((printer = (NT_PRINTER_INFO_LEVEL *)malloc(sizeof(NT_PRINTER_INFO_LEVEL))) == NULL) {
1161 DEBUG(0,("get_a_printer: malloc fail.\n"));
1164 ZERO_STRUCTP(printer);
1165 success=get_a_printer_2(&printer->info_2, sharename);
1167 dump_a_printer(*printer, level);
1168 *pp_printer = printer;
1179 DEBUG(10,("get_a_printer: [%s] level %u returning %u\n", sharename, (unsigned int)level, (unsigned int)success));
1184 /****************************************************************************
1185 Deletes a NT_PRINTER_INFO_LEVEL struct.
1186 ****************************************************************************/
1188 uint32 free_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level)
1191 NT_PRINTER_INFO_LEVEL *printer = *pp_printer;
1193 DEBUG(104,("freeing a printer at level [%d]\n", level));
1195 if (printer == NULL)
1202 if (printer->info_2 != NULL)
1204 free_nt_printer_info_level_2(&printer->info_2);
1223 /****************************************************************************
1224 ****************************************************************************/
1225 uint32 add_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
1228 DEBUG(104,("adding a printer at level [%d]\n", level));
1229 dump_a_printer_driver(driver, level);
1235 success=add_a_printer_driver_3(driver.info_3);
1241 success=add_a_printer_driver_6(driver.info_6);
1251 /****************************************************************************
1252 ****************************************************************************/
1253 uint32 get_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL *driver, uint32 level,
1254 fstring printername, fstring architecture)
1262 success=get_a_printer_driver_3(&(driver->info_3),
1272 if (success == 0) dump_a_printer_driver(*driver, level);
1276 /****************************************************************************
1277 ****************************************************************************/
1278 uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
1286 NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3;
1287 if (driver.info_3 != NULL)
1289 info3=driver.info_3;
1290 safe_free(info3->dependentfiles);
1291 ZERO_STRUCTP(info3);
1303 NT_PRINTER_DRIVER_INFO_LEVEL_3 *info6;
1304 if (driver.info_6 != NULL)
1306 info6=driver.info_6;
1307 safe_free(info6->dependentfiles);
1308 ZERO_STRUCTP(info6);
1325 /****************************************************************************
1326 ****************************************************************************/
1327 BOOL get_specific_param_by_index(NT_PRINTER_INFO_LEVEL printer, uint32 level, uint32 param_index,
1328 fstring value, uint8 **data, uint32 *type, uint32 *len)
1330 /* right now that's enough ! */
1331 NT_PRINTER_PARAM *param;
1334 param=printer.info_2->specific;
1336 while (param != NULL && i <= param_index)
1345 /* exited because it exist */
1347 StrnCpy(value, param->value, sizeof(fstring)-1);
1348 *data=(uint8 *)malloc(param->data_len*sizeof(uint8));
1351 memcpy(*data, param->data, param->data_len);
1352 *len=param->data_len;
1356 /****************************************************************************
1357 ****************************************************************************/
1358 BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
1359 fstring value, uint8 **data, uint32 *type, uint32 *len)
1361 /* right now that's enough ! */
1362 NT_PRINTER_PARAM *param;
1364 DEBUG(105, ("get_specific_param\n"));
1366 param=printer.info_2->specific;
1368 while (param != NULL)
1370 if ( !strcmp(value, param->value)
1371 && strlen(value)==strlen(param->value))
1377 DEBUG(106, ("found one param\n"));
1380 /* exited because it exist */
1383 *data=(uint8 *)malloc(param->data_len*sizeof(uint8));
1386 memcpy(*data, param->data, param->data_len);
1387 *len=param->data_len;
1389 DEBUG(106, ("exit of get_specific_param:true\n"));
1392 DEBUG(106, ("exit of get_specific_param:false\n"));
1397 /****************************************************************************
1398 store a security desc for a printer
1399 ****************************************************************************/
1400 uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
1406 prs_init(&ps, (uint32)sec_desc_size(secdesc_ctr->sec), 4, MARSHALL);
1408 if (!sec_io_desc_buf("nt_printing_setsec", &secdesc_ctr, &ps, 1)) {
1409 status = ERROR_INVALID_FUNCTION;
1413 slprintf(key, sizeof(key), "SECDESC/%s", printername);
1415 if (tdb_prs_store(tdb, key, &ps)==0) {
1418 DEBUG(1,("Failed to store secdesc for %s\n", printername));
1419 status = ERROR_INVALID_FUNCTION;
1427 /****************************************************************************
1428 Construct a default security descriptor buffer for a printer.
1429 ****************************************************************************/
1431 static SEC_DESC_BUF *construct_default_printer_sdb(void)
1433 extern DOM_SID global_sid_World;
1434 SEC_DESC_BUF *sdb = NULL;
1436 SEC_DESC *psd = make_sec_desc(1, SEC_DESC_SELF_RELATIVE|SEC_DESC_DACL_PRESENT,
1437 &global_sid_World, &global_sid_World,
1438 NULL, NULL, &sd_size);
1441 DEBUG(0,("construct_default_printer_sd: Failed to make SEC_DESC.\n"));
1445 sdb = make_sec_desc_buf(sd_size, psd);
1447 free_sec_desc(&psd);
1451 /****************************************************************************
1452 Get a security desc for a printer.
1453 ****************************************************************************/
1455 BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr)
1460 slprintf(key, sizeof(key), "SECDESC/%s", printername);
1462 if (tdb_prs_fetch(tdb, key, &ps)!=0 ||
1463 !sec_io_desc_buf("nt_printing_getsec", secdesc_ctr, &ps, 1)) {
1465 DEBUG(4,("using default secdesc for %s\n", printername));
1467 if ((*secdesc_ctr = construct_default_printer_sdb()))
1479 1: level not implemented
1480 2: file doesn't exist
1481 3: can't allocate memory
1482 4: can't free memory
1483 5: non existant struct
1487 A printer and a printer driver are 2 different things.
1488 NT manages them separatelly, Samba does the same.
1489 Why ? Simply because it's easier and it makes sense !
1491 Now explanation: You have 3 printers behind your samba server,
1492 2 of them are the same make and model (laser A and B). But laser B
1493 has an 3000 sheet feeder and laser A doesn't such an option.
1494 Your third printer is an old dot-matrix model for the accounting :-).
1496 If the /usr/local/samba/lib directory (default dir), you will have
1497 5 files to describe all of this.
1499 3 files for the printers (1 by printer):
1502 NTprinter_accounting
1503 2 files for the drivers (1 for the laser and 1 for the dot matrix)
1504 NTdriver_printer model X
1505 NTdriver_printer model Y
1507 jfm: I should use this comment for the text file to explain
1508 same thing for the forms BTW.
1509 Je devrais mettre mes commentaires en francais, ca serait mieux :-)