cli_spoolss.c

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

C
1,988
字号
	if ( !W_ERROR_IS_OK(out.status) )		return out.status;	switch (level) {	case 0:		if (!decode_printer_info_0(mem_ctx, out.buffer, out.returned, &ctr->printers_0)) {			return WERR_GENERAL_FAILURE;		}		break;	case 1:		if (!decode_printer_info_1(mem_ctx, out.buffer, out.returned, &ctr->printers_1)) {			return WERR_GENERAL_FAILURE;		}		break;	case 2:		if (!decode_printer_info_2(mem_ctx, out.buffer, out.returned, &ctr->printers_2)) {			return WERR_GENERAL_FAILURE;		}		break;	case 3:		if (!decode_printer_info_3(mem_ctx, out.buffer, out.returned, &ctr->printers_3)) {			return WERR_GENERAL_FAILURE;		}		break;	default:		return WERR_UNKNOWN_LEVEL;	}				*num_printers = out.returned;	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_enum_ports(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,			      uint32 level, uint32 *num_ports, PORT_INFO_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_ENUMPORTS in;        SPOOL_R_ENUMPORTS out;	RPC_BUFFER buffer;	fstring server;	uint32 offered;	ZERO_STRUCT(in);	ZERO_STRUCT(out);        slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);        strupper_m(server);	offered = 0;	rpcbuf_init(&buffer, offered, mem_ctx);	make_spoolss_q_enumports( &in, server, level, &buffer, offered );		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPORTS,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_enumports,	            spoolss_io_r_enumports, 	            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_enumports( &in, server, level, &buffer, offered );		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPORTS,		            in, out, 		            qbuf, rbuf,		            spoolss_io_q_enumports,		            spoolss_io_r_enumports, 		            WERR_GENERAL_FAILURE );	}		if ( !W_ERROR_IS_OK(out.status) )		return out.status;		switch (level) {	case 1:		if (!decode_port_info_1(mem_ctx, out.buffer, out.returned, &ctr->port.info_1)) {			return WERR_GENERAL_FAILURE;		}		break;	case 2:		if (!decode_port_info_2(mem_ctx, out.buffer, out.returned, &ctr->port.info_2)) {			return WERR_GENERAL_FAILURE;		}		break;	default:		return WERR_UNKNOWN_LEVEL;	}	*num_ports = out.returned;	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,			      POLICY_HND *pol, uint32 level, 			      PRINTER_INFO_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_GETPRINTER in;	SPOOL_R_GETPRINTER out;	RPC_BUFFER buffer;	uint32 offered;	ZERO_STRUCT(in);	ZERO_STRUCT(out);	/* Initialise input parameters */	offered = 0;	rpcbuf_init(&buffer, offered, mem_ctx);	make_spoolss_q_getprinter( mem_ctx, &in, pol, level, &buffer, offered );		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTER,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_getprinter,	            spoolss_io_r_getprinter, 	            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_getprinter( mem_ctx, &in, pol, level, &buffer, offered );		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTER,		            in, out, 		            qbuf, rbuf,		            spoolss_io_q_getprinter,		            spoolss_io_r_getprinter, 		            WERR_GENERAL_FAILURE );	}		if ( !W_ERROR_IS_OK(out.status) )		return out.status;			switch (level) {	case 0:		if (!decode_printer_info_0(mem_ctx, out.buffer, 1, &ctr->printers_0)) {			return WERR_GENERAL_FAILURE;		}		break;	case 1:		if (!decode_printer_info_1(mem_ctx, out.buffer, 1, &ctr->printers_1)) {			return WERR_GENERAL_FAILURE;		}		break;	case 2:		if (!decode_printer_info_2(mem_ctx, out.buffer, 1, &ctr->printers_2)) {			return WERR_GENERAL_FAILURE;		}		break;	case 3:		if (!decode_printer_info_3(mem_ctx, out.buffer, 1, &ctr->printers_3)) {			return WERR_GENERAL_FAILURE;		}		break;	case 7:		if (!decode_printer_info_7(mem_ctx, out.buffer, 1, &ctr->printers_7)) {			return WERR_GENERAL_FAILURE;		}		break;	default:		return WERR_UNKNOWN_LEVEL;	}	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,			      POLICY_HND *pol, uint32 level, 			      PRINTER_INFO_CTR *ctr, uint32 command){	prs_struct qbuf, rbuf;	SPOOL_Q_SETPRINTER in;	SPOOL_R_SETPRINTER out;	ZERO_STRUCT(in);	ZERO_STRUCT(out);	make_spoolss_q_setprinter( mem_ctx, &in, pol, level, ctr, command );	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_SETPRINTER,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_setprinter,	            spoolss_io_r_setprinter, 	            WERR_GENERAL_FAILURE );	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, 				    TALLOC_CTX *mem_ctx, 				    POLICY_HND *pol, uint32 level, 				    const char *env, int version, PRINTER_DRIVER_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_GETPRINTERDRIVER2 in;        SPOOL_R_GETPRINTERDRIVER2 out;	RPC_BUFFER buffer;	fstring server;	uint32 offered;	ZERO_STRUCT(in);	ZERO_STRUCT(out);	fstrcpy(server, cli->cli->desthost);	strupper_m(server);	offered = 0;	rpcbuf_init(&buffer, offered, mem_ctx);	make_spoolss_q_getprinterdriver2( &in, pol, env, level, 		version, 2, &buffer, offered);	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVER2,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_getprinterdriver2,	            spoolss_io_r_getprinterdriver2, 	            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_getprinterdriver2( &in, pol, env, level, 			version, 2, &buffer, offered);		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVER2,		            in, out, 		            qbuf, rbuf,		            spoolss_io_q_getprinterdriver2,		            spoolss_io_r_getprinterdriver2, 		            WERR_GENERAL_FAILURE );	}			if ( !W_ERROR_IS_OK(out.status) )		return out.status;	switch (level) {	case 1:		if (!decode_printer_driver_1(mem_ctx, out.buffer, 1, &ctr->info1)) {			return WERR_GENERAL_FAILURE;		}		break;	case 2:		if (!decode_printer_driver_2(mem_ctx, out.buffer, 1, &ctr->info2)) {			return WERR_GENERAL_FAILURE;		}		break;	case 3:		if (!decode_printer_driver_3(mem_ctx, out.buffer, 1, &ctr->info3)) {			return WERR_GENERAL_FAILURE;		}		break;	default:		return WERR_UNKNOWN_LEVEL;	}	return out.status;	}/********************************************************************************************************************************************/WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 				       TALLOC_CTX *mem_ctx,				       uint32 level, const char *env,				       uint32 *num_drivers,				       PRINTER_DRIVER_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_ENUMPRINTERDRIVERS in;        SPOOL_R_ENUMPRINTERDRIVERS out;	RPC_BUFFER buffer;	fstring server;	uint32 offered;	ZERO_STRUCT(in);	ZERO_STRUCT(out);        slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);        strupper_m(server);	offered = 0;	rpcbuf_init(&buffer, offered, mem_ctx);	make_spoolss_q_enumprinterdrivers( &in, server, env, level, 		&buffer, offered);		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDRIVERS,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_enumprinterdrivers,	            spoolss_io_r_enumprinterdrivers, 	            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_enumprinterdrivers( &in, server, env, level, 			&buffer, offered);			CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDRIVERS,		            in, out, 		            qbuf, rbuf,		            spoolss_io_q_enumprinterdrivers,		            spoolss_io_r_enumprinterdrivers, 		            WERR_GENERAL_FAILURE );	}		*num_drivers = out.returned;	if ( !W_ERROR_IS_OK(out.status) )		return out.status;			if ( out.returned ) {		switch (level) {		case 1:			if (!decode_printer_driver_1(mem_ctx, out.buffer, out.returned, &ctr->info1)) {				return WERR_GENERAL_FAILURE;			}			break;		case 2:			if (!decode_printer_driver_2(mem_ctx, out.buffer, out.returned, &ctr->info2)) {				return WERR_GENERAL_FAILURE;			}			break;		case 3:			if (!decode_printer_driver_3(mem_ctx, out.buffer, out.returned, &ctr->info3)) {				return WERR_GENERAL_FAILURE;			}			break;		default:			return WERR_UNKNOWN_LEVEL;		}	}	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_getprinterdriverdir (struct rpc_pipe_client *cli, 					TALLOC_CTX *mem_ctx,					uint32 level, char *env,					DRIVER_DIRECTORY_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_GETPRINTERDRIVERDIR in;        SPOOL_R_GETPRINTERDRIVERDIR out;	RPC_BUFFER buffer;	fstring server;	uint32 offered;	ZERO_STRUCT(in);	ZERO_STRUCT(out);        slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);        strupper_m(server);	offered = 0;	rpcbuf_init(&buffer, offered, mem_ctx);	make_spoolss_q_getprinterdriverdir( &in, server, env, level, 		&buffer, offered );	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVERDIRECTORY,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_getprinterdriverdir,	            spoolss_io_r_getprinterdriverdir, 	            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_getprinterdriverdir( &in, server, env, level, 			&buffer, offered );		CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVERDIRECTORY,		            in, out, 		            qbuf, rbuf,		            spoolss_io_q_getprinterdriverdir,		            spoolss_io_r_getprinterdriverdir, 		            WERR_GENERAL_FAILURE );	}		if (!W_ERROR_IS_OK(out.status))		return out.status;			if (!decode_printerdriverdir_1(mem_ctx, out.buffer, 1, &ctr->info1)) {		return WERR_GENERAL_FAILURE;	}	return out.status;}/********************************************************************************************************************************************/WERROR rpccli_spoolss_addprinterdriver (struct rpc_pipe_client *cli, 				     TALLOC_CTX *mem_ctx, uint32 level,				     PRINTER_DRIVER_CTR *ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_ADDPRINTERDRIVER in;        SPOOL_R_ADDPRINTERDRIVER out;	fstring server;	ZERO_STRUCT(in);	ZERO_STRUCT(out);	        slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);        strupper_m(server);	make_spoolss_q_addprinterdriver( mem_ctx, &in, server, level, ctr );	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ADDPRINTERDRIVER,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_addprinterdriver,	            spoolss_io_r_addprinterdriver, 	            WERR_GENERAL_FAILURE );	return out.status;		    }/********************************************************************************************************************************************/WERROR rpccli_spoolss_addprinterex (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,				 uint32 level, PRINTER_INFO_CTR*ctr){	prs_struct qbuf, rbuf;	SPOOL_Q_ADDPRINTEREX in;        SPOOL_R_ADDPRINTEREX out;	fstring server, client, user;	ZERO_STRUCT(in);	ZERO_STRUCT(out);	        slprintf(client, sizeof(fstring)-1, "\\\\%s", global_myname());        slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);	        strupper_m(client);        strupper_m(server);	fstrcpy  (user, cli->user_name);	make_spoolss_q_addprinterex( mem_ctx, &in, server, client, 		user, level, ctr);	CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ADDPRINTEREX,	            in, out, 	            qbuf, rbuf,	            spoolss_io_q_addprinterex,	            spoolss_io_r_addprinterex, 	            WERR_GENERAL_FAILURE );	return out.status;	

⌨️ 快捷键说明

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