From 566418f1a1c6514333965069cda435598fb0a2d4 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 12 May 2010 00:26:24 +0200 Subject: ntprinting: add ntprinting.idl. This generates convenient unmarshalling routines for pulling out spoolss related information out of ntprinters.tdb, ntforms.tdb and ntdrivers.tdb. Guenther --- librpc/idl/ntprinting.idl | 152 ++++++++++++++++++++++++++++++++++++++++++++ librpc/ndr/ndr_ntprinting.c | 69 ++++++++++++++++++++ librpc/ndr/ndr_ntprinting.h | 25 ++++++++ 3 files changed, 246 insertions(+) create mode 100644 librpc/idl/ntprinting.idl create mode 100644 librpc/ndr/ndr_ntprinting.c create mode 100644 librpc/ndr/ndr_ntprinting.h (limited to 'librpc') diff --git a/librpc/idl/ntprinting.idl b/librpc/idl/ntprinting.idl new file mode 100644 index 0000000000..909829170d --- /dev/null +++ b/librpc/idl/ntprinting.idl @@ -0,0 +1,152 @@ +#include "idl_types.h" + +/* + old s3 spoolss tdb on-disc interface definitions +*/ + +[ + pointer_default(unique), + helpstring("s3 printing tdb formats"), + uuid("a025d3cb-c605-40d6-86e1-4cff18e7dd94"), + helper("../librpc/ndr/ndr_ntprinting.h") +] +interface ntprinting +{ + /* Samba 3 tdb storage format: forms + * "dddddddd" */ + + typedef [flag(NDR_NOALIGN),public] struct { + uint32 position; + uint32 flag; + uint32 width; + uint32 length; + uint32 left; + uint32 top; + uint32 right; + uint32 bottom; + } ntprinting_form; + + void decode_ntprinting_form( + [in] ntprinting_form form + ); + + /* Samba 3 tdb storage format: drivers + * "dffffffff" followed by a remaining buffer of "f" array */ + + typedef [flag(NDR_NOALIGN),public] struct { + uint32 version; + utf8string name; + utf8string environment; + utf8string driverpath; + utf8string datafile; + utf8string configfile; + utf8string helpfile; + utf8string monitorname; + utf8string defaultdatatype; + [flag(STR_UTF8|STR_NOTERM|NDR_REMAINING)] string_array dependent_files; + } ntprinting_driver; + + void decode_ntprinting_driver( + [in] ntprinting_driver driver + ); + + /* Samba 3 tdb storage format: devicemode + * "p" ptr to devicemode + * "ffwwwwwwwwwwwwwwwwwwdddddddddddddd" + * "p" ptr to devicemode private data + * "B" private data blob */ + + typedef [flag(NDR_NOALIGN),public] struct { + /* uint32 devicemode_ptr; */ + utf8string devicename; + utf8string formname; + uint16 specversion; + uint16 driverversion; + uint16 size; + uint16 driverextra; + uint16 orientation; + uint16 papersize; + uint16 paperlength; + uint16 paperwidth; + uint16 scale; + uint16 copies; + uint16 defaultsource; + uint16 printquality; + uint16 color; + uint16 duplex; + uint16 yresolution; + uint16 ttoption; + uint16 collate; + uint16 logpixels; + uint32 fields; + uint32 bitsperpel; + uint32 pelswidth; + uint32 pelsheight; + uint32 displayflags; + uint32 displayfrequency; + uint32 icmmethod; + uint32 icmintent; + uint32 mediatype; + uint32 dithertype; + uint32 reserved1; + uint32 reserved2; + uint32 panningwidth; + uint32 panningheight; + DATA_BLOB *nt_dev_private; + } ntprinting_devicemode; + + /* Samba 3 tdb storage format: printer_data + * "p" ptr to printer_data + * "fdB" */ + + typedef [flag(NDR_NOALIGN),public] struct { + uint32 ptr; + utf8string name; + uint32 type; + DATA_BLOB data; + } ntprinting_printer_data; + + /* Samba 3 tdb storage format: printer_info + * "dddddddddddfffffPfffff" */ + + typedef [flag(NDR_NOALIGN),public] struct { + uint32 attributes; + uint32 priority; + uint32 default_priority; + uint32 starttime; + uint32 untiltime; + uint32 status; + uint32 cjobs; + uint32 averageppm; + uint32 changeid; + uint32 c_setprinter; + uint32 setuptime; + utf8string servername; + utf8string printername; + utf8string sharename; + utf8string portname; + utf8string drivername; + utf8string comment; + utf8string location; + utf8string sepfile; + utf8string printprocessor; + utf8string datatype; + utf8string parameters; + } ntprinting_printer_info; + + /* Abstract Samba 3 printer + * printer_info + * followed by ntprinting_devicemode + * followed by remaining buffer of ntprinting_printer_data array */ + + typedef [flag(NDR_NOALIGN),public,nopull] struct { + ntprinting_printer_info info; + ntprinting_devicemode *devmode; + uint32 count; + ntprinting_printer_data printer_data[count]; + } ntprinting_printer; + + void decode_ntprinting_printer( + [in] ntprinting_printer printer + ); +} diff --git a/librpc/ndr/ndr_ntprinting.c b/librpc/ndr/ndr_ntprinting.c new file mode 100644 index 0000000000..87b743d3f8 --- /dev/null +++ b/librpc/ndr/ndr_ntprinting.c @@ -0,0 +1,69 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling special ntprinting structures + + Copyright (C) Guenther Deschner 2010 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "../librpc/gen_ndr/ndr_ntprinting.h" + +_PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int ndr_flags, struct ntprinting_printer *r) +{ + uint32_t _ptr_devmode; + TALLOC_CTX *_mem_save_devmode_0; + { + uint32_t _flags_save_STRUCT = ndr->flags; + ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN); + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_pull_align(ndr, 5)); + NDR_CHECK(ndr_pull_ntprinting_printer_info(ndr, NDR_SCALARS, &r->info)); + NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_devmode)); + if (_ptr_devmode) { + NDR_PULL_ALLOC(ndr, r->devmode); + } else { + r->devmode = NULL; + } + } + if (ndr_flags & NDR_BUFFERS) { + if (r->devmode) { + _mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0); + NDR_CHECK(ndr_pull_ntprinting_devicemode(ndr, NDR_SCALARS|NDR_BUFFERS, r->devmode)); + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0); + } + } + if (ndr_flags & NDR_SCALARS) { + r->count = 0; + NDR_PULL_ALLOC_N(ndr, r->printer_data, r->count); + while (ndr->offset + 4 <= ndr->data_size) { + uint32_t ptr = 0; + ptr = IVAL(ndr->data, ndr->offset); + if (ptr == 0) { + break; + } + r->printer_data = talloc_realloc(ndr, r->printer_data, struct ntprinting_printer_data, r->count + 1); + NDR_ERR_HAVE_NO_MEMORY(r->printer_data); + NDR_CHECK(ndr_pull_ntprinting_printer_data(ndr, NDR_SCALARS, &r->printer_data[r->count])); + r->count++; + } + NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); + } + ndr->flags = _flags_save_STRUCT; + } + return NDR_ERR_SUCCESS; +} diff --git a/librpc/ndr/ndr_ntprinting.h b/librpc/ndr/ndr_ntprinting.h new file mode 100644 index 0000000000..8bda430438 --- /dev/null +++ b/librpc/ndr/ndr_ntprinting.h @@ -0,0 +1,25 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling special ntprinting structures + + Copyright (C) Guenther Deschner 2010 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "../librpc/gen_ndr/ndr_ntprinting.h" + +_PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int ndr_flags, struct ntprinting_printer *r); -- cgit