diff options
-rw-r--r-- | source3/rpc_client/msrpc_spoolss.c | 32 | ||||
-rw-r--r-- | source3/rpcclient/cmd_spoolss.c | 116 | ||||
-rw-r--r-- | source3/rpcclient/spoolss_cmds.c | 4 |
3 files changed, 149 insertions, 3 deletions
diff --git a/source3/rpc_client/msrpc_spoolss.c b/source3/rpc_client/msrpc_spoolss.c index 34e6d4404c..72ca7ee5c0 100644 --- a/source3/rpc_client/msrpc_spoolss.c +++ b/source3/rpc_client/msrpc_spoolss.c @@ -182,8 +182,11 @@ static void decode_printerdriverdir_info_1(NEW_BUFFER *buffer, DRIVER_DIRECTORY_ } -static void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, - PORT_INFO_2 **info) +/********************************************************************** + Decode a PORT_INFO_2 struct from a NEW_BUFFER +**********************************************************************/ +void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, + PORT_INFO_2 **info) { uint32 i; PORT_INFO_2 *inf; @@ -199,6 +202,28 @@ static void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, *info=inf; } +/********************************************************************** + Decode a PORT_INFO_1 struct from a NEW_BUFFER +**********************************************************************/ +void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned, + PORT_INFO_1 **info) +{ + uint32 i; + PORT_INFO_1 *inf; + + inf=(PORT_INFO_1*)malloc(returned*sizeof(PORT_INFO_1)); + + prs_set_offset(&buffer->prs, 0); + + for (i=0; i<returned; i++) { + /* WRITEME!!!! yet to be written --jerry */ + /* new_smb_io_port_info_1("", buffer, &(inf[i]), 0); */ + ;; + } + + *info=inf; +} + /**************************************************************************** nt spoolss query ****************************************************************************/ @@ -282,6 +307,9 @@ BOOL msrpc_spoolss_enum_ports(char* srv_name, if (returned != 0) { switch (level) { + case 1: + decode_port_info_1(&buffer, returned, &ctr->port.info_1); + break; case 2: decode_port_info_2(&buffer, returned, &ctr->port.info_2); break; diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c index 3a80e5d0e7..7ed6dd80ce 100644 --- a/source3/rpcclient/cmd_spoolss.c +++ b/source3/rpcclient/cmd_spoolss.c @@ -5,6 +5,7 @@ Copyright (C) Andrew Tridgell 1994-2000 Copyright (C) Luke Kenneth Casson Leighton 1996-2000 Copyright (C) Jean-Francois Micouleau 1999-2000 + Copyright (C) Gerald Carter 2000 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 @@ -457,7 +458,7 @@ uint32 cmd_spoolss_getprinterdriverdir(struct client_info *info, int argc, char uint32 level = 1; fstring srv_name; - fstring env; + fstring env; fstrcpy(srv_name, "\\\\"); fstrcat(srv_name, info->dest_host); @@ -483,3 +484,116 @@ uint32 cmd_spoolss_getprinterdriverdir(struct client_info *info, int argc, char return NT_STATUS_NOPROBLEMO; } +/******************************************************************************** + send an AddPrinterEx() request +********************************************************************************/ +uint32 cmd_spoolss_addprinterex(struct client_info *info, int argc, char *argv[]) +{ +#if 0 + PRINTER_INFO_CTR ctr; + uint32 level = 2; + fstring srv_name, + printer_name, + driver_name, + port_name; + POLICY_HND hnd; + PRINTER_INFO_2 print_info_2; + PORT_INFO_1 *port_info_1 = NULL; + NEW_BUFFER buffer; + uint32 status, + needed, + returned; + uint32 i; + fstring srv_port_name; + BOOL valid_port = False; + + fstrcpy(srv_name, "\\\\"); + fstrcat(srv_name, info->dest_host); + strupper(srv_name); + + /* check (and copy) the command line arguments */ + if (argc < 2) { + report(out_hnd, "spooladdprinterex <name> <driver>\n"); + return NT_STATUS_NOPROBLEMO; + } + + fstrcpy(printer_name, argv[1]); + fstrcpy(driver_name, argv[2]); + fstrcpy(port_name, argv[3]); + + + /* Verify that the specified port is ok; spoolss_enum_ports() should + be a level 1 since all we need is the name */ + init_buffer (&buffer, 0); + + /* send a NULL buffer first */ + status=spoolss_enum_ports(srv_name, 1, &buffer, 0, + &needed, &returned); + + /* send the right amount of space this time */ + if (status==ERROR_INSUFFICIENT_BUFFER) { + init_buffer(&buffer, needed); + status=spoolss_enum_ports(srv_name, 1, &buffer, + needed, &needed, &returned); + + /* if the call succeeded, then decode the buffer into + an PRINTER_INFO_1 structre */ + if (status == NT_STATUS_NO_PROBLEMO) + { + decode_port_info_1 (&buffer, returned, &port_info_1); + } + else + { + report (out_hnd, "cmd_spoolss_addprinterex: FAILED to enumerate ports\n")); + return NT_STATUS_NOPROBLEMO; + } + + } + + /* + * now we have an array of port names and we can interate + * through it to verify port_name before actually attempting + * to add the printer on the server. + */ + for (i=0; i<returned; i++) + { + /* compare port_info_1[i].port_name to the port_name specified */ + unistr_to_ascii(srv_port_name, port_info_1[i].port_name, sizeof(srv_port_name)-1); + if (strequal(srv_port_name, port_name)) + { + valid_port = True; + break; + } + } + if (!valid_port) + { + report (out_hnd, "cmd_spoolss_addprinterex: Invalid port specified!\n"); + return NT_STATUS_NOPROBLEMO; + } + + + /* + * Need to build the PRINTER_INFO_2 struct here + */ + ;; + + /* if successful, spoolss_addprinterex() should return True and hnd + should be a valid handle to an open printer */ + if (spoolss_addprinterex(&hnd, 2, &print_info_2)) + { + if (!spoolss_closeprinter( &hnd )) + { + report (out_hnd, "cmd_spoolss_addprinterex: spoolss_closeprinter FAILED!\n"); + } + } + else + { + report (out_hnd, "cmd_spoolss_addprinterex: spoolss_addprinterex FAILED!\n"); + } + + +#endif + return NT_STATUS_NOPROBLEMO; +} + + diff --git a/source3/rpcclient/spoolss_cmds.c b/source3/rpcclient/spoolss_cmds.c index 630d2f2aa5..1041ae158c 100644 --- a/source3/rpcclient/spoolss_cmds.c +++ b/source3/rpcclient/spoolss_cmds.c @@ -68,6 +68,10 @@ static const struct command_set spl_commands[] = { {"spoolgetprinterdriverdir", cmd_spoolss_getprinterdriverdir, "Spool get printer driver directory", {NULL, NULL}}, + + {"spooladdprinter", cmd_spoolss_addprinterex, + "<name> <driver> Spool AddPrinterEx()", + {NULL, NULL}}, /* * oop! */ |