2000-07-07 10:18:00 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-01-12 01:49:30 +03:00
RPC pipe client
2001-03-15 19:43:19 +03:00
Copyright ( C ) Gerald Carter 2001
2001-01-12 01:49:30 +03:00
Copyright ( C ) Tim Potter 2000
Copyright ( C ) Andrew Tridgell 1992 - 1999
Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1999
2000-07-07 10:18:00 +04:00
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 0213 9 , USA .
*/
# include "includes.h"
2001-10-12 09:56:23 +04:00
# include "rpcclient.h"
2000-07-07 10:18:00 +04:00
2001-03-16 01:06:53 +03:00
struct table_node {
char * long_archi ;
char * short_archi ;
int version ;
2001-03-15 10:13:27 +03:00
} ;
2001-03-16 01:06:53 +03:00
struct table_node archi_table [ ] = {
{ " Windows 4.0 " , " WIN40 " , 0 } ,
{ " Windows NT x86 " , " W32X86 " , 2 } ,
{ " Windows NT R4000 " , " W32MIPS " , 2 } ,
{ " Windows NT Alpha_AXP " , " W32ALPHA " , 2 } ,
{ " Windows NT PowerPC " , " W32PPC " , 2 } ,
{ NULL , " " , - 1 }
2001-03-15 10:13:27 +03:00
} ;
2001-03-16 01:06:53 +03:00
/****************************************************************************
function to do the mapping between the long architecture name and
the short one .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL get_short_archi ( char * short_archi , char * long_archi )
{
int i = - 1 ;
DEBUG ( 107 , ( " Getting architecture dependant directory \n " ) ) ;
do {
i + + ;
} while ( ( archi_table [ i ] . long_archi ! = NULL ) & &
StrCaseCmp ( long_archi , archi_table [ i ] . long_archi ) ) ;
if ( archi_table [ i ] . long_archi = = NULL ) {
DEBUGADD ( 10 , ( " Unknown architecture [%s] ! \n " , long_archi ) ) ;
2001-11-15 08:26:22 +03:00
return False ;
2001-03-16 01:06:53 +03:00
}
StrnCpy ( short_archi , archi_table [ i ] . short_archi , strlen ( archi_table [ i ] . short_archi ) ) ;
DEBUGADD ( 108 , ( " index: [%d] \n " , i ) ) ;
DEBUGADD ( 108 , ( " long architecture: [%s] \n " , long_archi ) ) ;
DEBUGADD ( 108 , ( " short architecture: [%s] \n " , short_archi ) ) ;
return True ;
}
2001-03-15 10:13:27 +03:00
2001-03-15 05:15:05 +03:00
/**********************************************************************
* dummy function - - placeholder
*/
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_not_implemented ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-15 05:15:05 +03:00
{
printf ( " (*) This command is not currently implemented. \n " ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-15 05:15:05 +03:00
}
/***********************************************************************
* Get printer information
*/
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_open_printer_ex ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-15 05:15:05 +03:00
{
2002-01-06 06:54:40 +03:00
WERROR werror ;
2001-03-15 05:15:05 +03:00
pstring printername ;
2001-05-04 11:34:16 +04:00
fstring servername , user ;
2001-03-15 05:15:05 +03:00
POLICY_HND hnd ;
if ( argc ! = 2 ) {
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s <printername> \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-15 05:15:05 +03:00
}
if ( ! cli )
return NT_STATUS_UNSUCCESSFUL ;
2001-04-28 04:32:56 +04:00
2001-05-04 11:34:16 +04:00
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
2001-03-15 05:15:05 +03:00
fstrcpy ( user , cli - > user_name ) ;
fstrcpy ( printername , argv [ 1 ] ) ;
2001-03-15 10:13:27 +03:00
/* Open the printer handle */
2001-03-15 05:15:05 +03:00
2002-01-06 06:54:40 +03:00
werror = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername ,
" " , MAXIMUM_ALLOWED_ACCESS ,
servername , user , & hnd ) ;
if ( W_ERROR_IS_OK ( werror ) ) {
printf ( " Printer %s opened successfully \n " , printername ) ;
werror = cli_spoolss_close_printer ( cli , mem_ctx , & hnd ) ;
if ( ! W_ERROR_IS_OK ( werror ) ) {
printf ( " Error closing printer handle! (%s) \n " ,
get_dos_error_msg ( werror ) ) ;
2001-03-15 05:15:05 +03:00
}
}
2002-01-31 14:36:30 +03:00
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-03-15 05:15:05 +03:00
}
2000-07-14 20:29:22 +04:00
/****************************************************************************
2001-01-12 01:49:30 +03:00
printer info level 0 display function
2000-07-14 20:29:22 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-01-03 06:51:13 +03:00
static void display_print_info_0 ( PRINTER_INFO_0 * i0 )
2000-07-14 20:29:22 +04:00
{
2002-03-07 07:22:16 +03:00
fstring name = " " ;
fstring servername = " " ;
if ( ! i0 )
return ;
2000-07-14 20:29:22 +04:00
2002-01-03 06:51:13 +03:00
if ( i0 - > printername . buffer )
rpcstr_pull ( name , i0 - > printername . buffer , sizeof ( name ) , 0 , STR_TERMINATE ) ;
if ( i0 - > servername . buffer )
rpcstr_pull ( servername , i0 - > servername . buffer , sizeof ( servername ) , 0 , STR_TERMINATE ) ;
2001-07-04 11:15:53 +04:00
2001-01-12 01:49:30 +03:00
printf ( " \t printername:[%s] \n " , name ) ;
2001-05-04 11:34:16 +04:00
printf ( " \t servername:[%s] \n " , servername ) ;
2002-01-03 06:51:13 +03:00
printf ( " \t cjobs:[0x%x] \n " , i0 - > cjobs ) ;
printf ( " \t total_jobs:[0x%x] \n " , i0 - > total_jobs ) ;
2001-01-12 01:49:30 +03:00
2002-01-03 06:51:13 +03:00
printf ( " \t :date: [%d]-[%d]-[%d] (%d) \n " , i0 - > year , i0 - > month ,
i0 - > day , i0 - > dayofweek ) ;
printf ( " \t :time: [%d]-[%d]-[%d]-[%d] \n " , i0 - > hour , i0 - > minute ,
i0 - > second , i0 - > milliseconds ) ;
2001-01-12 01:49:30 +03:00
2002-01-03 06:51:13 +03:00
printf ( " \t global_counter:[0x%x] \n " , i0 - > global_counter ) ;
printf ( " \t total_pages:[0x%x] \n " , i0 - > total_pages ) ;
2001-01-12 01:49:30 +03:00
2002-01-03 06:51:13 +03:00
printf ( " \t majorversion:[0x%x] \n " , i0 - > major_version ) ;
printf ( " \t buildversion:[0x%x] \n " , i0 - > build_version ) ;
2001-01-12 01:49:30 +03:00
2002-01-03 06:51:13 +03:00
printf ( " \t unknown7:[0x%x] \n " , i0 - > unknown7 ) ;
printf ( " \t unknown8:[0x%x] \n " , i0 - > unknown8 ) ;
printf ( " \t unknown9:[0x%x] \n " , i0 - > unknown9 ) ;
printf ( " \t session_counter:[0x%x] \n " , i0 - > session_counter ) ;
printf ( " \t unknown11:[0x%x] \n " , i0 - > unknown11 ) ;
printf ( " \t printer_errors:[0x%x] \n " , i0 - > printer_errors ) ;
printf ( " \t unknown13:[0x%x] \n " , i0 - > unknown13 ) ;
printf ( " \t unknown14:[0x%x] \n " , i0 - > unknown14 ) ;
printf ( " \t unknown15:[0x%x] \n " , i0 - > unknown15 ) ;
printf ( " \t unknown16:[0x%x] \n " , i0 - > unknown16 ) ;
printf ( " \t change_id:[0x%x] \n " , i0 - > change_id ) ;
printf ( " \t unknown18:[0x%x] \n " , i0 - > unknown18 ) ;
printf ( " \t status:[0x%x] \n " , i0 - > status ) ;
printf ( " \t unknown20:[0x%x] \n " , i0 - > unknown20 ) ;
printf ( " \t c_setprinter:[0x%x] \n " , i0 - > c_setprinter ) ;
printf ( " \t unknown22:[0x%x] \n " , i0 - > unknown22 ) ;
printf ( " \t unknown23:[0x%x] \n " , i0 - > unknown23 ) ;
printf ( " \t unknown24:[0x%x] \n " , i0 - > unknown24 ) ;
printf ( " \t unknown25:[0x%x] \n " , i0 - > unknown25 ) ;
printf ( " \t unknown26:[0x%x] \n " , i0 - > unknown26 ) ;
printf ( " \t unknown27:[0x%x] \n " , i0 - > unknown27 ) ;
printf ( " \t unknown28:[0x%x] \n " , i0 - > unknown28 ) ;
printf ( " \t unknown29:[0x%x] \n " , i0 - > unknown29 ) ;
2002-03-07 07:22:16 +03:00
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
2001-01-12 01:49:30 +03:00
printer info level 1 display function
2000-07-14 20:29:22 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-01-12 01:49:30 +03:00
static void display_print_info_1 ( PRINTER_INFO_1 * i1 )
2000-07-14 20:29:22 +04:00
{
2002-01-03 06:51:13 +03:00
fstring desc = " " ;
fstring name = " " ;
fstring comm = " " ;
2002-01-03 05:48:23 +03:00
if ( i1 - > description . buffer )
rpcstr_pull ( desc , i1 - > description . buffer , sizeof ( desc ) , 0 ,
STR_TERMINATE ) ;
if ( i1 - > name . buffer )
rpcstr_pull ( name , i1 - > name . buffer , sizeof ( name ) , 0 ,
STR_TERMINATE ) ;
if ( i1 - > comment . buffer )
rpcstr_pull ( comm , i1 - > comment . buffer , sizeof ( comm ) , 0 ,
STR_TERMINATE ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t flags:[0x%x] \n " , i1 - > flags ) ;
printf ( " \t name:[%s] \n " , name ) ;
printf ( " \t description:[%s] \n " , desc ) ;
2002-03-07 07:22:16 +03:00
printf ( " \t comment:[%s] \n " , comm ) ;
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
2001-01-12 01:49:30 +03:00
printer info level 2 display function
2000-07-14 20:29:22 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-01-12 01:49:30 +03:00
static void display_print_info_2 ( PRINTER_INFO_2 * i2 )
2000-07-14 20:29:22 +04:00
{
2002-01-03 06:51:13 +03:00
fstring servername = " " ;
fstring printername = " " ;
fstring sharename = " " ;
fstring portname = " " ;
fstring drivername = " " ;
fstring comment = " " ;
fstring location = " " ;
fstring sepfile = " " ;
fstring printprocessor = " " ;
fstring datatype = " " ;
fstring parameters = " " ;
2001-01-12 01:49:30 +03:00
2002-01-03 06:51:13 +03:00
if ( i2 - > servername . buffer )
rpcstr_pull ( servername , i2 - > servername . buffer , sizeof ( servername ) , 0 , STR_TERMINATE ) ;
if ( i2 - > printername . buffer )
rpcstr_pull ( printername , i2 - > printername . buffer , sizeof ( printername ) , 0 , STR_TERMINATE ) ;
if ( i2 - > sharename . buffer )
rpcstr_pull ( sharename , i2 - > sharename . buffer , sizeof ( sharename ) , 0 , STR_TERMINATE ) ;
if ( i2 - > portname . buffer )
rpcstr_pull ( portname , i2 - > portname . buffer , sizeof ( portname ) , 0 , STR_TERMINATE ) ;
if ( i2 - > drivername . buffer )
rpcstr_pull ( drivername , i2 - > drivername . buffer , sizeof ( drivername ) , 0 , STR_TERMINATE ) ;
if ( i2 - > comment . buffer )
rpcstr_pull ( comment , i2 - > comment . buffer , sizeof ( comment ) , 0 , STR_TERMINATE ) ;
if ( i2 - > location . buffer )
rpcstr_pull ( location , i2 - > location . buffer , sizeof ( location ) , 0 , STR_TERMINATE ) ;
if ( i2 - > sepfile . buffer )
rpcstr_pull ( sepfile , i2 - > sepfile . buffer , sizeof ( sepfile ) , 0 , STR_TERMINATE ) ;
if ( i2 - > printprocessor . buffer )
rpcstr_pull ( printprocessor , i2 - > printprocessor . buffer , sizeof ( printprocessor ) , 0 , STR_TERMINATE ) ;
if ( i2 - > datatype . buffer )
rpcstr_pull ( datatype , i2 - > datatype . buffer , sizeof ( datatype ) , 0 , STR_TERMINATE ) ;
if ( i2 - > parameters . buffer )
rpcstr_pull ( parameters , i2 - > parameters . buffer , sizeof ( parameters ) , 0 , STR_TERMINATE ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t servername:[%s] \n " , servername ) ;
printf ( " \t printername:[%s] \n " , printername ) ;
printf ( " \t sharename:[%s] \n " , sharename ) ;
printf ( " \t portname:[%s] \n " , portname ) ;
printf ( " \t drivername:[%s] \n " , drivername ) ;
printf ( " \t comment:[%s] \n " , comment ) ;
printf ( " \t location:[%s] \n " , location ) ;
printf ( " \t sepfile:[%s] \n " , sepfile ) ;
printf ( " \t printprocessor:[%s] \n " , printprocessor ) ;
printf ( " \t datatype:[%s] \n " , datatype ) ;
printf ( " \t parameters:[%s] \n " , parameters ) ;
printf ( " \t attributes:[0x%x] \n " , i2 - > attributes ) ;
printf ( " \t priority:[0x%x] \n " , i2 - > priority ) ;
printf ( " \t defaultpriority:[0x%x] \n " , i2 - > defaultpriority ) ;
printf ( " \t starttime:[0x%x] \n " , i2 - > starttime ) ;
printf ( " \t untiltime:[0x%x] \n " , i2 - > untiltime ) ;
printf ( " \t status:[0x%x] \n " , i2 - > status ) ;
printf ( " \t cjobs:[0x%x] \n " , i2 - > cjobs ) ;
printf ( " \t averageppm:[0x%x] \n " , i2 - > averageppm ) ;
2002-03-07 07:22:16 +03:00
if ( i2 - > secdesc )
display_sec_desc ( i2 - > secdesc ) ;
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
2001-01-12 01:49:30 +03:00
printer info level 3 display function
2000-07-14 20:29:22 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-01-12 01:49:30 +03:00
static void display_print_info_3 ( PRINTER_INFO_3 * i3 )
2000-07-14 20:29:22 +04:00
{
2001-01-12 01:49:30 +03:00
printf ( " \t flags:[0x%x] \n " , i3 - > flags ) ;
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
display_sec_desc ( i3 - > secdesc ) ;
2002-03-07 07:22:16 +03:00
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
2001-01-12 01:49:30 +03:00
/* Enumerate printers */
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_enum_printers ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2000-07-14 20:29:22 +04:00
{
2002-01-06 12:03:48 +03:00
WERROR result ;
2001-09-04 14:57:29 +04:00
uint32 info_level = 1 ;
2001-03-15 10:13:27 +03:00
PRINTER_INFO_CTR ctr ;
2002-01-06 12:03:48 +03:00
uint32 i = 0 , num_printers , needed ;
2001-04-28 04:32:56 +04:00
2001-03-15 10:13:27 +03:00
if ( argc > 2 )
{
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s [level] \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-01-12 01:49:30 +03:00
}
if ( argc = = 2 ) {
info_level = atoi ( argv [ 1 ] ) ;
}
2001-03-15 05:15:05 +03:00
/* Enumerate printers -- Should we enumerate types other
than PRINTER_ENUM_LOCAL ? Maybe accept as a parameter ? - - jerry */
2002-01-06 12:03:48 +03:00
2001-01-12 01:49:30 +03:00
ZERO_STRUCT ( ctr ) ;
2000-07-14 20:29:22 +04:00
2002-01-06 12:03:48 +03:00
result = cli_spoolss_enum_printers (
cli , mem_ctx , 0 , & needed , PRINTER_ENUM_LOCAL ,
info_level , & num_printers , & ctr ) ;
if ( W_ERROR_V ( result ) = = ERRinsufficientbuffer )
result = cli_spoolss_enum_printers (
cli , mem_ctx , needed , NULL , PRINTER_ENUM_LOCAL ,
info_level , & num_printers , & ctr ) ;
if ( W_ERROR_IS_OK ( result ) ) {
2002-03-07 07:29:13 +03:00
if ( ! num_printers ) {
printf ( " No printers returned. \n " ) ;
goto done ;
}
2001-04-28 04:32:56 +04:00
2002-03-07 07:22:16 +03:00
for ( i = 0 ; i < num_printers ; i + + ) {
switch ( info_level ) {
case 0 :
2002-01-06 12:03:48 +03:00
display_print_info_0 ( & ctr . printers_0 [ i ] ) ;
2002-03-07 07:22:16 +03:00
break ;
case 1 :
2002-01-06 12:03:48 +03:00
display_print_info_1 ( & ctr . printers_1 [ i ] ) ;
2002-03-07 07:22:16 +03:00
break ;
case 2 :
2002-01-06 12:03:48 +03:00
display_print_info_2 ( & ctr . printers_2 [ i ] ) ;
2002-03-07 07:22:16 +03:00
break ;
case 3 :
2002-01-06 12:03:48 +03:00
display_print_info_3 ( & ctr . printers_3 [ i ] ) ;
2002-03-07 07:22:16 +03:00
break ;
default :
printf ( " unknown info level %d \n " , info_level ) ;
goto done ;
}
2001-01-12 01:49:30 +03:00
}
2002-03-07 07:22:16 +03:00
done :
2001-01-12 01:49:30 +03:00
}
2002-02-19 05:12:01 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
2001-01-12 01:49:30 +03:00
port info level 1 display function
2000-07-14 20:29:22 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-01-12 01:49:30 +03:00
static void display_port_info_1 ( PORT_INFO_1 * i1 )
2000-07-14 20:29:22 +04:00
{
2001-01-12 01:49:30 +03:00
fstring buffer ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( buffer , i1 - > port_name . buffer , sizeof ( buffer ) , 0 , STR_TERMINATE ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t Port Name: \t [%s] \n " , buffer ) ;
}
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
/****************************************************************************
port info level 2 display function
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_port_info_2 ( PORT_INFO_2 * i2 )
{
fstring buffer ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( buffer , i2 - > port_name . buffer , sizeof ( buffer ) , 0 , STR_TERMINATE ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t Port Name: \t [%s] \n " , buffer ) ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( buffer , i2 - > monitor_name . buffer , sizeof ( buffer ) , 0 , STR_TERMINATE ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t Monitor Name: \t [%s] \n " , buffer ) ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( buffer , i2 - > description . buffer , sizeof ( buffer ) , 0 , STR_TERMINATE ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t Description: \t [%s] \n " , buffer ) ;
printf ( " \t Port Type: \t [%d] \n " , i2 - > port_type ) ;
printf ( " \t Reserved: \t [%d] \n " , i2 - > reserved ) ;
printf ( " \n " ) ;
}
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
/* Enumerate ports */
2000-07-14 20:29:22 +04:00
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_enum_ports ( struct cli_state * cli ,
2002-01-06 12:03:48 +03:00
TALLOC_CTX * mem_ctx , int argc ,
char * * argv )
2001-01-12 01:49:30 +03:00
{
2002-01-06 12:03:48 +03:00
WERROR result ;
uint32 needed , info_level = 1 ;
2001-03-15 10:13:27 +03:00
PORT_INFO_CTR ctr ;
int returned ;
2001-01-12 01:49:30 +03:00
2001-03-15 10:13:27 +03:00
if ( argc > 2 ) {
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s [level] \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-01-12 01:49:30 +03:00
}
2001-04-28 04:32:56 +04:00
2002-01-06 12:03:48 +03:00
if ( argc = = 2 )
2001-01-12 01:49:30 +03:00
info_level = atoi ( argv [ 1 ] ) ;
2000-07-14 20:29:22 +04:00
2001-03-14 23:22:57 +03:00
/* Enumerate ports */
2002-01-06 12:03:48 +03:00
2001-01-12 01:49:30 +03:00
ZERO_STRUCT ( ctr ) ;
2002-01-06 12:03:48 +03:00
result = cli_spoolss_enum_ports ( cli , mem_ctx , 0 , & needed , info_level ,
& returned , & ctr ) ;
if ( W_ERROR_V ( result ) = = ERRinsufficientbuffer )
result = cli_spoolss_enum_ports ( cli , mem_ctx , needed , NULL ,
info_level , & returned , & ctr ) ;
2001-01-12 01:49:30 +03:00
2002-01-06 12:03:48 +03:00
if ( W_ERROR_IS_OK ( result ) ) {
2001-01-12 01:49:30 +03:00
int i ;
for ( i = 0 ; i < returned ; i + + ) {
switch ( info_level ) {
case 1 :
display_port_info_1 ( & ctr . port . info_1 [ i ] ) ;
2002-01-06 12:03:48 +03:00
break ;
2001-01-12 01:49:30 +03:00
case 2 :
display_port_info_2 ( & ctr . port . info_2 [ i ] ) ;
break ;
default :
2001-01-12 20:53:47 +03:00
printf ( " unknown info level %d \n " , info_level ) ;
2001-01-12 01:49:30 +03:00
break ;
}
2000-07-26 01:07:46 +04:00
}
}
2002-01-06 12:03:48 +03:00
2002-02-19 05:12:01 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2000-07-26 01:07:46 +04:00
}
2000-08-08 10:57:48 +04:00
2001-03-15 05:15:05 +03:00
/***********************************************************************
* Get printer information
*/
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_getprinter ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2000-08-08 10:57:48 +04:00
{
2001-03-15 10:13:27 +03:00
POLICY_HND pol ;
2002-02-19 05:12:01 +03:00
WERROR result ;
2001-09-04 14:57:29 +04:00
uint32 info_level = 1 ;
2001-03-15 10:13:27 +03:00
BOOL opened_hnd = False ;
2001-01-12 01:49:30 +03:00
PRINTER_INFO_CTR ctr ;
2001-03-15 10:13:27 +03:00
fstring printername ,
2001-03-16 01:06:53 +03:00
servername ,
2001-05-04 11:34:16 +04:00
user ;
2002-02-19 05:12:01 +03:00
uint32 needed ;
2001-01-12 01:49:30 +03:00
if ( argc = = 1 | | argc > 3 ) {
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s <printername> [level] \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2000-08-08 10:57:48 +04:00
}
2001-01-12 01:49:30 +03:00
/* Open a printer handle */
if ( argc = = 3 ) {
info_level = atoi ( argv [ 2 ] ) ;
}
2000-08-10 00:14:29 +04:00
2001-04-09 00:22:39 +04:00
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
2001-03-15 10:13:27 +03:00
strupper ( servername ) ;
2001-04-28 04:32:56 +04:00
slprintf ( printername , sizeof ( fstring ) - 1 , " %s \\ %s " , servername , argv [ 1 ] ) ;
2001-05-04 11:34:16 +04:00
fstrcpy ( user , cli - > user_name ) ;
2001-03-15 10:13:27 +03:00
/* get a printer handle */
2002-01-06 06:54:40 +03:00
2002-02-19 05:12:01 +03:00
result = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername ,
2002-01-06 06:54:40 +03:00
" " , MAXIMUM_ALLOWED_ACCESS ,
servername , user , & pol ) ;
2002-02-19 05:12:01 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
2001-01-12 01:49:30 +03:00
goto done ;
2001-03-16 01:06:53 +03:00
2001-01-12 01:49:30 +03:00
opened_hnd = True ;
/* Get printer info */
2002-01-06 06:54:40 +03:00
2002-02-19 05:12:01 +03:00
result = cli_spoolss_getprinter ( cli , mem_ctx , 0 , & needed ,
& pol , info_level , & ctr ) ;
2002-01-06 06:54:40 +03:00
2002-02-19 05:12:01 +03:00
if ( W_ERROR_V ( result ) = = ERRinsufficientbuffer )
result = cli_spoolss_getprinter (
cli , mem_ctx , needed , NULL , & pol , info_level , & ctr ) ;
if ( ! W_ERROR_IS_OK ( result ) )
2001-01-12 01:49:30 +03:00
goto done ;
/* Display printer info */
switch ( info_level ) {
case 0 :
display_print_info_0 ( ctr . printers_0 ) ;
break ;
case 1 :
display_print_info_1 ( ctr . printers_1 ) ;
break ;
case 2 :
display_print_info_2 ( ctr . printers_2 ) ;
break ;
case 3 :
display_print_info_3 ( ctr . printers_3 ) ;
break ;
default :
printf ( " unknown info level %d \n " , info_level ) ;
break ;
2000-08-08 10:57:48 +04:00
}
2001-01-12 01:49:30 +03:00
done :
2001-03-15 05:15:05 +03:00
if ( opened_hnd )
2001-04-28 04:32:56 +04:00
cli_spoolss_close_printer ( cli , mem_ctx , & pol ) ;
2001-01-12 20:53:47 +03:00
2002-02-19 05:12:01 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2000-08-08 10:57:48 +04:00
}
2000-08-10 00:14:29 +04:00
2001-03-15 10:13:27 +03:00
/****************************************************************************
printer info level 0 display function
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver_1 ( DRIVER_INFO_1 * i1 )
{
fstring name ;
if ( i1 = = NULL )
return ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( name , i1 - > name . buffer , sizeof ( name ) , 0 , STR_TERMINATE ) ;
2001-03-15 10:13:27 +03:00
printf ( " Printer Driver Info 1: \n " ) ;
printf ( " \t Driver Name: [%s] \n \n " , name ) ;
return ;
}
/****************************************************************************
printer info level 1 display function
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver_2 ( DRIVER_INFO_2 * i1 )
{
fstring name ;
fstring architecture ;
fstring driverpath ;
fstring datafile ;
fstring configfile ;
if ( i1 = = NULL )
return ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( name , i1 - > name . buffer , sizeof ( name ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( architecture , i1 - > architecture . buffer , sizeof ( architecture ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( driverpath , i1 - > driverpath . buffer , sizeof ( driverpath ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( datafile , i1 - > datafile . buffer , sizeof ( datafile ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( configfile , i1 - > configfile . buffer , sizeof ( configfile ) , 0 , STR_TERMINATE ) ;
2001-03-15 10:13:27 +03:00
printf ( " Printer Driver Info 2: \n " ) ;
printf ( " \t Version: [%x] \n " , i1 - > version ) ;
printf ( " \t Driver Name: [%s] \n " , name ) ;
printf ( " \t Architecture: [%s] \n " , architecture ) ;
printf ( " \t Driver Path: [%s] \n " , driverpath ) ;
printf ( " \t Datafile: [%s] \n " , datafile ) ;
printf ( " \t Configfile: [%s] \n \n " , configfile ) ;
return ;
}
/****************************************************************************
printer info level 2 display function
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver_3 ( DRIVER_INFO_3 * i1 )
{
fstring name ;
fstring architecture ;
fstring driverpath ;
fstring datafile ;
fstring configfile ;
fstring helpfile ;
fstring dependentfiles ;
fstring monitorname ;
fstring defaultdatatype ;
int length = 0 ;
BOOL valid = True ;
if ( i1 = = NULL )
return ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( name , i1 - > name . buffer , sizeof ( name ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( architecture , i1 - > architecture . buffer , sizeof ( architecture ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( driverpath , i1 - > driverpath . buffer , sizeof ( driverpath ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( datafile , i1 - > datafile . buffer , sizeof ( datafile ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( configfile , i1 - > configfile . buffer , sizeof ( configfile ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( helpfile , i1 - > helpfile . buffer , sizeof ( helpfile ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( monitorname , i1 - > monitorname . buffer , sizeof ( monitorname ) , 0 , STR_TERMINATE ) ;
rpcstr_pull ( defaultdatatype , i1 - > defaultdatatype . buffer , sizeof ( defaultdatatype ) , 0 , STR_TERMINATE ) ;
2001-03-15 10:13:27 +03:00
printf ( " Printer Driver Info 3: \n " ) ;
printf ( " \t Version: [%x] \n " , i1 - > version ) ;
2001-07-04 11:15:53 +04:00
printf ( " \t Driver Name: [%s] \n " , name ) ;
2001-03-15 10:13:27 +03:00
printf ( " \t Architecture: [%s] \n " , architecture ) ;
printf ( " \t Driver Path: [%s] \n " , driverpath ) ;
printf ( " \t Datafile: [%s] \n " , datafile ) ;
printf ( " \t Configfile: [%s] \n " , configfile ) ;
printf ( " \t Helpfile: [%s] \n \n " , helpfile ) ;
while ( valid )
{
2001-07-04 11:15:53 +04:00
rpcstr_pull ( dependentfiles , i1 - > dependentfiles + length , sizeof ( dependentfiles ) , 0 , STR_TERMINATE ) ;
2001-03-15 10:13:27 +03:00
length + = strlen ( dependentfiles ) + 1 ;
if ( strlen ( dependentfiles ) > 0 )
{
printf ( " \t Dependentfiles: [%s] \n " , dependentfiles ) ;
}
else
{
valid = False ;
}
}
printf ( " \n " ) ;
printf ( " \t Monitorname: [%s] \n " , monitorname ) ;
printf ( " \t Defaultdatatype: [%s] \n \n " , defaultdatatype ) ;
return ;
}
/***********************************************************************
* Get printer information
*/
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_getdriver ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-15 10:13:27 +03:00
{
POLICY_HND pol ;
2002-01-06 06:54:40 +03:00
WERROR werror ;
2001-09-04 14:57:29 +04:00
NTSTATUS result ;
uint32 info_level = 3 ;
2001-03-15 10:13:27 +03:00
BOOL opened_hnd = False ;
PRINTER_DRIVER_CTR ctr ;
fstring printername ,
2001-05-04 11:34:16 +04:00
servername ,
2001-03-15 10:13:27 +03:00
user ;
uint32 i ;
if ( ( argc = = 1 ) | | ( argc > 3 ) )
{
printf ( " Usage: %s <printername> [level] \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-15 10:13:27 +03:00
}
/* get the arguments need to open the printer handle */
2001-05-04 11:34:16 +04:00
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
2001-03-15 10:13:27 +03:00
fstrcpy ( user , cli - > user_name ) ;
fstrcpy ( printername , argv [ 1 ] ) ;
if ( argc = = 3 )
info_level = atoi ( argv [ 2 ] ) ;
/* Open a printer handle */
2002-01-06 06:54:40 +03:00
werror = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername , " " ,
2002-01-07 06:33:46 +03:00
PRINTER_ACCESS_USE ,
2002-01-06 06:54:40 +03:00
servername , user , & pol ) ;
2002-01-31 14:36:30 +03:00
result = W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2002-01-06 06:54:40 +03:00
2001-09-04 14:57:29 +04:00
if ( ! NT_STATUS_IS_OK ( result ) ) {
2002-01-06 06:54:40 +03:00
printf ( " Error opening printer handle for %s! \n " , printername ) ;
2001-03-15 10:13:27 +03:00
return result ;
}
opened_hnd = True ;
/* loop through and print driver info level for each architecture */
2002-01-07 06:33:46 +03:00
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + ) {
uint32 needed ;
werror = cli_spoolss_getprinterdriver (
cli , mem_ctx , 0 , & needed , & pol , info_level ,
archi_table [ i ] . long_archi , & ctr ) ;
if ( W_ERROR_V ( werror ) = = ERRinsufficientbuffer )
werror = cli_spoolss_getprinterdriver (
cli , mem_ctx , needed , NULL , & pol , info_level ,
archi_table [ i ] . long_archi , & ctr ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
continue ;
2001-03-15 10:13:27 +03:00
printf ( " \n [%s] \n " , archi_table [ i ] . long_archi ) ;
2002-01-07 06:33:46 +03:00
switch ( info_level ) {
2001-03-15 10:13:27 +03:00
case 1 :
display_print_driver_1 ( ctr . info1 ) ;
break ;
case 2 :
display_print_driver_2 ( ctr . info2 ) ;
break ;
case 3 :
display_print_driver_3 ( ctr . info3 ) ;
break ;
default :
printf ( " unknown info level %d \n " , info_level ) ;
break ;
}
}
2002-01-06 06:54:40 +03:00
/* Cleanup */
2001-03-15 10:13:27 +03:00
if ( opened_hnd )
2001-04-28 04:32:56 +04:00
cli_spoolss_close_printer ( cli , mem_ctx , & pol ) ;
2001-03-15 10:13:27 +03:00
2002-02-20 21:41:07 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-03-15 10:13:27 +03:00
}
/***********************************************************************
* Get printer information
*/
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_enum_drivers ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-15 10:13:27 +03:00
{
2002-02-19 04:06:55 +03:00
WERROR werror ;
2001-09-04 14:57:29 +04:00
uint32 info_level = 1 ;
2001-03-15 10:13:27 +03:00
PRINTER_DRIVER_CTR ctr ;
uint32 i , j ,
returned ;
if ( argc > 2 )
{
printf ( " Usage: enumdrivers [level] \n " ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-15 10:13:27 +03:00
}
if ( argc = = 2 )
info_level = atoi ( argv [ 1 ] ) ;
/* loop through and print driver info level for each architecture */
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + )
{
2002-02-19 04:06:55 +03:00
uint32 needed ;
werror = cli_spoolss_enumprinterdrivers (
cli , mem_ctx , 0 , & needed , info_level ,
archi_table [ i ] . long_archi , & returned , & ctr ) ;
if ( W_ERROR_V ( werror ) = = ERRinsufficientbuffer )
werror = cli_spoolss_enumprinterdrivers (
cli , mem_ctx , needed , NULL , info_level ,
2001-03-15 10:13:27 +03:00
archi_table [ i ] . long_archi , & returned , & ctr ) ;
if ( returned = = 0 )
continue ;
2002-02-19 04:06:55 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
printf ( " Error getting driver for environment [%s] - %d \n " ,
archi_table [ i ] . long_archi , W_ERROR_V ( werror ) ) ;
2001-03-15 10:13:27 +03:00
continue ;
}
printf ( " \n [%s] \n " , archi_table [ i ] . long_archi ) ;
switch ( info_level )
{
case 1 :
for ( j = 0 ; j < returned ; j + + ) {
display_print_driver_1 ( & ( ctr . info1 [ j ] ) ) ;
}
break ;
case 2 :
for ( j = 0 ; j < returned ; j + + ) {
display_print_driver_2 ( & ( ctr . info2 [ j ] ) ) ;
}
break ;
case 3 :
for ( j = 0 ; j < returned ; j + + ) {
display_print_driver_3 ( & ( ctr . info3 [ j ] ) ) ;
}
break ;
default :
printf ( " unknown info level %d \n " , info_level ) ;
break ;
}
}
2002-02-19 04:06:55 +03:00
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-03-15 10:13:27 +03:00
}
2001-03-15 19:43:19 +03:00
/****************************************************************************
printer info level 1 display function
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_printdriverdir_1 ( DRIVER_DIRECTORY_1 * i1 )
{
fstring name ;
if ( i1 = = NULL )
return ;
2001-07-04 11:15:53 +04:00
rpcstr_pull ( name , i1 - > name . buffer , sizeof ( name ) , 0 , STR_TERMINATE ) ;
2001-03-15 19:43:19 +03:00
printf ( " \t Directory Name:[%s] \n " , name ) ;
}
/***********************************************************************
2001-03-16 01:06:53 +03:00
* Get printer driver directory information
2001-03-15 19:43:19 +03:00
*/
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_getdriverdir ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-15 19:43:19 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2001-03-15 19:43:19 +03:00
fstring env ;
DRIVER_DIRECTORY_CTR ctr ;
2002-02-20 21:41:07 +03:00
uint32 needed ;
2001-03-15 19:43:19 +03:00
2002-02-20 21:41:07 +03:00
if ( argc > 2 ) {
2001-03-15 19:43:19 +03:00
printf ( " Usage: %s [environment] \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-15 19:43:19 +03:00
}
2002-02-20 21:41:07 +03:00
/* Get the arguments need to open the printer handle */
2001-03-15 19:43:19 +03:00
if ( argc = = 2 )
fstrcpy ( env , argv [ 1 ] ) ;
else
fstrcpy ( env , " Windows NT x86 " ) ;
/* Get the directory. Only use Info level 1 */
2002-02-20 21:41:07 +03:00
result = cli_spoolss_getprinterdriverdir (
cli , mem_ctx , 0 , & needed , 1 , env , & ctr ) ;
if ( W_ERROR_V ( result ) = = ERRinsufficientbuffer )
result = cli_spoolss_getprinterdriverdir (
cli , mem_ctx , needed , NULL , 1 , env , & ctr ) ;
2001-03-15 19:43:19 +03:00
2002-02-20 21:41:07 +03:00
if ( W_ERROR_IS_OK ( result ) )
display_printdriverdir_1 ( ctr . info1 ) ;
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-03-15 19:43:19 +03:00
}
2001-03-16 01:06:53 +03:00
/*******************************************************************************
set the version and environment fields of a DRIVER_INFO_3 struct
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void set_drv_info_3_env ( DRIVER_INFO_3 * info , const char * arch )
{
int i ;
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + )
{
if ( strcmp ( arch , archi_table [ i ] . short_archi ) = = 0 )
{
info - > version = archi_table [ i ] . version ;
init_unistr ( & info - > architecture , archi_table [ i ] . long_archi ) ;
break ;
}
}
if ( archi_table [ i ] . long_archi = = NULL )
{
DEBUG ( 0 , ( " set_drv_info_3_env: Unknown arch [%s] \n " , arch ) ) ;
}
return ;
}
/**************************************************************************
wrapper for strtok to get the next parameter from a delimited list .
Needed to handle the empty parameter string denoted by " NULL "
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * get_driver_3_param ( char * str , char * delim , UNISTR * dest )
{
char * ptr ;
/* get the next token */
ptr = strtok ( str , delim ) ;
/* a string of 'NULL' is used to represent an empty
parameter because two consecutive delimiters
will not return an empty string . See man strtok ( 3 )
for details */
if ( StrCaseCmp ( ptr , " NULL " ) = = 0 )
ptr = NULL ;
if ( dest ! = NULL )
init_unistr ( dest , ptr ) ;
return ptr ;
}
/********************************************************************************
fill in the members of a DRIVER_INFO_3 struct using a character
string in the form of
< Long Printer Name > : < Driver File Name > : < Data File Name > : \
< Config File Name > : < Help File Name > : < Language Monitor Name > : \
< Default Data Type > : < Comma Separated list of Files >
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-04-28 04:32:56 +04:00
static BOOL init_drv_info_3_members (
TALLOC_CTX * mem_ctx ,
DRIVER_INFO_3 * info ,
char * args
)
2001-03-16 01:06:53 +03:00
{
char * str , * str2 ;
uint32 len , i ;
/* fill in the UNISTR fields */
str = get_driver_3_param ( args , " : " , & info - > name ) ;
str = get_driver_3_param ( NULL , " : " , & info - > driverpath ) ;
str = get_driver_3_param ( NULL , " : " , & info - > datafile ) ;
str = get_driver_3_param ( NULL , " : " , & info - > configfile ) ;
str = get_driver_3_param ( NULL , " : " , & info - > helpfile ) ;
str = get_driver_3_param ( NULL , " : " , & info - > monitorname ) ;
str = get_driver_3_param ( NULL , " : " , & info - > defaultdatatype ) ;
/* <Comma Separated List of Dependent Files> */
str2 = get_driver_3_param ( NULL , " : " , NULL ) ; /* save the beginning of the string */
str = str2 ;
/* begin to strip out each filename */
str = strtok ( str , " , " ) ;
len = 0 ;
while ( str ! = NULL )
{
/* keep a cumlative count of the str lengths */
len + = strlen ( str ) + 1 ;
str = strtok ( NULL , " , " ) ;
}
/* allocate the space; add one extra slot for a terminating NULL.
Each filename is NULL terminated and the end contains a double
NULL */
2001-04-28 04:32:56 +04:00
if ( ( info - > dependentfiles = ( uint16 * ) talloc ( mem_ctx , ( len + 1 ) * sizeof ( uint16 ) ) ) = = NULL )
2001-03-16 01:06:53 +03:00
{
DEBUG ( 0 , ( " init_drv_info_3_members: Unable to malloc memory for dependenfiles \n " ) ) ;
return False ;
}
for ( i = 0 ; i < len ; i + + )
{
2001-12-31 00:25:46 +03:00
info - > dependentfiles [ i ] = SSVAL ( & info - > dependentfiles [ i ] , 0 , str2 [ i ] ) ;
2001-03-16 01:06:53 +03:00
}
info - > dependentfiles [ len ] = ' \0 ' ;
return True ;
}
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_addprinterdriver ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-16 01:06:53 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2001-09-04 14:57:29 +04:00
uint32 level = 3 ;
2001-03-16 01:06:53 +03:00
PRINTER_DRIVER_CTR ctr ;
DRIVER_INFO_3 info3 ;
fstring arch ;
fstring driver_name ;
/* parse the command arguements */
if ( argc ! = 3 )
{
printf ( " Usage: %s <Environment> \\ \n " , argv [ 0 ] ) ;
printf ( " \t <Long Printer Name>:<Driver File Name>:<Data File Name>: \\ \n " ) ;
printf ( " \t <Config File Name>:<Help File Name>:<Language Monitor Name>: \\ \n " ) ;
printf ( " \t <Default Data Type>:<Comma Separated list of Files> \n " ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-16 01:06:53 +03:00
}
/* Fill in the DRIVER_INFO_3 struct */
ZERO_STRUCT ( info3 ) ;
if ( ! get_short_archi ( arch , argv [ 1 ] ) )
{
printf ( " Error Unknown architechture [%s] \n " , argv [ 1 ] ) ;
return NT_STATUS_INVALID_PARAMETER ;
}
else
set_drv_info_3_env ( & info3 , arch ) ;
2001-04-28 04:32:56 +04:00
if ( ! init_drv_info_3_members ( mem_ctx , & info3 , argv [ 2 ] ) )
2001-03-16 01:06:53 +03:00
{
printf ( " Error Invalid parameter list - %s. \n " , argv [ 2 ] ) ;
return NT_STATUS_INVALID_PARAMETER ;
}
ctr . info3 = & info3 ;
2001-09-04 14:57:29 +04:00
result = cli_spoolss_addprinterdriver ( cli , mem_ctx , level , & ctr ) ;
2001-03-16 01:06:53 +03:00
2002-02-20 21:41:07 +03:00
if ( W_ERROR_IS_OK ( result ) ) {
rpcstr_pull ( driver_name , info3 . name . buffer ,
sizeof ( driver_name ) , 0 , STR_TERMINATE ) ;
printf ( " Printer Driver %s successfully installed. \n " ,
driver_name ) ;
}
2001-03-16 01:06:53 +03:00
2002-02-20 21:41:07 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-03-16 01:06:53 +03:00
}
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_addprinterex ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-03-16 01:06:53 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2001-09-04 14:57:29 +04:00
uint32 level = 2 ;
2001-03-16 01:06:53 +03:00
PRINTER_INFO_CTR ctr ;
PRINTER_INFO_2 info2 ;
2001-05-04 11:34:16 +04:00
fstring servername ;
2001-03-16 01:06:53 +03:00
/* parse the command arguements */
if ( argc ! = 5 )
{
printf ( " Usage: %s <name> <shared name> <driver> <port> \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-03-16 01:06:53 +03:00
}
2001-04-28 04:32:56 +04:00
2001-05-04 11:34:16 +04:00
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
2001-03-16 01:06:53 +03:00
/* Fill in the DRIVER_INFO_3 struct */
ZERO_STRUCT ( info2 ) ;
#if 0 /* JERRY */
2001-05-04 11:34:16 +04:00
init_unistr ( & info2 . servername , servername ) ;
2001-03-16 01:06:53 +03:00
# endif
init_unistr ( & info2 . printername , argv [ 1 ] ) ;
init_unistr ( & info2 . sharename , argv [ 2 ] ) ;
init_unistr ( & info2 . drivername , argv [ 3 ] ) ;
init_unistr ( & info2 . portname , argv [ 4 ] ) ;
init_unistr ( & info2 . comment , " Created by rpcclient " ) ;
init_unistr ( & info2 . printprocessor , " winprint " ) ;
init_unistr ( & info2 . datatype , " RAW " ) ;
info2 . devmode = NULL ;
info2 . secdesc = NULL ;
info2 . attributes = PRINTER_ATTRIBUTE_SHARED ;
info2 . priority = 0 ;
info2 . defaultpriority = 0 ;
info2 . starttime = 0 ;
info2 . untiltime = 0 ;
/* These three fields must not be used by AddPrinter()
as defined in the MS Platform SDK documentation . .
- - jerry
info2 . status = 0 ;
info2 . cjobs = 0 ;
info2 . averageppm = 0 ;
*/
ctr . printers_2 = & info2 ;
2001-09-04 14:57:29 +04:00
result = cli_spoolss_addprinterex ( cli , mem_ctx , level , & ctr ) ;
2001-03-16 01:06:53 +03:00
2002-02-20 21:41:07 +03:00
if ( W_ERROR_IS_OK ( result ) )
printf ( " Printer %s successfully installed. \n " , argv [ 1 ] ) ;
2001-03-16 01:06:53 +03:00
2002-02-20 21:41:07 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-03-16 01:06:53 +03:00
}
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_setdriver ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-04-28 04:32:56 +04:00
{
POLICY_HND pol ;
2002-01-06 06:54:40 +03:00
WERROR result ;
2001-09-04 14:57:29 +04:00
uint32 level = 2 ;
2001-04-28 04:32:56 +04:00
BOOL opened_hnd = False ;
PRINTER_INFO_CTR ctr ;
PRINTER_INFO_2 info2 ;
fstring servername ,
printername ,
2001-05-04 11:34:16 +04:00
user ;
2002-02-19 05:12:01 +03:00
uint32 needed ;
2001-04-28 04:32:56 +04:00
/* parse the command arguements */
if ( argc ! = 3 )
{
printf ( " Usage: %s <printer> <driver> \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-04-28 04:32:56 +04:00
}
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
slprintf ( printername , sizeof ( fstring ) - 1 , " %s \\ %s " , servername , argv [ 1 ] ) ;
2001-05-04 11:34:16 +04:00
fstrcpy ( user , cli - > user_name ) ;
2001-04-28 04:32:56 +04:00
2002-01-06 06:54:40 +03:00
/* Get a printer handle */
2001-09-04 14:57:29 +04:00
result = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername , " " ,
2002-01-06 06:54:40 +03:00
MAXIMUM_ALLOWED_ACCESS ,
servername , user , & pol ) ;
2002-02-20 21:41:07 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
2001-04-28 04:32:56 +04:00
goto done ;
2002-02-20 21:41:07 +03:00
2001-04-28 04:32:56 +04:00
opened_hnd = True ;
/* Get printer info */
2002-01-06 06:54:40 +03:00
2001-04-28 04:32:56 +04:00
ZERO_STRUCT ( info2 ) ;
ctr . printers_2 = & info2 ;
2002-01-06 06:54:40 +03:00
2002-02-19 05:12:01 +03:00
result = cli_spoolss_getprinter ( cli , mem_ctx , 0 , & needed ,
& pol , level , & ctr ) ;
2002-01-06 06:54:40 +03:00
2002-02-19 05:12:01 +03:00
if ( W_ERROR_V ( result ) = = ERRinsufficientbuffer )
result = cli_spoolss_getprinter (
cli , mem_ctx , needed , NULL , & pol , level , & ctr ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
2001-05-31 21:28:40 +04:00
printf ( " Unable to retrieve printer information! \n " ) ;
2001-04-28 04:32:56 +04:00
goto done ;
}
2002-01-06 06:54:40 +03:00
/* Set the printer driver */
2001-04-28 04:32:56 +04:00
init_unistr ( & ctr . printers_2 - > drivername , argv [ 2 ] ) ;
2002-01-06 06:54:40 +03:00
2002-02-20 21:41:07 +03:00
result = cli_spoolss_setprinter ( cli , mem_ctx , & pol , level , & ctr , 0 ) ;
2002-01-06 06:54:40 +03:00
2002-02-20 21:41:07 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-01-06 06:54:40 +03:00
printf ( " SetPrinter call failed! \n " ) ;
2001-04-28 04:32:56 +04:00
goto done ; ;
}
2002-01-06 06:54:40 +03:00
printf ( " Succesfully set %s to driver %s. \n " , argv [ 1 ] , argv [ 2 ] ) ;
2001-04-28 04:32:56 +04:00
done :
2002-01-06 06:54:40 +03:00
/* Cleanup */
2001-04-28 04:32:56 +04:00
if ( opened_hnd )
cli_spoolss_close_printer ( cli , mem_ctx , & pol ) ;
2002-02-20 21:41:07 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-04-28 04:32:56 +04:00
}
2001-03-15 10:13:27 +03:00
2001-10-12 09:56:23 +04:00
static NTSTATUS cmd_spoolss_deletedriver ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2001-05-17 22:57:25 +04:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2001-05-17 22:57:25 +04:00
fstring servername ;
2001-05-18 08:11:17 +04:00
int i ;
2001-05-17 22:57:25 +04:00
/* parse the command arguements */
2001-05-18 08:11:17 +04:00
if ( argc ! = 2 )
2001-05-17 22:57:25 +04:00
{
2001-05-18 08:11:17 +04:00
printf ( " Usage: %s <driver> \n " , argv [ 0 ] ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-05-17 22:57:25 +04:00
}
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
2001-05-18 08:11:17 +04:00
/* delete the driver for all architectures */
for ( i = 0 ; archi_table [ i ] . long_archi ; i + + )
2001-05-17 22:57:25 +04:00
{
2001-05-18 08:11:17 +04:00
/* make the call to remove the driver */
2002-02-20 21:41:07 +03:00
result = cli_spoolss_deleteprinterdriver (
cli , mem_ctx , archi_table [ i ] . long_archi , argv [ 1 ] ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
printf ( " Failed to remove driver %s for arch [%s] - error 0x%x! \n " ,
argv [ 1 ] , archi_table [ i ] . long_archi ,
W_ERROR_V ( result ) ) ;
} else
printf ( " Driver %s removed for arch [%s]. \n " , argv [ 1 ] ,
archi_table [ i ] . long_archi ) ;
2001-05-17 22:57:25 +04:00
}
2002-02-20 21:41:07 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-05-17 22:57:25 +04:00
}
2001-12-10 08:03:17 +03:00
static NTSTATUS cmd_spoolss_getprintprocdir ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2001-12-10 08:03:17 +03:00
char * servername = NULL , * environment = NULL ;
fstring procdir ;
2002-02-20 21:41:07 +03:00
uint32 needed ;
2001-12-10 08:03:17 +03:00
/* parse the command arguements */
2002-02-20 21:41:07 +03:00
if ( argc > 2 ) {
printf ( " Usage: %s [environment] \n " , argv [ 0 ] ) ;
2001-12-10 08:03:17 +03:00
return NT_STATUS_OK ;
}
2002-01-19 20:29:32 +03:00
if ( asprintf ( & servername , " \\ \\ %s " , cli - > desthost ) < 0 )
return NT_STATUS_NO_MEMORY ;
2001-12-10 08:03:17 +03:00
strupper ( servername ) ;
2002-02-20 21:41:07 +03:00
if ( asprintf ( & environment , " %s " , ( argc = = 2 ) ? argv [ 1 ] :
PRINTER_DRIVER_ARCHITECTURE ) < 0 ) {
2002-01-19 20:29:32 +03:00
SAFE_FREE ( servername ) ;
return NT_STATUS_NO_MEMORY ;
}
2001-12-10 08:03:17 +03:00
result = cli_spoolss_getprintprocessordirectory (
2002-02-20 21:41:07 +03:00
cli , mem_ctx , 0 , & needed , servername , environment , procdir ) ;
if ( W_ERROR_V ( result ) = = ERRinsufficientbuffer )
result = cli_spoolss_getprintprocessordirectory (
cli , mem_ctx , needed , NULL , servername , environment ,
procdir ) ;
2001-12-10 08:03:17 +03:00
2002-02-20 21:41:07 +03:00
if ( W_ERROR_IS_OK ( result ) )
printf ( " %s \n " , procdir ) ;
2001-12-10 08:03:17 +03:00
SAFE_FREE ( servername ) ;
SAFE_FREE ( environment ) ;
2002-02-20 21:41:07 +03:00
return W_ERROR_IS_OK ( result ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
2001-12-10 08:03:17 +03:00
}
2001-05-17 22:57:25 +04:00
2002-01-31 14:36:30 +03:00
/* Add a form */
static NTSTATUS cmd_spoolss_addform ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
{
POLICY_HND handle ;
WERROR werror ;
char * servername = NULL , * printername = NULL ;
FORM form ;
BOOL got_handle = False ;
/* Parse the command arguements */
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <formname> \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
/* Get a printer handle */
asprintf ( & servername , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
asprintf ( & printername , " %s \\ %s " , servername , argv [ 1 ] ) ;
werror = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername , " " ,
MAXIMUM_ALLOWED_ACCESS ,
servername , cli - > user_name , & handle ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
got_handle = True ;
/* Dummy up some values for the form data */
form . flags = FORM_USER ;
form . size_x = form . size_y = 100 ;
form . left = 0 ;
form . top = 10 ;
form . right = 20 ;
form . bottom = 30 ;
init_unistr2 ( & form . name , argv [ 2 ] , strlen ( argv [ 2 ] ) + 1 ) ;
/* Add the form */
2002-02-25 09:43:31 +03:00
2002-01-31 14:36:30 +03:00
werror = cli_spoolss_addform ( cli , mem_ctx , & handle , 1 , & form ) ;
done :
if ( got_handle )
cli_spoolss_close_printer ( cli , mem_ctx , & handle ) ;
SAFE_FREE ( servername ) ;
SAFE_FREE ( printername ) ;
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
}
/* Set a form */
static NTSTATUS cmd_spoolss_setform ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
{
POLICY_HND handle ;
WERROR werror ;
char * servername = NULL , * printername = NULL ;
FORM form ;
BOOL got_handle = False ;
/* Parse the command arguements */
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <formname> \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
/* Get a printer handle */
asprintf ( & servername , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
asprintf ( & printername , " %s \\ %s " , servername , argv [ 1 ] ) ;
2002-02-25 09:43:31 +03:00
werror = cli_spoolss_open_printer_ex (
cli , mem_ctx , printername , " " , MAXIMUM_ALLOWED_ACCESS ,
servername , cli - > user_name , & handle ) ;
2002-01-31 14:36:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
got_handle = True ;
/* Dummy up some values for the form data */
form . flags = FORM_PRINTER ;
form . size_x = form . size_y = 100 ;
form . left = 0 ;
2002-02-25 09:43:31 +03:00
form . top = 1000 ;
form . right = 2000 ;
form . bottom = 3000 ;
2002-01-31 14:36:30 +03:00
init_unistr2 ( & form . name , argv [ 2 ] , strlen ( argv [ 2 ] ) + 1 ) ;
/* Set the form */
2002-02-25 09:43:31 +03:00
werror = cli_spoolss_setform ( cli , mem_ctx , & handle , 1 , argv [ 2 ] , & form ) ;
2002-01-31 14:36:30 +03:00
done :
if ( got_handle )
cli_spoolss_close_printer ( cli , mem_ctx , & handle ) ;
SAFE_FREE ( servername ) ;
SAFE_FREE ( printername ) ;
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
}
2002-02-25 09:43:31 +03:00
/* Get a form */
2002-01-31 14:36:30 +03:00
2002-02-25 09:43:31 +03:00
static NTSTATUS cmd_spoolss_getform ( struct cli_state * cli , TALLOC_CTX * mem_ctx ,
int argc , char * * argv )
2002-01-31 14:36:30 +03:00
{
POLICY_HND handle ;
WERROR werror ;
char * servername = NULL , * printername = NULL ;
2002-02-25 09:43:31 +03:00
FORM_1 form ;
2002-01-31 14:36:30 +03:00
BOOL got_handle = False ;
2002-02-25 09:43:31 +03:00
uint32 needed ;
2002-01-31 14:36:30 +03:00
/* Parse the command arguements */
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <formname> \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
/* Get a printer handle */
asprintf ( & servername , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
asprintf ( & printername , " %s \\ %s " , servername , argv [ 1 ] ) ;
2002-02-25 09:43:31 +03:00
werror = cli_spoolss_open_printer_ex (
cli , mem_ctx , printername , " " , MAXIMUM_ALLOWED_ACCESS ,
servername , cli - > user_name , & handle ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
got_handle = True ;
/* Set the form */
werror = cli_spoolss_getform ( cli , mem_ctx , 0 , & needed ,
& handle , argv [ 2 ] , 1 , & form ) ;
if ( W_ERROR_V ( werror ) = = ERRinsufficientbuffer )
werror = cli_spoolss_getform ( cli , mem_ctx , needed , NULL ,
& handle , argv [ 2 ] , 1 , & form ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
printf ( " width: %d \n " , form . width ) ;
printf ( " length: %d \n " , form . length ) ;
printf ( " left: %d \n " , form . left ) ;
printf ( " top: %d \n " , form . top ) ;
printf ( " right: %d \n " , form . right ) ;
printf ( " bottom: %d \n " , form . bottom ) ;
done :
if ( got_handle )
cli_spoolss_close_printer ( cli , mem_ctx , & handle ) ;
SAFE_FREE ( servername ) ;
SAFE_FREE ( printername ) ;
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
}
/* Delete a form */
static NTSTATUS cmd_spoolss_deleteform ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx , int argc ,
char * * argv )
{
POLICY_HND handle ;
WERROR werror ;
char * servername = NULL , * printername = NULL ;
BOOL got_handle = False ;
/* Parse the command arguements */
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <formname> \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
/* Get a printer handle */
asprintf ( & servername , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
asprintf ( & printername , " %s \\ %s " , servername , argv [ 1 ] ) ;
werror = cli_spoolss_open_printer_ex (
cli , mem_ctx , printername , " " , MAXIMUM_ALLOWED_ACCESS ,
servername , cli - > user_name , & handle ) ;
2002-01-31 14:36:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
got_handle = True ;
/* Delete the form */
werror = cli_spoolss_deleteform ( cli , mem_ctx , & handle , argv [ 2 ] ) ;
done :
if ( got_handle )
cli_spoolss_close_printer ( cli , mem_ctx , & handle ) ;
SAFE_FREE ( servername ) ;
SAFE_FREE ( printername ) ;
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
}
2002-02-25 09:43:31 +03:00
/* Enumerate forms */
2002-03-07 07:22:16 +03:00
static NTSTATUS cmd_spoolss_enum_forms ( struct cli_state * cli ,
TALLOC_CTX * mem_ctx , int argc ,
char * * argv )
2002-02-25 09:43:31 +03:00
{
POLICY_HND handle ;
WERROR werror ;
char * servername = NULL , * printername = NULL ;
BOOL got_handle = False ;
uint32 needed , num_forms , level = 1 , i ;
FORM_1 * forms ;
/* Parse the command arguements */
if ( argc ! = 2 ) {
printf ( " Usage: %s <printer> \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
/* Get a printer handle */
asprintf ( & servername , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
asprintf ( & printername , " %s \\ %s " , servername , argv [ 1 ] ) ;
werror = cli_spoolss_open_printer_ex (
cli , mem_ctx , printername , " " , MAXIMUM_ALLOWED_ACCESS ,
servername , cli - > user_name , & handle ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
got_handle = True ;
/* Enumerate forms */
werror = cli_spoolss_enumforms (
cli , mem_ctx , 0 , & needed , & handle , level , & num_forms , & forms ) ;
if ( W_ERROR_V ( werror ) = = ERRinsufficientbuffer )
werror = cli_spoolss_enumforms (
cli , mem_ctx , needed , NULL , & handle , level ,
& num_forms , & forms ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Display output */
for ( i = 0 ; i < num_forms ; i + + ) {
fstring form_name ;
if ( forms [ i ] . name . buffer )
rpcstr_pull ( form_name , forms [ i ] . name . buffer ,
sizeof ( form_name ) , 0 , STR_TERMINATE ) ;
printf ( " %s \n " , form_name ) ;
}
done :
if ( got_handle )
cli_spoolss_close_printer ( cli , mem_ctx , & handle ) ;
SAFE_FREE ( servername ) ;
SAFE_FREE ( printername ) ;
return W_ERROR_IS_OK ( werror ) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL ;
}
2001-01-12 01:49:30 +03:00
/* List of commands exported by this module */
struct cmd_set spoolss_commands [ ] = {
2000-08-10 00:14:29 +04:00
2001-07-20 08:38:58 +04:00
{ " SPOOLSS " } ,
2001-10-12 09:56:23 +04:00
{ " adddriver " , cmd_spoolss_addprinterdriver , PIPE_SPOOLSS , " Add a print driver " , " " } ,
{ " addprinter " , cmd_spoolss_addprinterex , PIPE_SPOOLSS , " Add a printer " , " " } ,
{ " deldriver " , cmd_spoolss_deletedriver , PIPE_SPOOLSS , " Delete a printer driver " , " " } ,
{ " enumdata " , cmd_spoolss_not_implemented , PIPE_SPOOLSS , " Enumerate printer data (*) " , " " } ,
{ " enumjobs " , cmd_spoolss_not_implemented , PIPE_SPOOLSS , " Enumerate print jobs (*) " , " " } ,
{ " enumports " , cmd_spoolss_enum_ports , PIPE_SPOOLSS , " Enumerate printer ports " , " " } ,
{ " enumdrivers " , cmd_spoolss_enum_drivers , PIPE_SPOOLSS , " Enumerate installed printer drivers " , " " } ,
{ " enumprinters " , cmd_spoolss_enum_printers , PIPE_SPOOLSS , " Enumerate printers " , " " } ,
{ " getdata " , cmd_spoolss_not_implemented , PIPE_SPOOLSS , " Get print driver data (*) " , " " } ,
{ " getdriver " , cmd_spoolss_getdriver , PIPE_SPOOLSS , " Get print driver information " , " " } ,
{ " getdriverdir " , cmd_spoolss_getdriverdir , PIPE_SPOOLSS , " Get print driver upload directory " , " " } ,
{ " getprinter " , cmd_spoolss_getprinter , PIPE_SPOOLSS , " Get printer info " , " " } ,
{ " openprinter " , cmd_spoolss_open_printer_ex , PIPE_SPOOLSS , " Open printer handle " , " " } ,
{ " setdriver " , cmd_spoolss_setdriver , PIPE_SPOOLSS , " Set printer driver " , " " } ,
2002-01-31 14:36:30 +03:00
{ " getprintprocdir " , cmd_spoolss_getprintprocdir , PIPE_SPOOLSS , " Get print processor directory " , " " } ,
{ " addform " , cmd_spoolss_addform , PIPE_SPOOLSS , " Add form " , " " } ,
{ " setform " , cmd_spoolss_setform , PIPE_SPOOLSS , " Set form " , " " } ,
2002-02-25 09:43:31 +03:00
{ " getform " , cmd_spoolss_getform , PIPE_SPOOLSS , " Get form " , " " } ,
2002-01-31 14:36:30 +03:00
{ " deleteform " , cmd_spoolss_deleteform , PIPE_SPOOLSS , " Delete form " , " " } ,
2002-03-07 07:22:16 +03:00
{ " enumforms " , cmd_spoolss_enum_forms , PIPE_SPOOLSS , " Enumerate forms " , " " } ,
2001-07-20 08:38:58 +04:00
{ NULL }
2001-01-12 01:49:30 +03:00
} ;