2000-07-07 10:18:00 +04:00
/*
Unix SMB / Netbios implementation .
2001-01-12 01:49:30 +03:00
Version 2.2
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"
extern int DEBUGLEVEL ;
2001-01-12 01:49:30 +03:00
extern pstring server ;
extern pstring global_myname ;
extern pstring username , password ;
extern pstring workgroup ;
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 ) ) ;
return FALSE ;
}
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
*/
static uint32 cmd_spoolss_not_implemented ( struct cli_state * cli ,
int argc , char * * argv )
{
printf ( " (*) This command is not currently implemented. \n " ) ;
return NT_STATUS_NO_PROBLEMO ;
}
2000-08-08 10:57:48 +04:00
/****************************************************************************
2001-01-12 01:49:30 +03:00
display sec_ace structure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_sec_ace ( SEC_ACE * ace )
2000-08-08 10:57:48 +04:00
{
2001-01-12 01:49:30 +03:00
fstring sid_str ;
2000-08-08 10:57:48 +04:00
2001-01-12 01:49:30 +03:00
sid_to_string ( sid_str , & ace - > sid ) ;
printf ( " \t \t SID: %s \n " , sid_str ) ;
2000-07-07 10:18:00 +04:00
2001-01-12 01:49:30 +03:00
printf ( " \t \t type:[%d], flags:[0x%02x], mask:[0x%08x] \n " ,
ace - > type , ace - > flags , ace - > info . mask ) ;
2000-07-21 23:59:51 +04:00
}
/****************************************************************************
2001-01-12 01:49:30 +03:00
display sec_acl structure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_sec_acl ( SEC_ACL * acl )
2000-07-21 23:59:51 +04:00
{
2001-01-12 01:49:30 +03:00
if ( acl - > size ! = 0 & & acl - > num_aces ! = 0 ) {
int i ;
2000-07-21 23:59:51 +04:00
2001-01-12 01:49:30 +03:00
printf ( " \t \t Revision:[%d] \n " , acl - > revision ) ;
for ( i = 0 ; i < acl - > num_aces ; i + + ) {
display_sec_ace ( & acl - > ace [ i ] ) ;
}
}
2000-07-07 10:18:00 +04:00
}
2000-07-14 20:29:22 +04:00
/****************************************************************************
2001-01-12 01:49:30 +03:00
display sec_desc structure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_sec_desc ( SEC_DESC * sec )
2000-07-14 20:29:22 +04:00
{
2001-01-12 01:49:30 +03:00
fstring sid_str ;
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
printf ( " \t Revision:[%d] \n " , sec - > revision ) ;
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
if ( sec - > off_owner_sid ) {
sid_to_string ( sid_str , sec - > owner_sid ) ;
printf ( " \t Owner SID: %s \n " , sid_str ) ;
2000-07-14 20:29:22 +04:00
}
2001-01-12 01:49:30 +03:00
if ( sec - > off_grp_sid ) {
sid_to_string ( sid_str , sec - > grp_sid ) ;
printf ( " \t Group SID: %s \n " , sid_str ) ;
2000-07-14 20:29:22 +04:00
}
2001-01-12 01:49:30 +03:00
if ( sec - > off_sacl ) display_sec_acl ( sec - > sacl ) ;
if ( sec - > off_dacl ) display_sec_acl ( sec - > dacl ) ;
2000-07-14 20:29:22 +04:00
}
2001-03-15 05:15:05 +03:00
/***********************************************************************
* Get printer information
*/
static uint32 cmd_spoolss_open_printer_ex ( struct cli_state * cli , int argc , char * * argv )
{
uint32 result = NT_STATUS_UNSUCCESSFUL ;
pstring printername ;
2001-05-04 11:34:16 +04:00
fstring servername , user ;
2001-03-15 05:15:05 +03:00
POLICY_HND hnd ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
2001-03-15 05:15:05 +03:00
if ( argc ! = 2 ) {
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s <printername> \n " , argv [ 0 ] ) ;
2001-03-15 05:15:05 +03:00
return NT_STATUS_NOPROBLEMO ;
}
if ( ! cli )
return NT_STATUS_UNSUCCESSFUL ;
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_open_printer_ex: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-15 05:15:05 +03: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 ] ) ;
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) ) {
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-15 10:13:27 +03:00
/* Open the printer handle */
2001-04-28 04:32:56 +04:00
result = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername , " " ,
2001-05-04 11:34:16 +04:00
MAXIMUM_ALLOWED_ACCESS , servername , user , & hnd ) ;
2001-03-15 05:15:05 +03:00
if ( result = = NT_STATUS_NOPROBLEMO ) {
printf ( " Printer %s opened successfully \n " , printername ) ;
2001-04-28 04:32:56 +04:00
result = cli_spoolss_close_printer ( cli , mem_ctx , & hnd ) ;
2001-03-15 05:15:05 +03:00
if ( result ! = NT_STATUS_NOPROBLEMO ) {
printf ( " Error closing printer handle! (%s) \n " , get_nt_error_msg ( result ) ) ;
}
}
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-03-15 05:15:05 +03:00
return result ;
}
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
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-01-12 01:49:30 +03:00
static void display_print_info_0 ( PRINTER_INFO_0 * i1 )
2000-07-14 20:29:22 +04:00
{
2001-03-16 01:06:53 +03:00
fstring name ;
2001-05-04 11:34:16 +04:00
fstring servername ;
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
unistr_to_ascii ( name , i1 - > printername . buffer , sizeof ( name ) - 1 ) ;
2001-05-04 11:34:16 +04:00
unistr_to_ascii ( servername , i1 - > servername . buffer , sizeof ( servername ) - 1 ) ;
2000-07-14 20:29:22 +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 ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t cjobs:[0x%x] \n " , i1 - > cjobs ) ;
printf ( " \t total_jobs:[0x%x] \n " , i1 - > total_jobs ) ;
printf ( " \t :date: [%d]-[%d]-[%d] (%d) \n " , i1 - > year , i1 - > month ,
i1 - > day , i1 - > dayofweek ) ;
printf ( " \t :time: [%d]-[%d]-[%d]-[%d] \n " , i1 - > hour , i1 - > minute ,
i1 - > second , i1 - > milliseconds ) ;
printf ( " \t global_counter:[0x%x] \n " , i1 - > global_counter ) ;
printf ( " \t total_pages:[0x%x] \n " , i1 - > total_pages ) ;
printf ( " \t majorversion:[0x%x] \n " , i1 - > major_version ) ;
printf ( " \t buildversion:[0x%x] \n " , i1 - > build_version ) ;
printf ( " \t unknown7:[0x%x] \n " , i1 - > unknown7 ) ;
printf ( " \t unknown8:[0x%x] \n " , i1 - > unknown8 ) ;
printf ( " \t unknown9:[0x%x] \n " , i1 - > unknown9 ) ;
printf ( " \t session_counter:[0x%x] \n " , i1 - > session_counter ) ;
printf ( " \t unknown11:[0x%x] \n " , i1 - > unknown11 ) ;
printf ( " \t printer_errors:[0x%x] \n " , i1 - > printer_errors ) ;
printf ( " \t unknown13:[0x%x] \n " , i1 - > unknown13 ) ;
printf ( " \t unknown14:[0x%x] \n " , i1 - > unknown14 ) ;
printf ( " \t unknown15:[0x%x] \n " , i1 - > unknown15 ) ;
printf ( " \t unknown16:[0x%x] \n " , i1 - > unknown16 ) ;
printf ( " \t change_id:[0x%x] \n " , i1 - > change_id ) ;
printf ( " \t unknown18:[0x%x] \n " , i1 - > unknown18 ) ;
printf ( " \t status:[0x%x] \n " , i1 - > status ) ;
printf ( " \t unknown20:[0x%x] \n " , i1 - > unknown20 ) ;
printf ( " \t c_setprinter:[0x%x] \n " , i1 - > c_setprinter ) ;
printf ( " \t unknown22:[0x%x] \n " , i1 - > unknown22 ) ;
printf ( " \t unknown23:[0x%x] \n " , i1 - > unknown23 ) ;
printf ( " \t unknown24:[0x%x] \n " , i1 - > unknown24 ) ;
printf ( " \t unknown25:[0x%x] \n " , i1 - > unknown25 ) ;
printf ( " \t unknown26:[0x%x] \n " , i1 - > unknown26 ) ;
printf ( " \t unknown27:[0x%x] \n " , i1 - > unknown27 ) ;
printf ( " \t unknown28:[0x%x] \n " , i1 - > unknown28 ) ;
printf ( " \t unknown29:[0x%x] \n " , i1 - > unknown29 ) ;
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
{
2001-01-12 01:49:30 +03:00
fstring desc ;
fstring name ;
fstring comm ;
unistr_to_ascii ( desc , i1 - > description . buffer , sizeof ( desc ) - 1 ) ;
unistr_to_ascii ( name , i1 - > name . buffer , sizeof ( name ) - 1 ) ;
unistr_to_ascii ( comm , i1 - > comment . buffer , sizeof ( comm ) - 1 ) ;
printf ( " \t flags:[0x%x] \n " , i1 - > flags ) ;
printf ( " \t name:[%s] \n " , name ) ;
printf ( " \t description:[%s] \n " , desc ) ;
printf ( " \t comment:[%s] \n \n " , comm ) ;
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
{
2001-01-12 01:49:30 +03:00
fstring servername ;
fstring printername ;
fstring sharename ;
fstring portname ;
fstring drivername ;
fstring comment ;
fstring location ;
fstring sepfile ;
fstring printprocessor ;
fstring datatype ;
fstring parameters ;
unistr_to_ascii ( servername , i2 - > servername . buffer ,
sizeof ( servername ) - 1 ) ;
unistr_to_ascii ( printername , i2 - > printername . buffer ,
sizeof ( printername ) - 1 ) ;
unistr_to_ascii ( sharename , i2 - > sharename . buffer ,
sizeof ( sharename ) - 1 ) ;
unistr_to_ascii ( portname , i2 - > portname . buffer , sizeof ( portname ) - 1 ) ;
unistr_to_ascii ( drivername , i2 - > drivername . buffer ,
sizeof ( drivername ) - 1 ) ;
unistr_to_ascii ( comment , i2 - > comment . buffer , sizeof ( comment ) - 1 ) ;
unistr_to_ascii ( location , i2 - > location . buffer , sizeof ( location ) - 1 ) ;
unistr_to_ascii ( sepfile , i2 - > sepfile . buffer , sizeof ( sepfile ) - 1 ) ;
unistr_to_ascii ( printprocessor , i2 - > printprocessor . buffer ,
sizeof ( printprocessor ) - 1 ) ;
unistr_to_ascii ( datatype , i2 - > datatype . buffer , sizeof ( datatype ) - 1 ) ;
unistr_to_ascii ( parameters , i2 - > parameters . buffer ,
sizeof ( parameters ) - 1 ) ;
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 ) ;
if ( i2 - > secdesc ) display_sec_desc ( i2 - > secdesc ) ;
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 ) ;
2000-07-14 20:29:22 +04:00
}
2001-01-12 01:49:30 +03:00
/* Enumerate printers */
2001-03-14 23:22:57 +03:00
static uint32 cmd_spoolss_enum_printers ( struct cli_state * cli , int argc , char * * argv )
2000-07-14 20:29:22 +04:00
{
2001-03-15 10:13:27 +03:00
uint32 result = NT_STATUS_UNSUCCESSFUL ,
info_level = 1 ;
PRINTER_INFO_CTR ctr ;
int returned ;
2001-04-28 04:32:56 +04:00
uint32 i = 0 ;
TALLOC_CTX * mem_ctx ;
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-01-12 01:49:30 +03:00
return NT_STATUS_NOPROBLEMO ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_enum_printers: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-01-12 01:49:30 +03:00
if ( argc = = 2 ) {
info_level = atoi ( argv [ 1 ] ) ;
}
/* Initialise RPC connection */
2001-03-14 23:22:57 +03:00
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) ) {
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
2001-01-12 01:49:30 +03:00
}
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 */
2001-01-12 01:49:30 +03:00
ZERO_STRUCT ( ctr ) ;
2001-04-28 04:32:56 +04:00
result = cli_spoolss_enum_printers ( cli , mem_ctx , PRINTER_ENUM_LOCAL ,
2001-01-12 01:49:30 +03:00
info_level , & returned , & ctr ) ;
2000-07-14 20:29:22 +04:00
2001-04-28 04:32:56 +04:00
if ( result = = NT_STATUS_NOPROBLEMO )
{
if ( ! returned )
printf ( " No Printers printers returned. \n " ) ;
2001-01-12 01:49:30 +03:00
switch ( info_level ) {
case 0 :
2001-03-15 10:13:27 +03:00
for ( i = 0 ; i < returned ; i + + ) {
display_print_info_0 ( & ( ctr . printers_0 [ i ] ) ) ;
}
2001-01-12 01:49:30 +03:00
break ;
case 1 :
2001-03-15 10:13:27 +03:00
for ( i = 0 ; i < returned ; i + + ) {
display_print_info_1 ( & ( ctr . printers_1 [ i ] ) ) ;
}
2001-01-12 01:49:30 +03:00
break ;
case 2 :
2001-03-15 10:13:27 +03:00
for ( i = 0 ; i < returned ; i + + ) {
display_print_info_2 ( & ( ctr . printers_2 [ i ] ) ) ;
}
2001-01-12 01:49:30 +03:00
break ;
case 3 :
2001-03-15 10:13:27 +03:00
for ( i = 0 ; i < returned ; i + + ) {
display_print_info_3 ( & ( ctr . printers_3 [ i ] ) ) ;
}
2001-01-12 01:49:30 +03:00
break ;
default :
printf ( " unknown info level %d \n " , info_level ) ;
break ;
}
}
2001-03-14 23:22:57 +03:00
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-01-12 20:53:47 +03:00
2001-01-12 01:49:30 +03:00
return result ;
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 ;
unistr_to_ascii ( buffer , i1 - > port_name . buffer , sizeof ( buffer ) - 1 ) ;
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 ;
unistr_to_ascii ( buffer , i2 - > port_name . buffer , sizeof ( buffer ) - 1 ) ;
printf ( " \t Port Name: \t [%s] \n " , buffer ) ;
unistr_to_ascii ( buffer , i2 - > monitor_name . buffer , sizeof ( buffer ) - 1 ) ;
printf ( " \t Monitor Name: \t [%s] \n " , buffer ) ;
unistr_to_ascii ( buffer , i2 - > description . buffer , sizeof ( buffer ) - 1 ) ;
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-03-14 23:22:57 +03:00
static uint32 cmd_spoolss_enum_ports ( struct cli_state * cli , int argc , char * * argv )
2001-01-12 01:49:30 +03:00
{
2001-03-15 10:13:27 +03:00
uint32 result = NT_STATUS_UNSUCCESSFUL ,
info_level = 1 ;
PORT_INFO_CTR ctr ;
int returned ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
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-01-12 01:49:30 +03:00
return NT_STATUS_NOPROBLEMO ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_enum_ports: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
if ( argc = = 2 ) {
info_level = atoi ( argv [ 1 ] ) ;
}
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
/* Initialise RPC connection */
2001-03-14 23:22:57 +03:00
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) ) {
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
2001-01-12 01:49:30 +03:00
}
2000-07-14 20:29:22 +04:00
2001-03-14 23:22:57 +03:00
/* Enumerate ports */
2001-01-12 01:49:30 +03:00
ZERO_STRUCT ( ctr ) ;
2001-04-28 04:32:56 +04:00
result = cli_spoolss_enum_ports ( cli , mem_ctx , info_level , & returned , & ctr ) ;
2001-01-12 01:49:30 +03:00
if ( result = = NT_STATUS_NOPROBLEMO ) {
int i ;
for ( i = 0 ; i < returned ; i + + ) {
switch ( info_level ) {
case 1 :
display_port_info_1 ( & ctr . port . info_1 [ i ] ) ;
2000-07-26 01:07:46 +04: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
}
}
2001-03-14 23:22:57 +03:00
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-01-12 20:53:47 +03:00
2001-01-12 01:49:30 +03:00
return result ;
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-03-14 23:22:57 +03:00
static uint32 cmd_spoolss_getprinter ( struct cli_state * cli , int argc , char * * argv )
2000-08-08 10:57:48 +04:00
{
2001-03-15 10:13:27 +03:00
POLICY_HND pol ;
uint32 result ,
info_level = 1 ;
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 ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
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-01-12 01:49:30 +03:00
return NT_STATUS_NOPROBLEMO ;
2000-08-08 10:57:48 +04:00
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_getprinter: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-01-12 01:49:30 +03:00
/* Initialise RPC connection */
2001-03-14 23:22:57 +03:00
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) ) {
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
2001-01-12 01:49:30 +03:00
}
2000-08-10 00:14:29 +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 */
2001-01-12 01:49:30 +03:00
if ( ( result = cli_spoolss_open_printer_ex (
2001-04-28 04:32:56 +04:00
cli , mem_ctx , printername , " " , MAXIMUM_ALLOWED_ACCESS , servername ,
2001-05-04 11:34:16 +04:00
user , & pol ) ) ! = NT_STATUS_NOPROBLEMO ) {
2001-01-12 01:49:30 +03:00
goto done ;
2000-08-08 10:57:48 +04:00
}
2001-03-16 01:06:53 +03:00
2001-01-12 01:49:30 +03:00
opened_hnd = True ;
/* Get printer info */
2001-04-28 04:32:56 +04:00
if ( ( result = cli_spoolss_getprinter ( cli , mem_ctx , & pol , info_level , & ctr ) )
2001-01-12 01:49:30 +03:00
! = NT_STATUS_NOPROBLEMO ) {
goto done ;
2000-08-08 10:57:48 +04:00
}
2001-01-12 01:49:30 +03:00
/* 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
2001-03-14 23:22:57 +03:00
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2000-08-08 10:57:48 +04:00
2001-01-12 01:49:30 +03:00
return result ;
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 ;
unistr_to_ascii ( name , i1 - > name . buffer , sizeof ( name ) - 1 ) ;
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 ;
unistr_to_ascii ( name , i1 - > name . buffer , sizeof ( name ) - 1 ) ;
unistr_to_ascii ( architecture , i1 - > architecture . buffer , sizeof ( architecture ) - 1 ) ;
unistr_to_ascii ( driverpath , i1 - > driverpath . buffer , sizeof ( driverpath ) - 1 ) ;
unistr_to_ascii ( datafile , i1 - > datafile . buffer , sizeof ( datafile ) - 1 ) ;
unistr_to_ascii ( configfile , i1 - > configfile . buffer , sizeof ( configfile ) - 1 ) ;
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 ;
unistr_to_ascii ( name , i1 - > name . buffer , sizeof ( name ) - 1 ) ;
unistr_to_ascii ( architecture , i1 - > architecture . buffer , sizeof ( architecture ) - 1 ) ;
unistr_to_ascii ( driverpath , i1 - > driverpath . buffer , sizeof ( driverpath ) - 1 ) ;
unistr_to_ascii ( datafile , i1 - > datafile . buffer , sizeof ( datafile ) - 1 ) ;
unistr_to_ascii ( configfile , i1 - > configfile . buffer , sizeof ( configfile ) - 1 ) ;
unistr_to_ascii ( helpfile , i1 - > helpfile . buffer , sizeof ( helpfile ) - 1 ) ;
unistr_to_ascii ( monitorname , i1 - > monitorname . buffer , sizeof ( monitorname ) - 1 ) ;
unistr_to_ascii ( defaultdatatype , i1 - > defaultdatatype . buffer , sizeof ( defaultdatatype ) - 1 ) ;
printf ( " Printer Driver Info 3: \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 " , configfile ) ;
printf ( " \t Helpfile: [%s] \n \n " , helpfile ) ;
while ( valid )
{
unistr_to_ascii ( dependentfiles , i1 - > dependentfiles + length , sizeof ( dependentfiles ) - 1 ) ;
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
*/
static uint32 cmd_spoolss_getdriver ( struct cli_state * cli , int argc , char * * argv )
{
POLICY_HND pol ;
uint32 result ,
info_level = 3 ;
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 ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
2001-03-15 10:13:27 +03:00
if ( ( argc = = 1 ) | | ( argc > 3 ) )
{
printf ( " Usage: %s <printername> [level] \n " , argv [ 0 ] ) ;
return NT_STATUS_NOPROBLEMO ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_getdriver: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-15 10:13:27 +03:00
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
/* 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 */
2001-04-28 04:32:56 +04:00
if ( ( result = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername , " " ,
2001-05-04 11:34:16 +04:00
MAXIMUM_ALLOWED_ACCESS , servername , user , & pol ) ) ! = NT_STATUS_NO_PROBLEMO )
2001-03-15 10:13:27 +03:00
{
printf ( " Error opening printer handle for %s! \n " , printername ) ;
return result ;
}
opened_hnd = True ;
/* loop through and print driver info level for each architecture */
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + )
{
2001-04-28 04:32:56 +04:00
result = cli_spoolss_getprinterdriver ( cli , mem_ctx , & pol , info_level ,
2001-03-15 10:13:27 +03:00
archi_table [ i ] . long_archi , & ctr ) ;
switch ( result )
{
case NT_STATUS_NO_PROBLEMO :
break ;
case ERROR_UNKNOWN_PRINTER_DRIVER :
continue ;
default :
printf ( " Error getting driver for %s [%s] - %s \n " , printername ,
archi_table [ i ] . long_archi , get_nt_error_msg ( result ) ) ;
continue ;
}
printf ( " \n [%s] \n " , archi_table [ i ] . long_archi ) ;
switch ( info_level )
{
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 ;
}
}
/* cleanup */
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
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-03-15 10:13:27 +03:00
if ( result = = ERROR_UNKNOWN_PRINTER_DRIVER )
return NT_STATUS_NO_PROBLEMO ;
else
return result ;
}
/***********************************************************************
* Get printer information
*/
static uint32 cmd_spoolss_enum_drivers ( struct cli_state * cli , int argc , char * * argv )
{
2001-04-28 04:32:56 +04:00
uint32 result = 0 ,
2001-03-15 10:13:27 +03:00
info_level = 1 ;
PRINTER_DRIVER_CTR ctr ;
2001-05-04 11:34:16 +04:00
fstring servername ;
2001-03-15 10:13:27 +03:00
uint32 i , j ,
returned ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
2001-03-15 10:13:27 +03:00
if ( argc > 2 )
{
printf ( " Usage: enumdrivers [level] \n " ) ;
return NT_STATUS_NOPROBLEMO ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_enum_drivers: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-15 10:13:27 +03:00
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
/* 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
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 + + )
{
returned = 0 ;
2001-04-28 04:32:56 +04:00
result = cli_spoolss_enumprinterdrivers ( cli , mem_ctx , info_level ,
2001-03-15 10:13:27 +03:00
archi_table [ i ] . long_archi , & returned , & ctr ) ;
if ( returned = = 0 )
continue ;
if ( result ! = NT_STATUS_NO_PROBLEMO )
{
printf ( " Error getting driver for environment [%s] - %s \n " ,
archi_table [ i ] . long_archi , get_nt_error_msg ( result ) ) ;
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 ;
}
}
/* cleanup */
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-03-15 10:13:27 +03:00
if ( result = = ERROR_UNKNOWN_PRINTER_DRIVER )
return NT_STATUS_NO_PROBLEMO ;
else
return result ;
}
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 ;
unistr_to_ascii ( name , i1 - > name . buffer , sizeof ( name ) - 1 ) ;
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
*/
static uint32 cmd_spoolss_getdriverdir ( struct cli_state * cli , int argc , char * * argv )
{
uint32 result ;
fstring env ;
DRIVER_DIRECTORY_CTR ctr ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
2001-03-15 19:43:19 +03:00
if ( argc > 2 )
{
printf ( " Usage: %s [environment] \n " , argv [ 0 ] ) ;
return NT_STATUS_NOPROBLEMO ;
}
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_getdriverdir: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-15 19:43:19 +03:00
/* get the arguments need to open the printer handle */
if ( argc = = 2 )
fstrcpy ( env , argv [ 1 ] ) ;
else
fstrcpy ( env , " Windows NT x86 " ) ;
/* Get the directory. Only use Info level 1 */
2001-04-28 04:32:56 +04:00
if ( ( result = cli_spoolss_getprinterdriverdir ( cli , mem_ctx , 1 , env , & ctr ) )
2001-03-15 19:43:19 +03:00
! = NT_STATUS_NO_PROBLEMO )
{
return result ;
}
display_printdriverdir_1 ( ctr . info1 ) ;
/* cleanup */
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-03-15 19:43:19 +03:00
return result ;
}
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 + + )
{
info - > dependentfiles [ i ] = ( uint16 ) str2 [ i ] ;
}
info - > dependentfiles [ len ] = ' \0 ' ;
return True ;
}
static uint32 cmd_spoolss_addprinterdriver ( struct cli_state * cli , int argc , char * * argv )
{
uint32 result ,
level = 3 ;
PRINTER_DRIVER_CTR ctr ;
DRIVER_INFO_3 info3 ;
fstring arch ;
fstring driver_name ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx = NULL ;
2001-03-16 01:06:53 +03:00
/* 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 " ) ;
return NT_STATUS_NOPROBLEMO ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_addprinterdriver: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-16 01:06:53 +03:00
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
/* 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-04-28 04:32:56 +04:00
if ( ( result = cli_spoolss_addprinterdriver ( cli , mem_ctx , level , & ctr ) )
2001-03-16 01:06:53 +03:00
! = NT_STATUS_NO_PROBLEMO )
{
return result ;
}
unistr_to_ascii ( driver_name , info3 . name . buffer , sizeof ( driver_name ) - 1 ) ;
printf ( " Printer Driver %s successfully installed. \n " , driver_name ) ;
/* cleanup */
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-03-16 01:06:53 +03:00
return result ;
}
static uint32 cmd_spoolss_addprinterex ( struct cli_state * cli , int argc , char * * argv )
{
uint32 result ,
level = 2 ;
PRINTER_INFO_CTR ctr ;
PRINTER_INFO_2 info2 ;
2001-05-04 11:34:16 +04:00
fstring servername ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx = NULL ;
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 ] ) ;
return NT_STATUS_NOPROBLEMO ;
}
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_addprinterex: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2001-03-16 01:06:53 +03: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
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
/* 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-04-28 04:32:56 +04:00
if ( ( result = cli_spoolss_addprinterex ( cli , mem_ctx , level , & ctr ) )
2001-03-16 01:06:53 +03:00
! = NT_STATUS_NO_PROBLEMO )
{
2001-04-28 04:32:56 +04:00
cli_nt_session_close ( cli ) ;
2001-03-16 01:06:53 +03:00
return result ;
}
printf ( " Printer %s successfully installed. \n " , argv [ 1 ] ) ;
/* cleanup */
cli_nt_session_close ( cli ) ;
2001-04-28 04:32:56 +04:00
talloc_destroy ( mem_ctx ) ;
2001-03-16 01:06:53 +03:00
return result ;
}
2001-04-28 04:32:56 +04:00
static uint32 cmd_spoolss_setdriver ( struct cli_state * cli , int argc , char * * argv )
{
POLICY_HND pol ;
uint32 result ,
level = 2 ;
BOOL opened_hnd = False ;
PRINTER_INFO_CTR ctr ;
PRINTER_INFO_2 info2 ;
fstring servername ,
printername ,
2001-05-04 11:34:16 +04:00
user ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx = NULL ;
/* parse the command arguements */
if ( argc ! = 3 )
{
printf ( " Usage: %s <printer> <driver> \n " , argv [ 0 ] ) ;
return NT_STATUS_NOPROBLEMO ;
}
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_setdriver: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
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
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
/* get a printer handle */
if ( ( result = cli_spoolss_open_printer_ex ( cli , mem_ctx , printername , " " ,
2001-05-04 11:34:16 +04:00
MAXIMUM_ALLOWED_ACCESS , servername , user , & pol ) )
2001-04-28 04:32:56 +04:00
! = NT_STATUS_NOPROBLEMO )
{
goto done ;
}
opened_hnd = True ;
/* Get printer info */
ZERO_STRUCT ( info2 ) ;
ctr . printers_2 = & info2 ;
if ( ( result = cli_spoolss_getprinter ( cli , mem_ctx , & pol , level , & ctr ) ) ! = NT_STATUS_NOPROBLEMO )
{
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 ;
}
/* set the printer driver */
init_unistr ( & ctr . printers_2 - > drivername , argv [ 2 ] ) ;
if ( ( result = cli_spoolss_setprinter ( cli , mem_ctx , & pol , level , & ctr , 0 ) ) ! = NT_STATUS_NO_PROBLEMO )
{
printf ( " SetPrinter call failed! \n " ) ;
goto done ; ;
}
printf ( " Succesfully set %s to driver %s. \n " , argv [ 1 ] , argv [ 2 ] ) ;
done :
/* cleanup */
if ( opened_hnd )
cli_spoolss_close_printer ( cli , mem_ctx , & pol ) ;
cli_nt_session_close ( cli ) ;
talloc_destroy ( mem_ctx ) ;
return result ;
}
2001-03-15 10:13:27 +03:00
2001-05-17 22:57:25 +04:00
static uint32 cmd_spoolss_deletedriver ( struct cli_state * cli , int argc , char * * argv )
{
uint32 result = NT_STATUS_UNSUCCESSFUL ;
fstring servername ;
TALLOC_CTX * mem_ctx = NULL ;
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-05-17 22:57:25 +04:00
return NT_STATUS_NOPROBLEMO ;
}
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " cmd_spoolss_deletedriver: talloc_init returned NULL! \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
slprintf ( servername , sizeof ( fstring ) - 1 , " \\ \\ %s " , cli - > desthost ) ;
strupper ( servername ) ;
/* Initialise RPC connection */
if ( ! cli_nt_session_open ( cli , PIPE_SPOOLSS ) )
{
fprintf ( stderr , " Could not initialize spoolss pipe! \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
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 */
if ( ( result = cli_spoolss_deleteprinterdriver ( cli , mem_ctx ,
archi_table [ i ] . long_archi , argv [ 1 ] ) ) ! = NT_STATUS_NO_PROBLEMO )
{
printf ( " Failed to remove driver %s for arch [%s] - error %s! \n " ,
argv [ 1 ] , archi_table [ i ] . long_archi , get_nt_error_msg ( 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
}
/* cleanup */
cli_nt_session_close ( cli ) ;
talloc_destroy ( mem_ctx ) ;
2001-05-18 08:11:17 +04:00
return NT_STATUS_NO_PROBLEMO ;
2001-05-17 22:57:25 +04:00
}
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-03-15 05:15:05 +03:00
{ " SPOOLSS " , NULL , " " } ,
2001-03-16 01:06:53 +03:00
{ " adddriver " , cmd_spoolss_addprinterdriver , " Add a print driver " } ,
{ " addprinter " , cmd_spoolss_addprinterex , " Add a printer " } ,
2001-05-17 22:57:25 +04:00
{ " deldriver " , cmd_spoolss_deletedriver , " Delete a printer driver " } ,
2001-03-15 05:15:05 +03:00
{ " enumdata " , cmd_spoolss_not_implemented , " Enumerate printer data (*) " } ,
{ " enumjobs " , cmd_spoolss_not_implemented , " Enumerate print jobs (*) " } ,
2001-03-14 23:22:57 +03:00
{ " enumports " , cmd_spoolss_enum_ports , " Enumerate printer ports " } ,
2001-03-15 10:13:27 +03:00
{ " enumdrivers " , cmd_spoolss_enum_drivers , " Enumerate installed printer drivers " } ,
2001-03-19 20:23:26 +03:00
{ " enumprinters " , cmd_spoolss_enum_printers , " Enumerate printers " } ,
2001-03-15 05:15:05 +03:00
{ " getdata " , cmd_spoolss_not_implemented , " Get print driver data (*) " } ,
2001-03-15 10:13:27 +03:00
{ " getdriver " , cmd_spoolss_getdriver , " Get print driver information " } ,
2001-03-15 19:43:19 +03:00
{ " getdriverdir " , cmd_spoolss_getdriverdir , " Get print driver upload directory " } ,
2001-03-14 23:22:57 +03:00
{ " getprinter " , cmd_spoolss_getprinter , " Get printer info " } ,
2001-03-15 05:15:05 +03:00
{ " openprinter " , cmd_spoolss_open_printer_ex , " Open printer handle " } ,
2001-04-28 04:32:56 +04:00
{ " setdriver " , cmd_spoolss_setdriver , " Set printer driver " } ,
2001-01-12 01:49:30 +03:00
{ NULL , NULL , NULL }
} ;