cli_spoolss.c

来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 1,988 行 · 第 1/4 页

C
1,988
字号
/*   Unix SMB/CIFS implementation.   RPC pipe client   Copyright (C) Gerald Carter                2001-2005,   Copyright (C) Tim Potter                   2000-2002,   Copyright (C) Andrew Tridgell              1994-2000,   Copyright (C) Jean-Francois Micouleau      1999-2000.   Copyright (C) Jeremy Allison                         2005.   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 2 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, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "includes.h"#include "rpc_client.h"/********************************************************************* Decode various spoolss rpc's and info levels ********************************************************************//********************************************************************************************************************************************/static BOOL decode_printer_info_0(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,				uint32 returned, PRINTER_INFO_0 **info){	uint32 i;	PRINTER_INFO_0  *inf;	inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_0, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PRINTER_INFO_0));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		if (!smb_io_printer_info_0("", buffer, &inf[i], 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,				uint32 returned, PRINTER_INFO_1 **info){	uint32 i;	PRINTER_INFO_1  *inf;	inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_1, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PRINTER_INFO_1));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		if (!smb_io_printer_info_1("", buffer, &inf[i], 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 				uint32 returned, PRINTER_INFO_2 **info){	uint32 i;	PRINTER_INFO_2  *inf;	inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_2, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PRINTER_INFO_2));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		/* a little initialization as we go */		inf[i].secdesc = NULL;		if (!smb_io_printer_info_2("", buffer, &inf[i], 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_info_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 				uint32 returned, PRINTER_INFO_3 **info){	uint32 i;	PRINTER_INFO_3  *inf;	inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_3, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PRINTER_INFO_3));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		inf[i].secdesc = NULL;		if (!smb_io_printer_info_3("", buffer, &inf[i], 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_info_7(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,				uint32 returned, PRINTER_INFO_7 **info){	uint32 i;	PRINTER_INFO_7  *inf;	inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_7, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PRINTER_INFO_7));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		if (!smb_io_printer_info_7("", buffer, &inf[i], 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_port_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			uint32 returned, PORT_INFO_1 **info){	uint32 i;	PORT_INFO_1 *inf;	inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_1, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PORT_INFO_1));	prs_set_offset(&buffer->prs, 0);	for (i=0; i<returned; i++) {		if (!smb_io_port_info_1("", buffer, &(inf[i]), 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_port_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			uint32 returned, PORT_INFO_2 **info){	uint32 i;	PORT_INFO_2 *inf;	inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_2, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(PORT_INFO_2));	prs_set_offset(&buffer->prs, 0);	for (i=0; i<returned; i++) {		if (!smb_io_port_info_2("", buffer, &(inf[i]), 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_driver_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			uint32 returned, DRIVER_INFO_1 **info){	uint32 i;	DRIVER_INFO_1 *inf;	inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_1, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(DRIVER_INFO_1));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		if (!smb_io_printer_driver_info_1("", buffer, &(inf[i]), 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_driver_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			uint32 returned, DRIVER_INFO_2 **info){	uint32 i;	DRIVER_INFO_2 *inf;	inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_2, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(DRIVER_INFO_2));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		if (!smb_io_printer_driver_info_2("", buffer, &(inf[i]), 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printer_driver_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			uint32 returned, DRIVER_INFO_3 **info){	uint32 i;	DRIVER_INFO_3 *inf;	inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_3, returned);	if (!inf) {		return False;	}	memset(inf, 0, returned*sizeof(DRIVER_INFO_3));	prs_set_offset(&buffer->prs,0);	for (i=0; i<returned; i++) {		if (!smb_io_printer_driver_info_3("", buffer, &(inf[i]), 0)) {			return False;		}	}	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_printerdriverdir_1 (TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,			uint32 returned, DRIVER_DIRECTORY_1 **info){	DRIVER_DIRECTORY_1 *inf; 	inf=TALLOC_P(mem_ctx, DRIVER_DIRECTORY_1);	if (!inf) {		return False;	}	memset(inf, 0, sizeof(DRIVER_DIRECTORY_1));	prs_set_offset(&buffer->prs, 0);	if (!smb_io_driverdir_1("", buffer, inf, 0)) {		return False;	} 	*info=inf;	return True;}/********************************************************************************************************************************************/static BOOL decode_jobs_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			  uint32 num_jobs, JOB_INFO_1 **jobs){	uint32 i;	*jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_1, num_jobs);	if (!jobs) {		return False;	}	prs_set_offset(&buffer->prs,0);	for (i = 0; i < num_jobs; i++) {		if (!smb_io_job_info_1("", buffer, &((*jobs)[i]), 0)) {			return False;		}	}	return True;}/********************************************************************************************************************************************/static BOOL decode_jobs_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			  uint32 num_jobs, JOB_INFO_2 **jobs){	uint32 i;	*jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_2, num_jobs);	if (!jobs) {		return False;	}	prs_set_offset(&buffer->prs,0);	for (i = 0; i < num_jobs; i++) {		if (!smb_io_job_info_2("", buffer, &((*jobs)[i]), 0)) {			return False;		}	}	return True;}/********************************************************************************************************************************************/static BOOL decode_forms_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 			   uint32 num_forms, FORM_1 **forms){	int i;	*forms = TALLOC_ARRAY(mem_ctx, FORM_1, num_forms);	if (!forms) {		return False;	}	prs_set_offset(&buffer->prs,0);	for (i = 0; i < num_forms; i++) {		if (!smb_io_form_1("", buffer, &((*forms)[i]), 0)) {			return False;		}	}	return True;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_open_printer_ex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,				const char *printername, const char *datatype, uint32 access_required,				const char *station, const char *username, POLICY_HND *pol){	prs_struct qbuf, rbuf;	SPOOL_Q_OPEN_PRINTER_EX in;	SPOOL_R_OPEN_PRINTER_EX out;	ZERO_STRUCT(in);	ZERO_STRUCT(out);        make_spoolss_q_open_printer_ex( &in, printername, datatype,		access_required, station, username );	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_OPENPRINTEREX,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_open_printer_ex,	            spoolss_io_r_open_printer_ex, 	            WERR_GENERAL_FAILURE );	memcpy( pol, &out.handle, sizeof(POLICY_HND) );		return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_close_printer(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,				 POLICY_HND *pol){	prs_struct qbuf, rbuf;	SPOOL_Q_CLOSEPRINTER in;	SPOOL_R_CLOSEPRINTER out;	ZERO_STRUCT(in);	ZERO_STRUCT(out);        make_spoolss_q_closeprinter( &in, pol );	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_CLOSEPRINTER,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_closeprinter,	            spoolss_io_r_closeprinter, 	            WERR_GENERAL_FAILURE );		    	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,				 char *name, uint32 flags, uint32 level,				 uint32 *num_printers, PRINTER_INFO_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_ENUMPRINTERS in;        SPOOL_R_ENUMPRINTERS out;	RPC_BUFFER buffer;	uint32 offered;	ZERO_STRUCT(in);	ZERO_STRUCT(out);	offered = 0;	rpcbuf_init(&buffer, offered, mem_ctx);	make_spoolss_q_enumprinters( &in, flags, name, level, &buffer, offered );	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERS,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_enumprinters,	            spoolss_io_r_enumprinters, 	            WERR_GENERAL_FAILURE );		    	if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {		offered = out.needed;				ZERO_STRUCT(in);		ZERO_STRUCT(out);		rpcbuf_init(&buffer, offered, mem_ctx);		make_spoolss_q_enumprinters( &in, flags, name, level, &buffer, offered );		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERS,		            in, out, 		            qbuf, rbuf,		            spoolss_io_q_enumprinters,		            spoolss_io_r_enumprinters, 		            WERR_GENERAL_FAILURE );	}

⌨️ 快捷键说明

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