diff options
Diffstat (limited to 'source/libsmb')
-rw-r--r-- | source/libsmb/cli_spoolss.c | 530 |
1 files changed, 217 insertions, 313 deletions
diff --git a/source/libsmb/cli_spoolss.c b/source/libsmb/cli_spoolss.c index feb9c0c6784..bd8f4877239 100644 --- a/source/libsmb/cli_spoolss.c +++ b/source/libsmb/cli_spoolss.c @@ -3,7 +3,7 @@ Version 2.2 RPC pipe client - Copyright (C) Gerald Carter 2001, + Copyright (C) Gerald Carter 2001,2002 Copyright (C) Tim Potter 2000, Copyright (C) Andrew Tridgell 1994-2000 Copyright (C) Luke Kenneth Casson Leighton 1996-2000 @@ -36,126 +36,10 @@ struct cli_state *cli_spoolss_initialise(struct cli_state *cli, return cli_pipe_initialise(cli, system_name, PIPE_SPOOLSS, creds); } -/* Open printer ex */ - -NTSTATUS cli_spoolss_open_printer_ex( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - char *printername, - char *datatype, - uint32 access_required, - char *station, - char *username, - POLICY_HND *pol -) -{ - prs_struct qbuf, rbuf; - SPOOL_Q_OPEN_PRINTER_EX q; - SPOOL_R_OPEN_PRINTER_EX r; - NTSTATUS result; - - ZERO_STRUCT(q); - ZERO_STRUCT(r); - - /* Initialise parse structures */ - - prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); - prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); - - /* Initialise input parameters */ - - make_spoolss_q_open_printer_ex(&q, printername, datatype, - access_required, station, username); - - /* Marshall data and send request */ - - if (!spoolss_io_q_open_printer_ex("", &q, &qbuf, 0) || - !rpc_api_pipe_req(cli, SPOOLSS_OPENPRINTEREX, &qbuf, &rbuf)) { - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - /* Unmarshall response */ - - if (!spoolss_io_r_open_printer_ex("", &r, &rbuf, 0)) { - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - /* Return output parameters */ - - if (W_ERROR_IS_OK(r.status)) { - result = NT_STATUS_OK; - *pol = r.handle; - } else { - result = werror_to_ntstatus(r.status); - } - - done: - prs_mem_free(&qbuf); - prs_mem_free(&rbuf); - - return result; -} - -/* Close a printer handle */ - -NTSTATUS cli_spoolss_close_printer( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - POLICY_HND *pol -) -{ - prs_struct qbuf, rbuf; - SPOOL_Q_CLOSEPRINTER q; - SPOOL_R_CLOSEPRINTER r; - NTSTATUS result; - - ZERO_STRUCT(q); - ZERO_STRUCT(r); - - /* Initialise parse structures */ - - prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); - prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); - - /* Initialise input parameters */ - - make_spoolss_q_closeprinter(&q, pol); - - /* Marshall data and send request */ - - if (!spoolss_io_q_closeprinter("", &q, &qbuf, 0) || - !rpc_api_pipe_req(cli, SPOOLSS_CLOSEPRINTER, &qbuf, &rbuf)) { - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - /* Unmarshall response */ - - if (!spoolss_io_r_closeprinter("", &r, &rbuf, 0)) { - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - /* Return output parameters */ - - if (W_ERROR_IS_OK(r.status)) { - *pol = r.handle; - result = NT_STATUS_OK; - } else { - result = werror_to_ntstatus(r.status); - } - - done: - prs_mem_free(&qbuf); - prs_mem_free(&rbuf); - - return result; -} - -/* Initialize a spoolss NEW_BUFFER */ +/********************************************************************** + Initialize a new spoolss buff for use by a client rpc +**********************************************************************/ static void init_buffer(NEW_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx) { buffer->ptr = (size != 0); @@ -165,15 +49,14 @@ static void init_buffer(NEW_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx) buffer->struct_start = prs_offset(&buffer->prs); } -/* Decode various printer info levels - perhaps this should live in - parse_spoolss.c? */ +/********************************************************************* + Decode various spoolss rpc's and info levels + ********************************************************************/ -static void decode_printer_info_0( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - PRINTER_INFO_0 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_info_0(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, PRINTER_INFO_0 **info) { uint32 i; PRINTER_INFO_0 *inf; @@ -189,12 +72,10 @@ static void decode_printer_info_0( *info=inf; } -static void decode_printer_info_1( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - PRINTER_INFO_1 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_info_1(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, PRINTER_INFO_1 **info) { uint32 i; PRINTER_INFO_1 *inf; @@ -210,12 +91,10 @@ static void decode_printer_info_1( *info=inf; } -static void decode_printer_info_2( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - PRINTER_INFO_2 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_info_2(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, PRINTER_INFO_2 **info) { uint32 i; PRINTER_INFO_2 *inf; @@ -233,12 +112,10 @@ static void decode_printer_info_2( *info=inf; } -static void decode_printer_info_3( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - PRINTER_INFO_3 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_info_3(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, PRINTER_INFO_3 **info) { uint32 i; PRINTER_INFO_3 *inf; @@ -256,14 +133,9 @@ static void decode_printer_info_3( } /********************************************************************** - Decode a PORT_INFO_1 struct from a NEW_BUFFER **********************************************************************/ -static void decode_port_info_1( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - PORT_INFO_1 **info -) +static void decode_port_info_1(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, PORT_INFO_1 **info) { uint32 i; PORT_INFO_1 *inf; @@ -280,13 +152,9 @@ static void decode_port_info_1( } /********************************************************************** - Decode a PORT_INFO_2 struct from a NEW_BUFFER **********************************************************************/ -static void decode_port_info_2( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - PORT_INFO_2 **info) +static void decode_port_info_2(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, PORT_INFO_2 **info) { uint32 i; PORT_INFO_2 *inf; @@ -302,12 +170,10 @@ static void decode_port_info_2( *info=inf; } -static void decode_printer_driver_1( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - DRIVER_INFO_1 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_driver_1(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, DRIVER_INFO_1 **info) { uint32 i; DRIVER_INFO_1 *inf; @@ -323,12 +189,10 @@ static void decode_printer_driver_1( *info=inf; } -static void decode_printer_driver_2( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - DRIVER_INFO_2 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_driver_2(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, DRIVER_INFO_2 **info) { uint32 i; DRIVER_INFO_2 *inf; @@ -344,12 +208,10 @@ static void decode_printer_driver_2( *info=inf; } -static void decode_printer_driver_3( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - DRIVER_INFO_3 **info -) +/********************************************************************** +**********************************************************************/ +static void decode_printer_driver_3(TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, DRIVER_INFO_3 **info) { uint32 i; DRIVER_INFO_3 *inf; @@ -365,11 +227,10 @@ static void decode_printer_driver_3( *info=inf; } -static void decode_printerdriverdir_1 ( - TALLOC_CTX *mem_ctx, - NEW_BUFFER *buffer, - uint32 returned, - DRIVER_DIRECTORY_1 **info +/********************************************************************** +**********************************************************************/ +static void decode_printerdriverdir_1 (TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, + uint32 returned, DRIVER_DIRECTORY_1 **info ) { DRIVER_DIRECTORY_1 *inf; @@ -384,16 +245,124 @@ static void decode_printerdriverdir_1 ( } -/* Enumerate printers */ +/********************************************************************************* + Win32 API - OpenPrinter() + ********************************************************************************/ + +NTSTATUS cli_spoolss_open_printer_ex(struct cli_state *cli, TALLOC_CTX *mem_ctx, + char *printername, char *datatype, uint32 access_required, + char *station, char *username, POLICY_HND *pol) +{ + prs_struct qbuf, rbuf; + SPOOL_Q_OPEN_PRINTER_EX q; + SPOOL_R_OPEN_PRINTER_EX r; + NTSTATUS result; -NTSTATUS cli_spoolss_enum_printers( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - uint32 flags, - uint32 level, - int *returned, - PRINTER_INFO_CTR *ctr -) + ZERO_STRUCT(q); + ZERO_STRUCT(r); + + /* Initialise parse structures */ + + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); + + /* Initialise input parameters */ + + make_spoolss_q_open_printer_ex(&q, printername, datatype, + access_required, station, username); + + /* Marshall data and send request */ + + if (!spoolss_io_q_open_printer_ex("", &q, &qbuf, 0) || + !rpc_api_pipe_req(cli, SPOOLSS_OPENPRINTEREX, &qbuf, &rbuf)) { + result = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + /* Unmarshall response */ + + if (!spoolss_io_r_open_printer_ex("", &r, &rbuf, 0)) { + result = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + /* Return output parameters */ + + if (W_ERROR_IS_OK(r.status)) { + result = NT_STATUS_OK; + *pol = r.handle; + } else { + result = werror_to_ntstatus(r.status); + } + + done: + prs_mem_free(&qbuf); + prs_mem_free(&rbuf); + + return result; +} + +/********************************************************************************* + Win32 API - ClosePrinter() + ********************************************************************************/ + +NTSTATUS cli_spoolss_close_printer(struct cli_state *cli, TALLOC_CTX *mem_ctx, + POLICY_HND *pol) +{ + prs_struct qbuf, rbuf; + SPOOL_Q_CLOSEPRINTER q; + SPOOL_R_CLOSEPRINTER r; + NTSTATUS result; + + ZERO_STRUCT(q); + ZERO_STRUCT(r); + + /* Initialise parse structures */ + + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); + + /* Initialise input parameters */ + + make_spoolss_q_closeprinter(&q, pol); + + /* Marshall data and send request */ + + if (!spoolss_io_q_closeprinter("", &q, &qbuf, 0) || + !rpc_api_pipe_req(cli, SPOOLSS_CLOSEPRINTER, &qbuf, &rbuf)) { + result = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + /* Unmarshall response */ + + if (!spoolss_io_r_closeprinter("", &r, &rbuf, 0)) { + result = NT_STATUS_UNSUCCESSFUL; + goto done; + } + + /* Return output parameters */ + + if (W_ERROR_IS_OK(r.status)) { + *pol = r.handle; + result = NT_STATUS_OK; + } else { + result = werror_to_ntstatus(r.status); + } + + done: + prs_mem_free(&qbuf); + prs_mem_free(&rbuf); + + return result; +} + +/********************************************************************************* + Win32 API - EnumPrinters() + ********************************************************************************/ + +NTSTATUS cli_spoolss_enum_printers(struct cli_state *cli, TALLOC_CTX *mem_ctx, + uint32 flags, uint32 level, int *returned, PRINTER_INFO_CTR *ctr) { prs_struct qbuf, rbuf; SPOOL_Q_ENUMPRINTERS q; @@ -470,14 +439,12 @@ NTSTATUS cli_spoolss_enum_printers( return result; } -/* Enumerate printer ports */ -NTSTATUS cli_spoolss_enum_ports( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - uint32 level, - int *returned, - PORT_INFO_CTR *ctr -) +/********************************************************************************* + Win32 API - EnumPorts() + ********************************************************************************/ + +NTSTATUS cli_spoolss_enum_ports(struct cli_state *cli, TALLOC_CTX *mem_ctx, uint32 level, + int *returned, PORT_INFO_CTR *ctr) { prs_struct qbuf, rbuf; SPOOL_Q_ENUMPORTS q; @@ -545,7 +512,10 @@ NTSTATUS cli_spoolss_enum_ports( return result; } -/* Get printer info */ +/********************************************************************************* + Win32 API - GetPrinter() + ********************************************************************************/ + NTSTATUS cli_spoolss_getprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, PRINTER_INFO_CTR *ctr) { @@ -611,9 +581,10 @@ NTSTATUS cli_spoolss_getprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, return result; } -/********************************************************************** - * Set printer info - */ +/********************************************************************************* + Win32 API - SetPrinter() + ********************************************************************************/ + NTSTATUS cli_spoolss_setprinter(struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, PRINTER_INFO_CTR *ctr, uint32 command) @@ -656,9 +627,10 @@ done: return result; } -/********************************************************************** - * Get installed printer drivers for a given printer - */ +/********************************************************************************* + Win32 API - GetPrinterDriver() + ********************************************************************************/ + NTSTATUS cli_spoolss_getprinterdriver (struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, char* env, PRINTER_DRIVER_CTR *ctr) @@ -732,17 +704,13 @@ NTSTATUS cli_spoolss_getprinterdriver (struct cli_state *cli, TALLOC_CTX *mem_ct return result; } -/********************************************************************** - * Get installed printer drivers for a given printer - */ -NTSTATUS cli_spoolss_enumprinterdrivers ( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - uint32 level, - char* env, - uint32 *returned, - PRINTER_DRIVER_CTR *ctr -) +/********************************************************************************* + Win32 API - EnumPrinterDrivers() + ********************************************************************************/ + +NTSTATUS cli_spoolss_enumprinterdrivers (struct cli_state *cli, TALLOC_CTX *mem_ctx, + uint32 level, char* env, uint32 *returned, + PRINTER_DRIVER_CTR *ctr) { prs_struct qbuf, rbuf; SPOOL_Q_ENUMPRINTERDRIVERS q; @@ -815,16 +783,12 @@ NTSTATUS cli_spoolss_enumprinterdrivers ( } -/********************************************************************** - * Get installed printer drivers for a given printer - */ -NTSTATUS cli_spoolss_getprinterdriverdir ( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - uint32 level, - char* env, - DRIVER_DIRECTORY_CTR *ctr -) +/********************************************************************************* + Win32 API - GetPrinterDriverDirectory() + ********************************************************************************/ + +NTSTATUS cli_spoolss_getprinterdriverdir (struct cli_state *cli, TALLOC_CTX *mem_ctx, + uint32 level, char* env, DRIVER_DIRECTORY_CTR *ctr) { prs_struct qbuf, rbuf; SPOOL_Q_GETPRINTERDRIVERDIR q; @@ -887,15 +851,12 @@ NTSTATUS cli_spoolss_getprinterdriverdir ( return result; } -/********************************************************************** - * Install a printer driver - */ -NTSTATUS cli_spoolss_addprinterdriver ( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - uint32 level, - PRINTER_DRIVER_CTR *ctr -) +/********************************************************************************* + Win32 API - AddPrinterDriver() + ********************************************************************************/ + +NTSTATUS cli_spoolss_addprinterdriver (struct cli_state *cli, TALLOC_CTX *mem_ctx, + uint32 level, PRINTER_DRIVER_CTR *ctr) { prs_struct qbuf, rbuf; SPOOL_Q_ADDPRINTERDRIVER q; @@ -943,15 +904,12 @@ done: return result; } -/********************************************************************** - * Install a printer - */ -NTSTATUS cli_spoolss_addprinterex ( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - uint32 level, - PRINTER_INFO_CTR *ctr -) +/********************************************************************************* + Win32 API - AddPrinter() + ********************************************************************************/ + +NTSTATUS cli_spoolss_addprinterex (struct cli_state *cli, TALLOC_CTX *mem_ctx, + uint32 level, PRINTER_INFO_CTR *ctr) { prs_struct qbuf, rbuf; SPOOL_Q_ADDPRINTEREX q; @@ -1005,16 +963,12 @@ done: return result; } -/********************************************************************** - * Delete a Printer Driver from the server (does not remove - * the driver files - */ -NTSTATUS cli_spoolss_deleteprinterdriver ( - struct cli_state *cli, - TALLOC_CTX *mem_ctx, - char *arch, - char *driver -) +/********************************************************************************* + Win32 API - DeltePrinterDriver() + ********************************************************************************/ + +NTSTATUS cli_spoolss_deleteprinterdriver (struct cli_state *cli, TALLOC_CTX *mem_ctx, + char *arch, char *driver) { prs_struct qbuf, rbuf; SPOOL_Q_DELETEPRINTERDRIVER q; @@ -1062,13 +1016,12 @@ done: return result; } -/* Get print processor directory */ +/********************************************************************************* + Win32 API - GetPrinterProcessorDirectory() + ********************************************************************************/ -NTSTATUS cli_spoolss_getprintprocessordirectory(struct cli_state *cli, - TALLOC_CTX *mem_ctx, - char *name, - char *environment, - fstring procdir) +NTSTATUS cli_spoolss_getprintprocessordirectory(struct cli_state *cli, TALLOC_CTX *mem_ctx, + char *name, char *environment, fstring procdir) { prs_struct qbuf, rbuf; SPOOL_Q_GETPRINTPROCESSORDIRECTORY q; @@ -1126,7 +1079,9 @@ NTSTATUS cli_spoolss_getprintprocessordirectory(struct cli_state *cli, } -/*****************************************************************************/ +/********************************************************************************* + Win32 API - SetPrinterData() + ********************************************************************************/ NTSTATUS cli_spoolss_setprinterdata (struct cli_state *cli, TALLOC_CTX *mem_ctx, POLICY_HND *pol, char* valname, char* value) @@ -1168,55 +1123,4 @@ done: return result; } -NTSTATUS cli_spoolss_routerreplyprinter (struct cli_state *cli, TALLOC_CTX *mem_ctx, - POLICY_HND *pol, uint32 condition, uint32 changd_id) -{ - prs_struct qbuf, rbuf; - SPOOL_Q_ROUTERREPLYPRINTER q; - SPOOL_R_ROUTERREPLYPRINTER r; - NTSTATUS result; - - ZERO_STRUCT(q); - ZERO_STRUCT(r); - - - /* Initialise input parameters */ - - prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); - prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); - - - /* write the request */ - make_spoolss_q_routerreplyprinter(&q, pol, condition, changd_id); - - /* Marshall data and send request */ - if (!spoolss_io_q_routerreplyprinter ("", &q, &qbuf, 0)) { - DEBUG(0,("cli_spoolss_routerreplyprinter: Unable to marshall SPOOL_Q_ROUTERREPLYPRINTER!\n")); - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - - if (!rpc_api_pipe_req (cli, SPOOLSS_ROUTERREPLYPRINTER, &qbuf, &rbuf)) { - DEBUG(0,("cli_spoolss_routerreplyprinter: rpc_api_pipe_req failed!\n")); - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - /* Unmarshall response */ - if (!spoolss_io_r_routerreplyprinter ("", &r, &rbuf, 0)) { - DEBUG(0,("cli_spoolss_routerreplyprinter: Unable to unmarshall SPOOL_R_ROUTERREPLYPRINTER!\n")); - result = NT_STATUS_UNSUCCESSFUL; - goto done; - } - - /* Return output parameters */ - result = werror_to_ntstatus(r.status); - -done: - prs_mem_free(&qbuf); - prs_mem_free(&rbuf); - - return result; -} |