⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndr_spoolss_buf.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.   routines for marshalling/unmarshalling spoolss subcontext buffer structures   Copyright (C) Andrew Tridgell 2003   Copyright (C) Tim Potter 2003      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 <http://www.gnu.org/licenses/>.*/#include "includes.h"#include "librpc/gen_ndr/ndr_spoolss.h"#include "param/param.h"#define NDR_SPOOLSS_PUSH_ENUM_IN(fn) do { \	if (!r->in.buffer && r->in.offered != 0) {\		return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\			"SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\			(unsigned)r->in.offered);\	} else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\		return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\			"SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\			(unsigned)r->in.offered, (unsigned)r->in.buffer->length);\	}\	_r.in.level	= r->in.level;\	_r.in.buffer	= r->in.buffer;\	_r.in.offered	= r->in.offered;\	NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\} while(0)#define NDR_SPOOLSS_PUSH_ENUM_OUT(fn) do { \	struct ndr_push *_ndr_info;\	_r.in.level	= r->in.level;\	_r.in.buffer	= r->in.buffer;\	_r.in.offered	= r->in.offered;\	_r.out.info	= NULL;\	_r.out.needed	= r->out.needed;\	_r.out.count	= r->out.count;\	_r.out.result	= r->out.result;\	if (r->out.info && !r->in.buffer) {\		return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\			"SPOOLSS Buffer: r->out.info but there's no r->in.buffer");\	}\	if (r->in.buffer) {\		DATA_BLOB _data_blob_info;\		_ndr_info = ndr_push_init_ctx(ndr, ndr->iconv_convenience);\		NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\		_ndr_info->flags= ndr->flags;\		if (r->out.info) {\			struct __##fn __r;\			__r.in.level	= r->in.level;\			__r.in.count	= r->out.count;\			__r.out.info	= r->out.info;\			NDR_CHECK(ndr_push___##fn(_ndr_info, flags, &__r)); \		}\		if (r->in.offered > _ndr_info->offset) {\			uint32_t _padding_len = r->in.offered - _ndr_info->offset;\			NDR_CHECK(ndr_push_zero(_ndr_info, _padding_len));\		} else if (r->in.offered < _ndr_info->offset) {\			return ndr_push_error(ndr, NDR_ERR_BUFSIZE,\				"SPOOLSS Buffer: r->in.offered[%u] doesn't match length of out buffer[%u]!",\				(unsigned)r->in.offered, (unsigned)_ndr_info->offset);\		}\		_data_blob_info = ndr_push_blob(_ndr_info);\		_r.out.info	= &_data_blob_info;\	}\	NDR_CHECK(ndr_push__##fn(ndr, flags, &_r));\} while(0)#define NDR_SPOOLSS_PUSH_ENUM(fn,in,out) do { \	struct _##fn _r;\	if (flags & NDR_IN) {\		in;\		NDR_SPOOLSS_PUSH_ENUM_IN(fn);\	}\	if (flags & NDR_OUT) {\		out;\		NDR_SPOOLSS_PUSH_ENUM_OUT(fn);\	}\} while(0)#define NDR_SPOOLSS_PULL_ENUM_IN(fn) do { \	ZERO_STRUCT(r->out);\	NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\	r->in.level	= _r.in.level;\	r->in.buffer	= _r.in.buffer;\	r->in.offered	= _r.in.offered;\	r->out.needed	= _r.out.needed;\	if (!r->in.buffer && r->in.offered != 0) {\		return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\			"SPOOLSS Buffer: r->in.offered[%u] but there's no buffer",\			(unsigned)r->in.offered);\	} else if (r->in.buffer && r->in.buffer->length != r->in.offered) {\		return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\			"SPOOLSS Buffer: r->in.offered[%u] doesn't match length of r->in.buffer[%u]",\			(unsigned)r->in.offered, (unsigned)r->in.buffer->length);\	}\} while(0)#define NDR_SPOOLSS_PULL_ENUM_OUT(fn) do { \	_r.in.level	= r->in.level;\	_r.in.buffer	= r->in.buffer;\	_r.in.offered	= r->in.offered;\	_r.out.needed	= r->out.needed;\	NDR_CHECK(ndr_pull__##fn(ndr, flags, &_r));\	r->out.info	= NULL;\	r->out.needed	= _r.out.needed;\	r->out.count	= _r.out.count;\	r->out.result	= _r.out.result;\	if (_r.out.info) {\		struct ndr_pull *_ndr_info = ndr_pull_init_blob(_r.out.info, ndr, ndr->iconv_convenience);\		NDR_ERR_HAVE_NO_MEMORY(_ndr_info);\		_ndr_info->flags= ndr->flags;\		if (r->in.offered != _ndr_info->data_size) {\			return ndr_pull_error(ndr, NDR_ERR_BUFSIZE,\				"SPOOLSS Buffer: offered[%u] doesn't match length of buffer[%u]",\				(unsigned)r->in.offered, (unsigned)_ndr_info->data_size);\		}\		if (r->out.needed <= _ndr_info->data_size) {\			struct __##fn __r;\			__r.in.level	= r->in.level;\			__r.in.count	= r->out.count;\			__r.out.info	= NULL;\			NDR_CHECK(ndr_pull___##fn(_ndr_info, flags, &__r));\			r->out.info	= __r.out.info;\		}\	}\} while(0)#define NDR_SPOOLSS_PULL_ENUM(fn,in,out) do { \	struct _##fn _r;\	if (flags & NDR_IN) {\		out;\		NDR_SPOOLSS_PULL_ENUM_IN(fn);\		in;\	}\	if (flags & NDR_OUT) {\		out;\		NDR_SPOOLSS_PULL_ENUM_OUT(fn);\	}\} while(0)#define _NDR_CHECK_UINT32(call) do {\	enum ndr_err_code _ndr_err; \        _ndr_err = call; \	if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \        	return 0; \	}\} while (0)/* TODO: set _ndr_info->flags correct */#define NDR_SPOOLSS_SIZE_ENUM(fn) do { \	struct __##fn __r;\	DATA_BLOB _data_blob_info;\	struct ndr_push *_ndr_info = ndr_push_init_ctx(mem_ctx, lp_iconv_convenience(global_loadparm));\	if (!_ndr_info) return 0;\	_ndr_info->flags|=0;\	__r.in.level	= level;\	__r.in.count	= count;\	__r.out.info	= info;\	_NDR_CHECK_UINT32(ndr_push___##fn(_ndr_info, NDR_OUT, &__r)); \	_data_blob_info = ndr_push_blob(_ndr_info);\	return _data_blob_info.length;\} while(0)/*  spoolss_EnumPrinters*/enum ndr_err_code ndr_push_spoolss_EnumPrinters(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinters *r){	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinters,{		_r.in.flags	= r->in.flags;		_r.in.server	= r->in.server;	},{		_r.in.flags	= r->in.flags;		_r.in.server	= r->in.server;	});	return NDR_ERR_SUCCESS;}enum ndr_err_code ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinters *r){	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinters,{		r->in.flags	= _r.in.flags;		r->in.server	= _r.in.server;	},{		_r.in.flags	= r->in.flags;		_r.in.server	= r->in.server;	});	return NDR_ERR_SUCCESS;}uint32_t ndr_size_spoolss_EnumPrinters_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_PrinterInfo *info){	NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumPrinters);}/*  spoolss_EnumJobs*/enum ndr_err_code ndr_push_spoolss_EnumJobs(struct ndr_push *ndr, int flags, const struct spoolss_EnumJobs *r){	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumJobs,{		_r.in.handle	= r->in.handle;		_r.in.firstjob	= r->in.firstjob;		_r.in.numjobs	= r->in.numjobs;	},{		_r.in.handle	= r->in.handle;		_r.in.firstjob	= r->in.firstjob;		_r.in.numjobs	= r->in.numjobs;	});	return NDR_ERR_SUCCESS;}enum ndr_err_code ndr_pull_spoolss_EnumJobs(struct ndr_pull *ndr, int flags, struct spoolss_EnumJobs *r){	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumJobs,{		r->in.handle	= _r.in.handle;		r->in.firstjob	= _r.in.firstjob;		r->in.numjobs	= _r.in.numjobs;	},{		_r.in.handle	= r->in.handle;		_r.in.firstjob	= r->in.firstjob;		_r.in.numjobs	= r->in.numjobs;	});	return NDR_ERR_SUCCESS;}uint32_t ndr_size_spoolss_EnumJobss_info(TALLOC_CTX *mem_ctx, uint32_t level, uint32_t count, union spoolss_JobInfo *info){	NDR_SPOOLSS_SIZE_ENUM(spoolss_EnumJobs);}/*  spoolss_EnumPrinterDrivers*/enum ndr_err_code ndr_push_spoolss_EnumPrinterDrivers(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterDrivers *r){	NDR_SPOOLSS_PUSH_ENUM(spoolss_EnumPrinterDrivers,{		_r.in.server		= r->in.server;		_r.in.environment	= r->in.environment;	},{		_r.in.server		= r->in.server;		_r.in.environment	= r->in.environment;	});	return NDR_ERR_SUCCESS;}enum ndr_err_code ndr_pull_spoolss_EnumPrinterDrivers(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterDrivers *r){	NDR_SPOOLSS_PULL_ENUM(spoolss_EnumPrinterDrivers,{		r->in.server		= _r.in.server;		r->in.environment	= _r.in.environment;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -