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 + -
显示快捷键?