1998-09-26 01:01:52 +04:00
/*
Unix SMB / Netbios implementation .
2001-01-12 01:49:30 +03:00
Version 2.2
RPC pipe client
2001-08-28 01:32:06 +04:00
Copyright ( C ) Tim Potter 2000 - 2001
2001-01-12 01:49:30 +03:00
1998-09-26 01:01:52 +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-01-12 01:49:30 +03:00
extern int DEBUGLEVEL ;
2001-03-14 23:22:57 +03:00
extern fstring debugf ;
2001-05-24 04:20:32 +04:00
DOM_SID domain_sid ;
2001-01-16 02:35:59 +03:00
2001-04-28 04:32:56 +04:00
/* List to hold groups of commands */
2001-05-24 04:20:32 +04:00
2001-04-28 04:32:56 +04:00
static struct cmd_list {
struct cmd_list * prev , * next ;
struct cmd_set * cmd_set ;
} * cmd_list ;
/****************************************************************************
handle completion of commands for readline
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * * completion_fn ( char * text , int start , int end )
{
# define MAX_COMPLETIONS 100
char * * matches ;
int i , count = 0 ;
struct cmd_list * commands = cmd_list ;
#if 0 /* JERRY */
/* FIXME!!! -- what to do when completing argument? */
/* for words not at the start of the line fallback
to filename completion */
if ( start )
return NULL ;
# endif
/* make sure we have a list of valid commands */
if ( ! commands )
return NULL ;
matches = ( char * * ) malloc ( sizeof ( matches [ 0 ] ) * MAX_COMPLETIONS ) ;
if ( ! matches ) return NULL ;
matches [ count + + ] = strdup ( text ) ;
if ( ! matches [ 0 ] ) return NULL ;
while ( commands & & count < MAX_COMPLETIONS - 1 )
{
if ( ! commands - > cmd_set )
break ;
for ( i = 0 ; commands - > cmd_set [ i ] . name ; i + + )
{
if ( ( strncmp ( text , commands - > cmd_set [ i ] . name , strlen ( text ) ) = = 0 ) & &
commands - > cmd_set [ i ] . fn )
{
matches [ count ] = strdup ( commands - > cmd_set [ i ] . name ) ;
if ( ! matches [ count ] )
return NULL ;
count + + ;
}
}
commands = commands - > next ;
}
if ( count = = 2 ) {
2001-09-17 14:26:23 +04:00
SAFE_FREE ( matches [ 0 ] ) ;
2001-04-28 04:32:56 +04:00
matches [ 0 ] = strdup ( matches [ 1 ] ) ;
}
matches [ count ] = NULL ;
return matches ;
}
2001-03-16 01:06:53 +03:00
/***********************************************************************
* read in username / password credentials from a file
*/
static void read_authfile (
char * filename ,
char * username ,
char * password ,
char * domain
)
{
FILE * auth ;
fstring buf ;
uint16 len = 0 ;
char * ptr , * val , * param ;
if ( ( auth = sys_fopen ( filename , " r " ) ) = = NULL )
{
printf ( " ERROR: Unable to open credentials file! \n " ) ;
return ;
}
while ( ! feof ( auth ) )
{
/* get a line from the file */
if ( ! fgets ( buf , sizeof ( buf ) , auth ) )
continue ;
len = strlen ( buf ) ;
/* skip empty lines */
if ( ( len ) & & ( buf [ len - 1 ] = = ' \n ' ) )
{
buf [ len - 1 ] = ' \0 ' ;
len - - ;
}
if ( len = = 0 )
continue ;
/* break up the line into parameter & value.
will need to eat a little whitespace possibly */
param = buf ;
2001-07-04 11:39:01 +04:00
if ( ! ( ptr = strchr_m ( buf , ' = ' ) ) )
2001-03-16 01:06:53 +03:00
continue ;
val = ptr + 1 ;
* ptr = ' \0 ' ;
/* eat leading white space */
while ( ( * val ! = ' \0 ' ) & & ( ( * val = = ' ' ) | | ( * val = = ' \t ' ) ) )
val + + ;
if ( strwicmp ( " password " , param ) = = 0 )
fstrcpy ( password , val ) ;
else if ( strwicmp ( " username " , param ) = = 0 )
fstrcpy ( username , val ) ;
else if ( strwicmp ( " domain " , param ) = = 0 )
fstrcpy ( domain , val ) ;
memset ( buf , 0 , sizeof ( buf ) ) ;
}
fclose ( auth ) ;
return ;
}
2001-05-31 22:35:14 +04:00
static char * next_command ( char * * cmdstr )
{
static pstring command ;
char * p ;
if ( ! cmdstr | | ! ( * cmdstr ) )
return NULL ;
2001-07-04 11:36:09 +04:00
p = strchr_m ( * cmdstr , ' ; ' ) ;
2001-05-31 22:35:14 +04:00
if ( p )
* p = ' \0 ' ;
pstrcpy ( command , * cmdstr ) ;
* cmdstr = p ;
return command ;
}
2001-03-16 01:06:53 +03:00
static void get_username ( char * username )
{
if ( getenv ( " USER " ) )
pstrcpy ( username , getenv ( " USER " ) ) ;
if ( * username = = 0 & & getenv ( " LOGNAME " ) )
pstrcpy ( username , getenv ( " LOGNAME " ) ) ;
if ( * username = = 0 ) {
pstrcpy ( username , " GUEST " ) ;
}
return ;
}
2001-01-16 02:35:59 +03:00
2001-03-14 23:22:57 +03:00
/* Fetch the SID for this domain */
2001-07-20 08:38:58 +04:00
2001-03-14 23:22:57 +03:00
void fetch_domain_sid ( struct cli_state * cli )
2001-01-16 02:35:59 +03:00
{
POLICY_HND pol ;
2001-09-04 11:13:01 +04:00
NTSTATUS result = NT_STATUS_OK ;
uint32 info_class = 5 ;
2001-01-16 02:35:59 +03:00
fstring domain_name ;
static BOOL got_domain_sid ;
2001-04-28 04:32:56 +04:00
TALLOC_CTX * mem_ctx ;
2001-01-16 02:35:59 +03:00
if ( got_domain_sid ) return ;
2001-04-28 04:32:56 +04:00
if ( ! ( mem_ctx = talloc_init ( ) ) )
{
DEBUG ( 0 , ( " fetch_domain_sid: talloc_init returned NULL! \n " ) ) ;
goto error ;
}
2001-01-16 02:35:59 +03:00
2001-03-14 23:22:57 +03:00
if ( ! cli_nt_session_open ( cli , PIPE_LSARPC ) ) {
2001-01-16 02:35:59 +03:00
fprintf ( stderr , " could not initialise lsa pipe \n " ) ;
goto error ;
}
2001-03-14 23:22:57 +03:00
2001-09-04 11:13:01 +04:00
result = cli_lsa_open_policy ( cli , mem_ctx , True ,
SEC_RIGHTS_MAXIMUM_ALLOWED ,
& pol ) ;
if ( ! NT_STATUS_IS_OK ( result ) ) {
2001-01-16 02:35:59 +03:00
goto error ;
}
2001-09-04 11:13:01 +04:00
result = cli_lsa_query_info_policy ( cli , mem_ctx , & pol , info_class ,
domain_name , & domain_sid ) ;
if ( ! NT_STATUS_IS_OK ( result ) ) {
2001-01-16 02:35:59 +03:00
goto error ;
}
got_domain_sid = True ;
2001-04-28 04:32:56 +04:00
cli_lsa_close ( cli , mem_ctx , & pol ) ;
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-16 02:35:59 +03:00
return ;
error :
2001-03-16 01:06:53 +03:00
fprintf ( stderr , " could not obtain sid for domain %s \n " , cli - > domain ) ;
2001-01-16 02:35:59 +03:00
2001-09-04 11:13:01 +04:00
if ( ! NT_STATUS_IS_OK ( result ) ) {
2001-01-16 02:35:59 +03:00
fprintf ( stderr , " error: %s \n " , get_nt_error_msg ( result ) ) ;
}
exit ( 1 ) ;
}
2001-01-12 01:49:30 +03:00
/* Initialise client credentials for authenticated pipe access */
2001-03-14 23:22:57 +03:00
void init_rpcclient_creds ( struct ntuser_creds * creds , char * username ,
2001-03-16 01:06:53 +03:00
char * domain , char * password )
2001-01-12 01:49:30 +03:00
{
ZERO_STRUCTP ( creds ) ;
2001-07-09 00:28:17 +04:00
2001-01-12 01:49:30 +03:00
if ( lp_encrypted_passwords ( ) ) {
pwd_make_lm_nt_16 ( & creds - > pwd , password ) ;
} else {
pwd_set_cleartext ( & creds - > pwd , password ) ;
}
fstrcpy ( creds - > user_name , username ) ;
2001-03-16 01:06:53 +03:00
fstrcpy ( creds - > domain , domain ) ;
2001-07-09 00:28:17 +04:00
if ( ! * username ) {
creds - > pwd . null_pwd = True ;
}
2001-01-12 01:49:30 +03:00
}
2001-07-20 08:38:58 +04:00
/* Display help on commands */
2001-09-15 07:57:12 +04:00
static NTSTATUS cmd_help ( struct cli_state * cli , int argc , char * * argv )
2001-01-12 01:49:30 +03:00
{
2001-07-20 08:38:58 +04:00
struct cmd_list * tmp ;
struct cmd_set * tmp_set ;
/* Usage */
if ( argc > 2 ) {
printf ( " Usage: %s [command] \n " , argv [ 0 ] ) ;
2001-09-15 07:57:12 +04:00
return NT_STATUS_OK ;
2001-07-20 08:38:58 +04:00
}
/* Help on one command */
if ( argc = = 2 ) {
for ( tmp = cmd_list ; tmp ; tmp = tmp - > next ) {
tmp_set = tmp - > cmd_set ;
while ( tmp_set - > name ) {
if ( strequal ( argv [ 1 ] , tmp_set - > name ) ) {
if ( tmp_set - > usage & &
tmp_set - > usage [ 0 ] )
printf ( " %s \n " , tmp_set - > usage ) ;
else
printf ( " No help for %s \n " , tmp_set - > name ) ;
2001-09-15 07:57:12 +04:00
return NT_STATUS_OK ;
2001-07-20 08:38:58 +04:00
}
tmp_set + + ;
}
}
2001-01-12 01:49:30 +03:00
2001-07-20 08:38:58 +04:00
printf ( " No such command: %s \n " , argv [ 1 ] ) ;
2001-09-15 07:57:12 +04:00
return NT_STATUS_OK ;
2001-07-20 08:38:58 +04:00
}
/* List all commands */
for ( tmp = cmd_list ; tmp ; tmp = tmp - > next ) {
tmp_set = tmp - > cmd_set ;
while ( tmp_set - > name ) {
2001-01-12 01:49:30 +03:00
2001-07-20 08:38:58 +04:00
printf ( " %15s \t \t %s \n " , tmp_set - > name ,
tmp_set - > description ) ;
tmp_set + + ;
2001-01-12 01:49:30 +03:00
}
}
2001-09-15 07:57:12 +04:00
return NT_STATUS_OK ;
2001-01-12 01:49:30 +03:00
}
2001-07-20 08:38:58 +04:00
/* Change the debug level */
2001-09-04 11:13:01 +04:00
static NTSTATUS cmd_debuglevel ( struct cli_state * cli , int argc , char * * argv )
2001-01-12 01:49:30 +03:00
{
if ( argc > 2 ) {
printf ( " Usage: %s [debuglevel] \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 ) {
DEBUGLEVEL = atoi ( argv [ 1 ] ) ;
}
printf ( " debuglevel is %d \n " , DEBUGLEVEL ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ;
2001-01-12 01:49:30 +03:00
}
2001-09-04 11:13:01 +04:00
static NTSTATUS cmd_quit ( struct cli_state * cli , int argc , char * * argv )
2001-01-16 02:35:59 +03:00
{
exit ( 0 ) ;
2001-08-27 23:46:22 +04:00
return NT_STATUS_OK ; /* NOTREACHED */
2001-01-16 02:35:59 +03:00
}
2001-01-12 01:49:30 +03:00
/* Build in rpcclient commands */
static struct cmd_set rpcclient_commands [ ] = {
2001-07-20 08:38:58 +04:00
{ " GENERAL OPTIONS " } ,
{ " help " , cmd_help , " Get help on commands " , " [command] " } ,
{ " ? " , cmd_help , " Get help on commands " , " [command] " } ,
{ " debuglevel " , cmd_debuglevel , " Set debug level " , " level " } ,
{ " exit " , cmd_quit , " Exit program " , " " } ,
{ " quit " , cmd_quit , " Exit program " , " " } ,
{ NULL }
2001-01-12 01:49:30 +03:00
} ;
2001-03-15 05:15:05 +03:00
static struct cmd_set separator_command [ ] = {
{ " --------------- " , NULL , " ---------------------- " } ,
2001-07-20 08:38:58 +04:00
{ NULL }
2001-03-15 05:15:05 +03:00
} ;
2001-05-24 04:20:32 +04:00
/* Various pipe commands */
extern struct cmd_set lsarpc_commands [ ] ;
extern struct cmd_set samr_commands [ ] ;
extern struct cmd_set spoolss_commands [ ] ;
extern struct cmd_set netlogon_commands [ ] ;
extern struct cmd_set srvsvc_commands [ ] ;
2001-06-06 11:35:08 +04:00
extern struct cmd_set dfs_commands [ ] ;
2001-08-10 13:52:10 +04:00
extern struct cmd_set reg_commands [ ] ;
2001-05-24 04:20:32 +04:00
static struct cmd_set * rpcclient_command_list [ ] = {
rpcclient_commands ,
lsarpc_commands ,
samr_commands ,
spoolss_commands ,
netlogon_commands ,
srvsvc_commands ,
2001-06-06 11:35:08 +04:00
dfs_commands ,
2001-08-10 13:52:10 +04:00
reg_commands ,
2001-05-24 04:20:32 +04:00
NULL
} ;
2001-01-12 01:49:30 +03:00
void add_command_set ( struct cmd_set * cmd_set )
{
struct cmd_list * entry ;
if ( ! ( entry = ( struct cmd_list * ) malloc ( sizeof ( struct cmd_list ) ) ) ) {
DEBUG ( 0 , ( " out of memory \n " ) ) ;
return ;
}
ZERO_STRUCTP ( entry ) ;
entry - > cmd_set = cmd_set ;
DLIST_ADD ( cmd_list , entry ) ;
}
2001-09-04 11:13:01 +04:00
static NTSTATUS do_cmd ( struct cli_state * cli , struct cmd_set * cmd_entry , char * cmd )
2001-01-12 01:49:30 +03:00
{
char * p = cmd , * * argv = NULL ;
2001-09-04 11:13:01 +04:00
NTSTATUS result ;
2001-01-12 01:49:30 +03:00
pstring buf ;
2001-08-10 13:52:10 +04:00
int argc = 0 , i ;
2001-01-12 01:49:30 +03:00
/* Count number of arguments first time through the loop then
allocate memory and strdup them . */
again :
2001-08-10 13:52:10 +04:00
while ( next_token ( & p , buf , " " , sizeof ( buf ) ) ) {
2001-01-12 01:49:30 +03:00
if ( argv ) {
argv [ argc ] = strdup ( buf ) ;
}
argc + + ;
}
if ( ! argv ) {
/* Create argument list */
argv = ( char * * ) malloc ( sizeof ( char * ) * argc ) ;
2001-01-12 21:19:57 +03:00
2001-01-12 01:49:30 +03:00
if ( ! argv ) {
2001-08-10 13:52:10 +04:00
fprintf ( stderr , " out of memory \n " ) ;
2001-09-29 16:26:40 +04:00
return NT_STATUS_NO_MEMORY ;
2001-01-12 01:49:30 +03:00
}
p = cmd ;
2001-08-10 13:52:10 +04:00
argc = 0 ;
2001-01-12 01:49:30 +03:00
goto again ;
}
/* Call the function */
2001-03-15 05:15:05 +03:00
if ( cmd_entry - > fn ) {
result = cmd_entry - > fn ( cli , argc , argv ) ;
}
else {
fprintf ( stderr , " Invalid command \n " ) ;
result = NT_STATUS_INVALID_PARAMETER ;
}
2001-01-12 01:49:30 +03:00
2001-03-15 05:15:05 +03:00
2001-01-12 01:49:30 +03:00
/* Cleanup */
for ( i = 0 ; i < argc ; i + + ) {
2001-09-17 14:26:23 +04:00
SAFE_FREE ( argv [ i ] ) ;
2001-01-12 01:49:30 +03:00
}
2001-09-17 14:26:23 +04:00
SAFE_FREE ( argv ) ;
2001-01-12 01:49:30 +03:00
return result ;
}
/* Process a command entered at the prompt or as part of -c */
2001-09-04 11:13:01 +04:00
static NTSTATUS process_cmd ( struct cli_state * cli , char * cmd )
2001-01-12 01:49:30 +03:00
{
struct cmd_list * temp_list ;
BOOL found = False ;
pstring buf ;
char * p = cmd ;
2001-09-04 11:13:01 +04:00
NTSTATUS result = NT_STATUS_OK ;
2001-05-31 22:03:45 +04:00
int len = 0 ;
2001-01-12 01:49:30 +03:00
2001-05-04 08:15:48 +04:00
if ( cmd [ strlen ( cmd ) - 1 ] = = ' \n ' )
cmd [ strlen ( cmd ) - 1 ] = ' \0 ' ;
2001-08-10 13:52:10 +04:00
if ( ! next_token ( & p , buf , " " , sizeof ( buf ) ) ) {
2001-09-04 11:13:01 +04:00
return NT_STATUS_OK ;
2001-01-12 01:49:30 +03:00
}
2001-05-31 22:03:45 +04:00
/* strip the trainly \n if it exsists */
len = strlen ( buf ) ;
if ( buf [ len - 1 ] = = ' \n ' )
buf [ len - 1 ] = ' \0 ' ;
2001-01-12 01:49:30 +03:00
/* Search for matching commands */
for ( temp_list = cmd_list ; temp_list ; temp_list = temp_list - > next ) {
struct cmd_set * temp_set = temp_list - > cmd_set ;
while ( temp_set - > name ) {
if ( strequal ( buf , temp_set - > name ) ) {
found = True ;
2001-03-14 23:22:57 +03:00
result = do_cmd ( cli , temp_set , cmd ) ;
2001-01-12 01:49:30 +03:00
goto done ;
}
temp_set + + ;
}
}
done :
2001-01-12 21:19:57 +03:00
if ( ! found & & buf [ 0 ] ) {
2001-01-12 01:49:30 +03:00
printf ( " command not found: %s \n " , buf ) ;
2001-09-04 11:13:01 +04:00
return NT_STATUS_OK ;
2001-01-12 01:49:30 +03:00
}
2001-09-04 11:13:01 +04:00
if ( ! NT_STATUS_IS_OK ( result ) ) {
2001-01-12 01:49:30 +03:00
printf ( " result was %s \n " , get_nt_error_msg ( result ) ) ;
}
return result ;
}
2001-03-14 23:22:57 +03:00
/************************************************************************/
struct cli_state * setup_connection ( struct cli_state * cli , char * system_name ,
struct ntuser_creds * creds )
{
struct in_addr dest_ip ;
struct nmb_name calling , called ;
fstring dest_host ;
extern pstring global_myname ;
struct ntuser_creds anon ;
/* Initialise cli_state information */
if ( ! cli_initialise ( cli ) ) {
return NULL ;
}
2001-01-12 01:49:30 +03:00
2001-03-14 23:22:57 +03:00
if ( ! creds ) {
ZERO_STRUCT ( anon ) ;
anon . pwd . null_pwd = 1 ;
creds = & anon ;
}
cli_init_creds ( cli , creds ) ;
/* Establish a SMB connection */
if ( ! resolve_srv_name ( system_name , dest_host , & dest_ip ) ) {
return NULL ;
}
make_nmb_name ( & called , dns_to_netbios_name ( dest_host ) , 0x20 ) ;
make_nmb_name ( & calling , dns_to_netbios_name ( global_myname ) , 0 ) ;
if ( ! cli_establish_connection ( cli , dest_host , & dest_ip , & calling ,
& called , " IPC$ " , " IPC " , False , True ) ) {
return NULL ;
}
return cli ;
}
/* Print usage information */
2001-07-08 22:25:56 +04:00
static void usage ( void )
2001-01-12 01:49:30 +03:00
{
2001-08-28 01:32:06 +04:00
printf ( " Usage: rpcclient server [options] \n " ) ;
2001-01-12 01:49:30 +03:00
2001-03-16 01:06:53 +03:00
printf ( " \t -A authfile file containing user credentials \n " ) ;
2001-03-14 23:22:57 +03:00
printf ( " \t -c \" command string \" execute semicolon separated cmds \n " ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t -d debuglevel set the debuglevel \n " ) ;
2001-03-14 23:22:57 +03:00
printf ( " \t -l logfile name of logfile to use as opposed to stdout \n " ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t -h Print this help message. \n " ) ;
2001-03-14 23:22:57 +03:00
printf ( " \t -N don't ask for a password \n " ) ;
printf ( " \t -s configfile specify an alternative config file \n " ) ;
2001-01-12 01:49:30 +03:00
printf ( " \t -U username set the network username \n " ) ;
2001-03-16 01:06:53 +03:00
printf ( " \t -W domain set the domain name for user account \n " ) ;
2001-01-12 01:49:30 +03:00
printf ( " \n " ) ;
}
/* Main function */
1998-09-26 01:01:52 +04:00
2000-07-03 08:28:29 +04:00
int main ( int argc , char * argv [ ] )
1999-12-13 16:27:58 +03:00
{
2001-03-16 01:06:53 +03:00
extern char * optarg ;
extern int optind ;
extern pstring global_myname ;
BOOL got_pass = False ;
BOOL interactive = True ;
int opt ;
int olddebug ;
pstring cmdstr = " " ,
servicesf = CONFIGFILE ;
2001-03-14 23:22:57 +03:00
struct ntuser_creds creds ;
struct cli_state cli ;
2001-03-16 01:06:53 +03:00
fstring password ,
username ,
domain ,
server ;
2001-05-24 04:20:32 +04:00
struct cmd_set * * cmd_set ;
2001-01-12 01:49:30 +03:00
setlinebuf ( stdout ) ;
2001-03-14 23:22:57 +03:00
DEBUGLEVEL = 1 ;
2001-01-16 02:35:59 +03:00
2001-07-08 22:25:56 +04:00
while ( ( opt = getopt ( argc , argv , " A:s:Nd:U:W:c:l:h " ) ) ! = EOF ) {
2001-01-12 01:49:30 +03:00
switch ( opt ) {
2001-03-16 01:06:53 +03:00
case ' A ' :
/* only get the username, password, and domain from the file */
read_authfile ( optarg , username , password , domain ) ;
if ( strlen ( password ) )
got_pass = True ;
break ;
2001-03-14 23:22:57 +03:00
case ' c ' :
pstrcpy ( cmdstr , optarg ) ;
2001-01-12 01:49:30 +03:00
break ;
2001-03-14 23:22:57 +03:00
2001-01-12 01:49:30 +03:00
case ' d ' :
DEBUGLEVEL = atoi ( optarg ) ;
break ;
2001-03-14 23:22:57 +03:00
case ' l ' :
slprintf ( debugf , sizeof ( debugf ) - 1 , " %s.client " , optarg ) ;
interactive = False ;
break ;
case ' N ' :
got_pass = True ;
break ;
case ' s ' :
pstrcpy ( servicesf , optarg ) ;
break ;
2001-01-12 01:49:30 +03:00
case ' U ' : {
char * lp ;
pstrcpy ( username , optarg ) ;
2001-07-04 11:36:09 +04:00
if ( ( lp = strchr_m ( username , ' % ' ) ) ) {
2001-01-12 01:49:30 +03:00
* lp = 0 ;
pstrcpy ( password , lp + 1 ) ;
got_pass = True ;
2001-07-04 11:36:09 +04:00
memset ( strchr_m ( optarg , ' % ' ) + 1 , ' X ' , strlen ( password ) ) ;
2001-01-12 01:49:30 +03:00
}
break ;
}
2001-03-14 23:22:57 +03:00
2001-01-12 01:49:30 +03:00
case ' W ' :
2001-03-16 01:06:53 +03:00
pstrcpy ( domain , optarg ) ;
2001-01-12 01:49:30 +03:00
break ;
2001-03-14 23:22:57 +03:00
2001-01-12 01:49:30 +03:00
case ' h ' :
default :
2001-07-08 22:25:56 +04:00
usage ( ) ;
2001-01-12 01:49:30 +03:00
exit ( 1 ) ;
}
}
2001-07-08 22:25:56 +04:00
argv + = optind ;
argc - = optind ;
/* Parse options */
2001-09-05 08:33:25 +04:00
if ( argc = = 0 ) {
2001-07-08 22:25:56 +04:00
usage ( ) ;
return 0 ;
}
2001-03-14 23:22:57 +03:00
2001-08-28 01:32:06 +04:00
if ( strncmp ( " // " , argv [ 0 ] , 2 ) = = 0 | |
strncmp ( " \\ \\ " , argv [ 0 ] , 2 ) = = 0 )
argv [ 0 ] + = 2 ;
2001-07-08 22:25:56 +04:00
pstrcpy ( server , argv [ 0 ] ) ;
2001-03-14 23:22:57 +03:00
/* the following functions are part of the Samba debugging
facilities . See lib / debug . c */
2001-07-08 22:25:56 +04:00
setup_logging ( " rpcclient " , interactive ) ;
2001-03-14 23:22:57 +03:00
if ( ! interactive )
reopen_logs ( ) ;
2001-03-16 01:06:53 +03:00
/* Load smb.conf file */
2001-03-14 23:22:57 +03:00
/* FIXME! How to get this DEBUGLEVEL to last over lp_load()? */
olddebug = DEBUGLEVEL ;
if ( ! lp_load ( servicesf , True , False , False ) ) {
fprintf ( stderr , " Can't load %s \n " , servicesf ) ;
}
DEBUGLEVEL = olddebug ;
load_interfaces ( ) ;
TimeInit ( ) ;
get_myname ( ( * global_myname ) ? NULL : global_myname ) ;
strupper ( global_myname ) ;
/*
* initialize the credentials struct . Get password
* from stdin if necessary
*/
2001-07-09 00:28:17 +04:00
if ( ! strlen ( username ) & & ! got_pass )
get_username ( username ) ;
2001-03-16 01:06:53 +03:00
2001-03-14 23:22:57 +03:00
if ( ! got_pass ) {
2001-03-16 01:06:53 +03:00
init_rpcclient_creds ( & creds , username , domain , " " ) ;
2001-03-15 05:15:05 +03:00
pwd_read ( & creds . pwd , " Enter Password: " , lp_encrypted_passwords ( ) ) ;
2001-03-14 23:22:57 +03:00
}
else {
2001-03-16 01:06:53 +03:00
init_rpcclient_creds ( & creds , username , domain , password ) ;
2001-03-14 23:22:57 +03:00
}
memset ( password , ' X ' , strlen ( password ) ) ;
/* open a connection to the specified server */
ZERO_STRUCTP ( & cli ) ;
if ( ! setup_connection ( & cli , server , & creds ) ) {
2001-07-28 02:54:50 +04:00
return 1 ;
2001-03-14 23:22:57 +03:00
}
/* There are no pointers in ntuser_creds struct so zero it out */
2001-05-24 04:20:32 +04:00
2001-03-14 23:22:57 +03:00
ZERO_STRUCTP ( & creds ) ;
/* Load command lists */
2001-03-16 01:06:53 +03:00
2001-05-24 04:20:32 +04:00
cmd_set = rpcclient_command_list ;
2001-03-16 01:06:53 +03:00
2001-05-24 04:20:32 +04:00
while ( * cmd_set ) {
add_command_set ( * cmd_set ) ;
add_command_set ( separator_command ) ;
cmd_set + + ;
}
2001-01-12 01:49:30 +03:00
2001-05-31 22:35:14 +04:00
/* Do anything specified with -c */
if ( cmdstr [ 0 ] ) {
char * cmd ;
char * p = cmdstr ;
while ( ( cmd = next_command ( & p ) ) ! = NULL ) {
process_cmd ( & cli , cmd ) ;
}
return 0 ;
}
2001-01-12 01:49:30 +03:00
2001-03-14 23:22:57 +03:00
/* Loop around accepting commands */
2001-05-24 04:20:32 +04:00
2001-01-12 01:49:30 +03:00
while ( 1 ) {
2001-04-28 04:32:56 +04:00
pstring prompt ;
2001-03-19 03:32:16 +03:00
char * line ;
2001-01-12 21:19:57 +03:00
2001-03-14 23:22:57 +03:00
slprintf ( prompt , sizeof ( prompt ) - 1 , " rpcclient $> " ) ;
2001-01-12 01:49:30 +03:00
2001-04-28 04:32:56 +04:00
line = smb_readline ( prompt , NULL , completion_fn ) ;
2001-01-12 01:49:30 +03:00
2001-05-04 05:04:23 +04:00
if ( line = = NULL )
break ;
if ( line [ 0 ] ! = ' \n ' )
process_cmd ( & cli , line ) ;
2001-01-12 01:49:30 +03:00
}
2001-04-28 04:32:56 +04:00
2001-05-04 05:04:23 +04:00
return 0 ;
}