2 Unix SMB/CIFS implementation.
4 routines for marshalling/unmarshalling spoolss subcontext buffer structures
6 Copyright (C) Andrew Tridgell 2003
7 Copyright (C) Tim Potter 2003
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "librpc/gen_ndr/ndr_spoolss.h"
26 #if (_SAMBA_BUILD_ >= 4)
27 #include "param/param.h"
30 #define NDR_SPOOLSS_PUSH_ENUM_IN(fn) do { \
31 if (!r->in.buffer && r->in.offered != 0) {\
32 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
33 "SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\
34 (unsigned)r->in.offered);\
35 } else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\
36 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
37 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
38 (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
40 _r.in.level = r->in.level;\
41 _r.in.buffer = r->in.buffer;\
42 _r.in.offered = r->in.offered;\
43 NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
46 #define NDR_SPOOLSS_PUSH_ENUM_OUT(fn) do { \
47 struct ndr_push *_ndr_info;\
48 _r.in.level = r->in.level;\
49 _r.in.buffer = r->in.buffer;\
50 _r.in.offered = r->in.offered;\
52 _r.out.needed = r->out.needed;\
53 _r.out.count = r->out.count;\
54 _r.out.result = r->out.result;\
55 if (r->out.info && !r->in.buffer) {\
56 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
57 "SPOOLSS Buffer: r->out.info but there's no r->in.buffer");\
60 DATA_BLOB _data_blob_info;\
61 _ndr_info = ndr_push_init_ctx(ndr, ndr->iconv_convenience);\
62 NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
63 _ndr_info->flags= ndr->flags;\
66 __r.in.level = r->in.level;\
67 __r.in.count = *r->out.count;\
68 __r.out.info = r->out.info;\
69 NDR_CHECK(ndr_push___##fn(_ndr_info, flags, &__r)); \
71 if (r->in.offered > _ndr_info->offset) {\
72 uint32_t _padding_len = r->in.offered - _ndr_info->offset;\
73 NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));\
74 } else if (r->in.offered < _ndr_info->offset) {\
75 return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\
76 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]!",\
77 (unsigned)r->in.offered, (unsigned)_ndr_info->offset);\
79 _data_blob_info = ndr_push_blob(_ndr_info);\
80 _r.out.info = &_data_blob_info;\
82 NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\
85 #define NDR_SPOOLSS_PUSH_ENUM(fn,in,out) do { \
87 if (flags & NDR_IN) {\
89 NDR_SPOOLSS_PUSH_ENUM_IN(fn);\
91 if (flags & NDR_OUT) {\
93 NDR_SPOOLSS_PUSH_ENUM_OUT(fn);\
97 #define NDR_SPOOLSS_PULL_ENUM_IN(fn) do { \
99 NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
100 r->in.level = _r.in.level;\
101 r->in.buffer = _r.in.buffer;\
102 r->in.offered = _r.in.offered;\
103 r->out.needed = _r.out.needed;\
104 r->out.count = _r.out.count;\
105 if (!r->in.buffer && r->in.offered != 0) {\
106 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
107 "SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\
108 (unsigned)r->in.offered);\
109 } else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\
110 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
111 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\
112 (unsigned)r->in.offered, (unsigned)r->in.buffer->length);\
116 #define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \
117 _r.in.level = r->in.level;\
118 _r.in.buffer = r->in.buffer;\
119 _r.in.offered = r->in.offered;\
120 _r.out.needed = r->out.needed;\
121 _r.out.count = r->out.count;\
122 NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\
124 r->out.needed = _r.out.needed;\
125 r->out.count = _r.out.count;\
126 r->out.result = _r.out.result;\
128 struct ndr_pull *_ndr_info = ndr_pull_init_blob(_r.out.info, ndr, ndr->iconv_convenience);\
129 NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\
130 _ndr_info->flags= ndr->flags;\
131 if (r->in.offered != _ndr_info->data_size) {\
132 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\
133 "SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",\
134 (unsigned)r->in.offered, (unsigned)_ndr_info->data_size);\
136 if (*r->out.needed <= _ndr_info->data_size) {\
138 __r.in.level = r->in.level;\
139 __r.in.count = *r->out.count;\
140 __r.out.info = NULL;\
141 NDR_CHECK(ndr_pull___##fn(_ndr_info, flags, &__r));\
142 r->out.info = __r.out.info;\
147 #define NDR_SPOOLSS_PULL_ENUM(fn,in,out) do { \
149 if (flags & NDR_IN) {\
151 NDR_SPOOLSS_PULL_ENUM_IN(fn);\
154 if (flags & NDR_OUT) {\
156 NDR_SPOOLSS_PULL_ENUM_OUT(fn);\
160 #define _NDR_CHECK_UINT32(call) do {\
161 enum ndr_err_code _ndr_err; \
163 if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
168 /* TODO: set _ndr_info->flags correct */
169 #define NDR_SPOOLSS_SIZE_ENUM(fn) do { \
171 DATA_BLOB _data_blob_info;\
172 struct ndr_push *_ndr_info = ndr_push_init_ctx(mem_ctx, iconv_convenience);\
173 if (!_ndr_info) return 0;\
174 _ndr_info->flags|=0;\
175 __r.in.level = level;\
176 __r.in.count = count;\
177 __r.out.info = info;\
178 _NDR_CHECK_UINT32(ndr_push___##fn(_ndr_info, NDR_OUT, &__r)); \
179 _data_blob_info = ndr_push_blob(_ndr_info);\
180 return _data_blob_info.length;\
186 enum ndr_err_code ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinters *r)
188 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinters,{
189 _r.in.flags = r->in.flags;
190 _r.in.server = r->in.server;
192 _r.in.flags = r->in.flags;
193 _r.in.server = r->in.server;
195 return NDR_ERR_SUCCESS;
198 enum ndr_err_code ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinters *r)
200 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinters,{
201 r->in.flags = _r.in.flags;
202 r->in.server = _r.in.server;
204 _r.in.flags = r->in.flags;
205 _r.in.server = r->in.server;
207 return NDR_ERR_SUCCESS;
210 uint32_t ndr_size_spoolss_EnumPrinters_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_PrinterInfo *info)
212 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrinters);
218 enum ndr_err_code ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, int flags, const struct spoolss_EnumJobs *r)
220 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumJobs,{
221 _r.in.handle = r->in.handle;
222 _r.in.firstjob = r->in.firstjob;
223 _r.in.numjobs = r->in.numjobs;
225 _r.in.handle = r->in.handle;
226 _r.in.firstjob = r->in.firstjob;
227 _r.in.numjobs = r->in.numjobs;
229 return NDR_ERR_SUCCESS;
232 enum ndr_err_code ndr_pull_spoolss_EnumJobs(struct ndr_pull *ndr, int flags, struct spoolss_EnumJobs *r)
234 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumJobs,{
235 r->in.handle = _r.in.handle;
236 r->in.firstjob = _r.in.firstjob;
237 r->in.numjobs = _r.in.numjobs;
239 _r.in.handle = r->in.handle;
240 _r.in.firstjob = r->in.firstjob;
241 _r.in.numjobs = r->in.numjobs;
243 return NDR_ERR_SUCCESS;
246 uint32_t ndr_size_spoolss_EnumJobss_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_JobInfo *info)
248 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumJobs);
252 spoolss_EnumPrinterDrivers
254 enum ndr_err_code ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterDrivers *r)
256 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinterDrivers,{
257 _r.in.server = r->in.server;
258 _r.in.environment = r->in.environment;
260 _r.in.server = r->in.server;
261 _r.in.environment = r->in.environment;
263 return NDR_ERR_SUCCESS;
266 enum ndr_err_code ndr_pull_spoolss_EnumPrinterDrivers(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterDrivers *r)
268 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinterDrivers,{
269 r->in.server = _r.in.server;
270 r->in.environment = _r.in.environment;
272 _r.in.server = r->in.server;
273 _r.in.environment = r->in.environment;
275 return NDR_ERR_SUCCESS;
278 uint32_t ndr_size_spoolss_EnumPrinterDrivers_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_DriverInfo *info)
280 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrinterDrivers);
286 enum ndr_err_code ndr_push_spoolss_EnumForms(struct ndr_push *ndr, int flags, const struct spoolss_EnumForms *r)
288 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumForms,{
289 _r.in.handle = r->in.handle;
291 _r.in.handle = r->in.handle;
293 return NDR_ERR_SUCCESS;
296 enum ndr_err_code ndr_pull_spoolss_EnumForms(struct ndr_pull *ndr, int flags, struct spoolss_EnumForms *r)
298 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumForms,{
299 r->in.handle = _r.in.handle;
301 _r.in.handle = r->in.handle;
303 return NDR_ERR_SUCCESS;
306 uint32_t ndr_size_spoolss_EnumForms_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_FormInfo *info)
308 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumForms);
314 enum ndr_err_code ndr_push_spoolss_EnumPorts(struct ndr_push *ndr, int flags, const struct spoolss_EnumPorts *r)
316 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPorts,{
317 _r.in.servername= r->in.servername;
319 _r.in.servername= r->in.servername;
321 return NDR_ERR_SUCCESS;
324 enum ndr_err_code ndr_pull_spoolss_EnumPorts(struct ndr_pull *ndr, int flags, struct spoolss_EnumPorts *r)
326 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPorts,{
327 r->in.servername= _r.in.servername;
329 _r.in.servername= r->in.servername;
331 return NDR_ERR_SUCCESS;
334 uint32_t ndr_size_spoolss_EnumPorts_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_PortInfo *info)
336 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPorts);
342 enum ndr_err_code ndr_push_spoolss_EnumMonitors(struct ndr_push *ndr, int flags, const struct spoolss_EnumMonitors *r)
344 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumMonitors,{
345 _r.in.servername= r->in.servername;
347 _r.in.servername= r->in.servername;
349 return NDR_ERR_SUCCESS;
352 enum ndr_err_code ndr_pull_spoolss_EnumMonitors(struct ndr_pull *ndr, int flags, struct spoolss_EnumMonitors *r)
354 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumMonitors,{
355 r->in.servername= _r.in.servername;
357 _r.in.servername= r->in.servername;
359 return NDR_ERR_SUCCESS;
362 uint32_t ndr_size_spoolss_EnumMonitors_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint32_t level, uint32_t count, union spoolss_MonitorInfo *info)
364 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumMonitors);
368 spoolss_EnumPrintProcessors
370 enum ndr_err_code ndr_push_spoolss_EnumPrintProcessors(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrintProcessors *r)
372 NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrintProcessors,{
373 _r.in.servername = r->in.servername;
374 _r.in.environment = r->in.environment;
376 _r.in.servername = r->in.servername;
377 _r.in.environment = r->in.environment;
379 return NDR_ERR_SUCCESS;
382 enum ndr_err_code ndr_pull_spoolss_EnumPrintProcessors(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrintProcessors *r)
384 NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrintProcessors,{
385 r->in.servername = _r.in.servername;
386 r->in.environment = _r.in.environment;
388 _r.in.servername = r->in.servername;
389 _r.in.environment = r->in.environment;
391 return NDR_ERR_SUCCESS;
394 uint32_t ndr_size_spoolss_EnumPrinterProcessors_info(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience,
395 uint32_t level, uint32_t count, union spoolss_PrintProcessorInfo *info)
397 NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrintProcessors);
401 spoolss_GetPrinterData
403 enum ndr_err_code ndr_push_spoolss_GetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_GetPrinterData *r)
405 struct _spoolss_GetPrinterData _r;
406 if (flags & NDR_IN) {
407 _r.in.handle = r->in.handle;
408 _r.in.value_name= r->in.value_name;
409 _r.in.offered = r->in.offered;
410 NDR_CHECK(ndr_push__spoolss_GetPrinterData(ndr, flags, &_r));
412 if (flags & NDR_OUT) {
413 struct ndr_push *_ndr_info;
414 _r.in.handle = r->in.handle;
415 _r.in.value_name= r->in.value_name;
416 _r.in.offered = r->in.offered;
417 _r.out.type = r->out.type;
418 _r.out.data = data_blob(NULL, 0);
419 _r.out.needed = r->out.needed;
420 _r.out.result = r->out.result;
422 struct __spoolss_GetPrinterData __r;
423 _ndr_info = ndr_push_init_ctx(ndr, ndr->iconv_convenience);
424 NDR_ERR_HAVE_NO_MEMORY(_ndr_info);
425 _ndr_info->flags= ndr->flags;
426 __r.in.type = *r->out.type;
427 __r.out.data = r->out.data;
428 NDR_CHECK(ndr_push___spoolss_GetPrinterData(_ndr_info, flags, &__r));
429 if (r->in.offered > _ndr_info->offset) {
430 uint32_t _padding_len = r->in.offered - _ndr_info->offset;
431 NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));
433 _r.out.data = ndr_push_blob(_ndr_info);
435 NDR_CHECK(ndr_push__spoolss_GetPrinterData(ndr, flags, &_r));
437 return NDR_ERR_SUCCESS;
440 enum ndr_err_code ndr_pull_spoolss_GetPrinterData(struct ndr_pull *ndr, int flags, struct spoolss_GetPrinterData *r)
442 struct _spoolss_GetPrinterData _r;
443 if (flags & NDR_IN) {
446 _r.in.handle = r->in.handle;
447 _r.in.value_name= r->in.value_name;
448 _r.in.offered = r->in.offered;
449 _r.out.type = r->out.type;
450 _r.out.data = data_blob(NULL,0),
451 _r.out.needed = r->out.needed;
452 NDR_CHECK(ndr_pull__spoolss_GetPrinterData(ndr, flags, &_r));
453 r->in.handle = _r.in.handle;
454 r->in.value_name= _r.in.value_name;
455 r->in.offered = _r.in.offered;
456 r->out.needed = _r.out.needed;
458 if (flags & NDR_OUT) {
459 _r.in.handle = r->in.handle;
460 _r.in.value_name= r->in.value_name;
461 _r.in.offered = r->in.offered;
462 _r.out.type = r->out.type;
463 _r.out.data = data_blob(NULL,0),
464 _r.out.needed = r->out.needed;
465 _r.out.result = r->out.result;
466 NDR_CHECK(ndr_pull__spoolss_GetPrinterData(ndr, flags, &_r));
467 r->out.type = _r.out.type;
468 ZERO_STRUCT(r->out.data);
469 r->out.needed = _r.out.needed;
470 r->out.result = _r.out.result;
471 if (_r.out.data.length != r->in.offered) {
472 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,
473 "SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]",
474 (unsigned)r->in.offered, (unsigned)_r.out.data.length);
476 if (_r.out.data.length > 0 && *r->out.needed <= _r.out.data.length) {
477 struct __spoolss_GetPrinterData __r;
478 struct ndr_pull *_ndr_data = ndr_pull_init_blob(&_r.out.data, ndr, ndr->iconv_convenience);
479 NDR_ERR_HAVE_NO_MEMORY(_ndr_data);
480 _ndr_data->flags= ndr->flags;
481 __r.in.type = *r->out.type;
482 __r.out.data = r->out.data;
483 NDR_CHECK(ndr_pull___spoolss_GetPrinterData(_ndr_data, flags, &__r));
484 r->out.data = __r.out.data;
486 *r->out.type = SPOOLSS_PRINTER_DATA_TYPE_NULL;
489 return NDR_ERR_SUCCESS;
493 spoolss_SetPrinterData
495 enum ndr_err_code ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_SetPrinterData *r)
497 struct _spoolss_SetPrinterData _r;
498 if (flags & NDR_IN) {
499 struct ndr_push *_ndr_data;
500 struct __spoolss_SetPrinterData __r;
501 DATA_BLOB _data_blob_data;
503 _ndr_data = ndr_push_init_ctx(ndr, ndr->iconv_convenience);
504 NDR_ERR_HAVE_NO_MEMORY(_ndr_data);
505 _ndr_data->flags= ndr->flags;
507 __r.in.type = r->in.type;
508 __r.out.data = r->in.data;
509 NDR_CHECK(ndr_push___spoolss_SetPrinterData(_ndr_data, NDR_OUT, &__r));
510 _data_blob_data = ndr_push_blob(_ndr_data);
512 _r.in.handle = r->in.handle;
513 _r.in.value_name= r->in.value_name;
514 _r.in.type = r->in.type;
515 _r.in.data = _data_blob_data;
516 _r.in._offered = _data_blob_data.length;
517 _r.out.result = r->out.result;
518 NDR_CHECK(ndr_push__spoolss_SetPrinterData(ndr, flags, &_r));
520 if (flags & NDR_OUT) {
521 _r.in.handle = r->in.handle;
522 _r.in.value_name= r->in.value_name;
523 _r.in.type = r->in.type;
524 _r.in.data = data_blob(NULL,0),
525 _r.in._offered = r->in._offered;
526 _r.out.result = r->out.result;
527 NDR_CHECK(ndr_push__spoolss_SetPrinterData(ndr, flags, &_r));
529 return NDR_ERR_SUCCESS;
532 uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, struct smb_iconv_convenience *ic, uint32_t flags)
534 if (!devmode) return 0;
535 return ndr_size_spoolss_DeviceMode(devmode,ic,flags);