1996-05-04 07:50:46 +00:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
SMB client
1998-01-22 13:27:43 +00:00
Copyright ( C ) Andrew Tridgell 1994 - 1998
1996-05-04 07:50:46 +00: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 .
*/
1998-07-29 03:08:05 +00:00
# define NO_SYSLOG
1996-05-04 07:50:46 +00:00
# include "includes.h"
# ifndef REGISTER
# define REGISTER 0
# endif
1998-11-09 03:45:49 +00:00
struct cli_state * cli ;
1998-10-06 23:46:01 +00:00
extern BOOL in_client ;
1996-05-04 07:50:46 +00:00
pstring cur_dir = " \\ " ;
pstring cd_path = " " ;
1998-11-09 03:45:49 +00:00
static pstring service ;
static pstring desthost ;
1998-04-25 01:12:08 +00:00
extern pstring global_myname ;
1997-09-05 21:32:32 +00:00
extern pstring myhostname ;
1998-11-09 03:45:49 +00:00
static pstring password ;
static pstring username ;
static pstring workgroup ;
static char * cmdstr ;
static BOOL got_pass ;
1996-06-06 11:43:09 +00:00
extern struct in_addr ipzero ;
1998-11-09 03:45:49 +00:00
extern pstring scope ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
static int name_type = 0x20 ;
1996-05-04 07:50:46 +00:00
extern pstring user_socket_options ;
1998-09-05 05:07:05 +00:00
static int process_tok ( fstring tok ) ;
1998-11-09 03:45:49 +00:00
static void cmd_help ( void ) ;
1998-09-05 05:07:05 +00:00
1996-05-04 07:50:46 +00:00
/* 30 second timeout on most commands */
# define CLIENT_TIMEOUT (30*1000)
# define SHORT_TIMEOUT (5*1000)
/* value for unused fid field in trans2 secondary request */
# define FID_UNUSED (0xFFFF)
time_t newer_than = 0 ;
int archive_level = 0 ;
extern pstring debugf ;
extern int DEBUGLEVEL ;
BOOL translation = False ;
1998-11-09 03:45:49 +00:00
static BOOL have_ip ;
1996-06-04 06:42:03 +00:00
1996-05-04 07:50:46 +00:00
/* clitar bits insert */
extern int blocksize ;
extern BOOL tar_inc ;
extern BOOL tar_reset ;
/* clitar bits end */
1998-09-28 21:43:48 +00:00
mode_t myumask = 0755 ;
1996-05-04 07:50:46 +00:00
BOOL prompt = True ;
int printmode = 1 ;
1998-11-09 03:45:49 +00:00
static BOOL recurse = False ;
1996-05-04 07:50:46 +00:00
BOOL lowercase = False ;
struct in_addr dest_ip ;
# define SEPARATORS " \t\n\r"
BOOL abort_mget = True ;
pstring fileselection = " " ;
extern file_info def_finfo ;
/* timing globals */
int get_total_size = 0 ;
int get_total_time_ms = 0 ;
int put_total_size = 0 ;
int put_total_time_ms = 0 ;
1997-07-28 18:59:57 +00:00
/* totals globals */
int dir_total = 0 ;
1996-05-04 07:50:46 +00:00
# define USENMB
1998-03-03 20:19:14 +00:00
# define CNV_LANG(s) dos_to_unix(s,False)
# define CNV_INPUT(s) unix_to_dos(s,True)
1996-05-04 07:50:46 +00:00
1998-09-05 05:07:05 +00:00
1996-05-04 07:50:46 +00:00
/****************************************************************************
write to a local file with CR / LF - > LF translation if appropriate . return the
number taken from the buffer . This may not equal the number written .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int writefile ( int f , char * b , int n )
{
1998-11-09 03:45:49 +00:00
int i ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! translation ) {
return write ( f , b , n ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
i = 0 ;
while ( i < n ) {
if ( * b = = ' \r ' & & ( i < ( n - 1 ) ) & & * ( b + 1 ) = = ' \n ' ) {
b + + ; i + + ;
}
if ( write ( f , b , 1 ) ! = 1 ) {
break ;
}
b + + ;
i + + ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
return ( i ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
read from a file with LF - > CR / LF translation if appropriate . return the
number read . read approx n bytes .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int readfile ( char * b , int size , int n , FILE * f )
{
1998-11-09 03:45:49 +00:00
int i ;
int c ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! translation | | ( size ! = 1 ) )
return ( fread ( b , size , n , f ) ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
i = 0 ;
while ( i < n ) {
if ( ( c = getc ( f ) ) = = EOF ) {
break ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( c = = ' \n ' ) { /* change all LFs to CR/LF */
b [ i + + ] = ' \r ' ;
n + + ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( i < n )
b [ i + + ] = c ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
return ( i ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
send a message
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void send_message ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
int total_len = 0 ;
int grp_id ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_message_start ( cli , desthost , username , & grp_id ) ) {
DEBUG ( 0 , ( " message start: %s \n " , cli_errstr ( cli ) ) ) ;
return ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
printf ( " Connected. Type your message, ending it with a Control-D \n " ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
while ( ! feof ( stdin ) & & total_len < 1600 ) {
int maxlen = MIN ( 1600 - total_len , 127 ) ;
pstring msg ;
int l = 0 ;
int c ;
1996-05-04 07:50:46 +00:00
1998-11-13 03:37:01 +00:00
ZERO_ARRAY ( msg ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
for ( l = 0 ; l < maxlen & & ( c = fgetc ( stdin ) ) ! = EOF ; l + + ) {
if ( c = = ' \n ' )
msg [ l + + ] = ' \r ' ;
msg [ l ] = c ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_message_text ( cli , msg , l , grp_id ) ) {
printf ( " SMBsendtxt failed (%s) \n " , cli_errstr ( cli ) ) ;
return ;
}
total_len + = l ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( total_len > = 1600 )
printf ( " the message was truncated to 1600 bytes \n " ) ;
else
printf ( " sent %d bytes \n " , total_len ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_message_end ( cli , grp_id ) ) {
printf ( " SMBsendend failed (%s) \n " , cli_errstr ( cli ) ) ;
return ;
1996-05-04 07:50:46 +00:00
}
}
/****************************************************************************
check the space on a device
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_dskattr ( void )
{
1998-11-09 03:45:49 +00:00
int total , bsize , avail ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_dskattr ( cli , & bsize , & total , & avail ) ) {
DEBUG ( 0 , ( " Error in dskattr: %s \n " , cli_errstr ( cli ) ) ) ;
return ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 0 , ( " \n \t \t %d blocks of size %d. %d blocks available \n " ,
total , bsize , avail ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
show cd / pwd
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_pwd ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
DEBUG ( 0 , ( " Current directory is %s " , CNV_LANG ( service ) ) ) ;
DEBUG ( 0 , ( " %s \n " , CNV_LANG ( cur_dir ) ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
change directory - inner section
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_cd ( char * newdir )
{
1998-11-09 03:45:49 +00:00
char * p = newdir ;
pstring saved_dir ;
pstring dname ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
dos_format ( newdir ) ;
/* Save the current directory in case the
new directory is invalid */
pstrcpy ( saved_dir , cur_dir ) ;
if ( * p = = ' \\ ' )
pstrcpy ( cur_dir , p ) ;
else
pstrcat ( cur_dir , p ) ;
if ( * ( cur_dir + strlen ( cur_dir ) - 1 ) ! = ' \\ ' ) {
pstrcat ( cur_dir , " \\ " ) ;
}
dos_clean_name ( cur_dir ) ;
pstrcpy ( dname , cur_dir ) ;
pstrcat ( cur_dir , " \\ " ) ;
dos_clean_name ( cur_dir ) ;
if ( ! strequal ( cur_dir , " \\ " ) ) {
if ( ! cli_chkpath ( cli , dname ) ) {
DEBUG ( 0 , ( " cd %s: %s \n " , dname , cli_errstr ( cli ) ) ) ;
pstrcpy ( cur_dir , saved_dir ) ;
}
}
pstrcpy ( cd_path , cur_dir ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
change directory
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_cd ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fstring buf ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) )
do_cd ( buf ) ;
else
DEBUG ( 0 , ( " Current directory is %s \n " , CNV_LANG ( cur_dir ) ) ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
/*******************************************************************
decide if a file should be operated on
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL do_this_one ( file_info * finfo )
{
if ( finfo - > mode & aDIR ) return ( True ) ;
if ( * fileselection & &
! mask_match ( finfo - > name , fileselection , False , False ) ) {
DEBUG ( 3 , ( " match_match %s failed \n " , finfo - > name ) ) ;
return False ;
}
if ( newer_than & & finfo - > mtime < newer_than ) {
DEBUG ( 3 , ( " newer_than %s failed \n " , finfo - > name ) ) ;
return ( False ) ;
}
if ( ( archive_level = = 1 | | archive_level = = 2 ) & & ! ( finfo - > mode & aARCH ) ) {
DEBUG ( 3 , ( " archive %s failed \n " , finfo - > name ) ) ;
return ( False ) ;
}
return ( True ) ;
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
display info about a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_finfo ( file_info * finfo )
{
1998-11-09 03:45:49 +00:00
if ( do_this_one ( finfo ) ) {
time_t t = finfo - > mtime ; /* the time is assumed to be passed as GMT */
DEBUG ( 0 , ( " %-30s%7.7s%8.0f %s " ,
CNV_LANG ( finfo - > name ) ,
attrib_string ( finfo - > mode ) ,
( double ) finfo - > size ,
asctime ( LocalTime ( & t ) ) ) ) ;
dir_total + = finfo - > size ;
}
1996-05-04 07:50:46 +00:00
}
1996-06-04 06:42:03 +00:00
1998-09-21 08:45:11 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
accumulate size of a file
1998-09-21 08:45:11 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_du ( file_info * finfo )
{
1998-11-09 03:45:49 +00:00
if ( do_this_one ( finfo ) ) {
dir_total + = finfo - > size ;
}
1998-09-21 08:45:11 +00:00
}
1998-11-09 03:45:49 +00:00
static BOOL do_list_recurse ;
static BOOL do_list_dirs ;
static int do_list_attr ;
static void ( * do_list_fn ) ( file_info * ) ;
1998-09-21 08:45:11 +00:00
1996-06-04 06:42:03 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
a helper for do_list
1996-06-04 06:42:03 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void do_list_helper ( file_info * f , const char * mask )
1996-06-04 06:42:03 +00:00
{
1998-11-09 03:45:49 +00:00
if ( f - > mode & aDIR ) {
if ( do_list_dirs & & do_this_one ( f ) ) {
do_list_fn ( f ) ;
}
if ( do_list_recurse & &
! strequal ( f - > name , " . " ) & &
! strequal ( f - > name , " .. " ) ) {
pstring mask2 ;
char * p ;
pstrcpy ( mask2 , mask ) ;
p = strrchr ( mask2 , ' \\ ' ) ;
if ( ! p ) return ;
p [ 1 ] = 0 ;
pstrcat ( mask2 , f - > name ) ;
if ( do_list_fn = = display_finfo ) {
DEBUG ( 0 , ( " \n %s \n " , CNV_LANG ( mask2 ) ) ) ;
}
1998-11-14 03:34:44 +00:00
pstrcat ( mask2 , " \\ * " ) ;
1998-11-09 03:45:49 +00:00
do_list ( mask2 , do_list_attr , do_list_fn , True , True ) ;
}
return ;
1996-06-04 06:42:03 +00:00
}
1998-11-09 03:45:49 +00:00
if ( do_this_one ( f ) ) {
do_list_fn ( f ) ;
1996-06-04 06:42:03 +00:00
}
1998-11-09 03:45:49 +00:00
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
/****************************************************************************
a wrapper around cli_list that adds recursion
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 20:33:37 +00:00
void do_list ( const char * mask , uint16 attribute , void ( * fn ) ( file_info * ) , BOOL rec , BOOL dirs )
1998-11-09 03:45:49 +00:00
{
do_list_recurse = rec ;
do_list_dirs = dirs ;
do_list_fn = fn ;
do_list_attr = attribute ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
cli_list ( cli , mask , attribute , do_list_helper ) ;
}
/****************************************************************************
get a directory listing
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void cmd_dir ( void )
{
1998-11-09 20:33:37 +00:00
uint16 attribute = aDIR | aSYSTEM | aHIDDEN ;
1998-11-09 03:45:49 +00:00
pstring mask ;
fstring buf ;
char * p = buf ;
dir_total = 0 ;
pstrcpy ( mask , cur_dir ) ;
if ( mask [ strlen ( mask ) - 1 ] ! = ' \\ ' )
pstrcat ( mask , " \\ " ) ;
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
dos_format ( p ) ;
if ( * p = = ' \\ ' )
pstrcpy ( mask , p ) ;
else
pstrcat ( mask , p ) ;
1996-06-04 06:42:03 +00:00
}
1998-11-09 03:45:49 +00:00
else {
1998-11-14 03:34:44 +00:00
pstrcat ( mask , " * " ) ;
1996-06-04 06:42:03 +00:00
}
1998-11-09 03:45:49 +00:00
do_list ( mask , attribute , display_finfo , recurse , True ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
do_dskattr ( ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 3 , ( " Total bytes listed: %d \n " , dir_total ) ) ;
1996-06-04 06:42:03 +00:00
}
/****************************************************************************
1998-11-09 03:45:49 +00:00
get a directory listing
1996-06-04 06:42:03 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_du ( void )
1996-06-04 06:42:03 +00:00
{
1998-11-09 20:33:37 +00:00
uint16 attribute = aDIR | aSYSTEM | aHIDDEN ;
1998-11-09 03:45:49 +00:00
pstring mask ;
fstring buf ;
char * p = buf ;
dir_total = 0 ;
pstrcpy ( mask , cur_dir ) ;
if ( mask [ strlen ( mask ) - 1 ] ! = ' \\ ' )
pstrcat ( mask , " \\ " ) ;
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
dos_format ( p ) ;
if ( * p = = ' \\ ' )
pstrcpy ( mask , p ) ;
else
pstrcat ( mask , p ) ;
} else {
1998-11-14 03:34:44 +00:00
pstrcat ( mask , " * " ) ;
1996-06-04 06:42:03 +00:00
}
1998-11-09 03:45:49 +00:00
do_list ( mask , attribute , do_du , recurse , True ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
do_dskattr ( ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 0 , ( " Total number of bytes: %d \n " , dir_total ) ) ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
/****************************************************************************
get a file from rname to lname
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_get ( char * rname , char * lname )
{
int handle = 0 , fnum ;
BOOL newhandle = False ;
char * data ;
struct timeval tp_start ;
int read_size = 65520 ;
1998-11-09 20:33:37 +00:00
uint16 attr ;
1998-11-09 03:45:49 +00:00
size_t size ;
off_t nread = 0 ;
GetTimeOfDay ( & tp_start ) ;
if ( lowercase ) {
strlower ( lname ) ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
fnum = cli_open ( cli , rname , O_RDONLY , DENY_NONE ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
if ( fnum = = - 1 ) {
DEBUG ( 0 , ( " %s opening remote file %s \n " , cli_errstr ( cli ) , CNV_LANG ( rname ) ) ) ;
return ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
if ( ! strcmp ( lname , " - " ) ) {
handle = fileno ( stdout ) ;
} else {
1998-11-17 20:50:07 +00:00
handle = sys_open ( lname , O_WRONLY | O_CREAT | O_TRUNC , 0644 ) ;
1998-11-09 03:45:49 +00:00
newhandle = True ;
}
if ( handle < 0 ) {
DEBUG ( 0 , ( " Error opening local file %s \n " , lname ) ) ;
return ;
}
1996-06-04 06:42:03 +00:00
1998-11-14 03:53:24 +00:00
if ( ! cli_qfileinfo ( cli , fnum ,
& attr , & size , NULL , NULL , NULL , NULL , NULL ) & &
! cli_getattrE ( cli , fnum ,
& attr , & size , NULL , NULL , NULL ) ) {
DEBUG ( 0 , ( " getattrib: %s \n " , cli_errstr ( cli ) ) ) ;
1998-11-09 03:45:49 +00:00
return ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 2 , ( " getting file %s of size %.0f as %s " ,
lname , ( double ) size , lname ) ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
data = ( char * ) malloc ( read_size ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
while ( 1 ) {
int n = cli_read ( cli , fnum , data , nread , read_size ) ;
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
if ( n < = 0 ) break ;
if ( writefile ( handle , data , n ) ! = n ) {
DEBUG ( 0 , ( " Error writing local file \n " ) ) ;
break ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
nread + = n ;
}
if ( ! cli_close ( cli , fnum ) ) {
DEBUG ( 0 , ( " Error %s closing remote file \n " , cli_errstr ( cli ) ) ) ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
if ( newhandle ) {
close ( handle ) ;
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
if ( archive_level > = 2 & & ( attr & aARCH ) ) {
1998-11-09 20:33:37 +00:00
cli_setatr ( cli , rname , attr & ~ ( uint16 ) aARCH , 0 ) ;
1998-11-09 03:45:49 +00:00
}
1996-06-04 06:42:03 +00:00
1998-11-09 03:45:49 +00:00
{
struct timeval tp_end ;
int this_time ;
GetTimeOfDay ( & tp_end ) ;
this_time =
( tp_end . tv_sec - tp_start . tv_sec ) * 1000 +
( tp_end . tv_usec - tp_start . tv_usec ) / 1000 ;
get_total_time_ms + = this_time ;
get_total_size + = nread ;
DEBUG ( 2 , ( " (%g kb/s) (average %g kb/s) \n " ,
nread / ( 1.024 * this_time + 1.0e-4 ) ,
get_total_size / ( 1.024 * get_total_time_ms ) ) ) ;
}
1996-06-04 06:42:03 +00:00
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
get a file
1996-05-04 07:50:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_get ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring lname ;
pstring rname ;
char * p ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
pstrcpy ( rname , cur_dir ) ;
pstrcat ( rname , " \\ " ) ;
p = rname + strlen ( rname ) ;
if ( ! next_token ( NULL , p , NULL , sizeof ( rname ) - strlen ( rname ) ) ) {
DEBUG ( 0 , ( " get <filename> \n " ) ) ;
return ;
}
pstrcpy ( lname , p ) ;
dos_clean_name ( rname ) ;
next_token ( NULL , lname , NULL , sizeof ( lname ) ) ;
do_get ( rname , lname ) ;
1996-05-04 07:50:46 +00:00
}
1996-08-13 08:57:55 +00:00
1996-05-04 07:50:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
do a mget operation on one file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_mget ( file_info * finfo )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring rname ;
pstring quest ;
pstring saved_curdir ;
pstring mget_mask ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( strequal ( finfo - > name , " . " ) | | strequal ( finfo - > name , " .. " ) )
return ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( abort_mget ) {
DEBUG ( 0 , ( " mget aborted \n " ) ) ;
return ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( finfo - > mode & aDIR )
slprintf ( quest , sizeof ( pstring ) - 1 ,
" Get directory %s? " , CNV_LANG ( finfo - > name ) ) ;
else
slprintf ( quest , sizeof ( pstring ) - 1 ,
" Get file %s? " , CNV_LANG ( finfo - > name ) ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( prompt & & ! yesno ( quest ) ) return ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! ( finfo - > mode & aDIR ) ) {
pstrcpy ( rname , cur_dir ) ;
pstrcat ( rname , finfo - > name ) ;
do_get ( rname , finfo - > name ) ;
return ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
/* handle directories */
pstrcpy ( saved_curdir , cur_dir ) ;
pstrcat ( cur_dir , finfo - > name ) ;
pstrcat ( cur_dir , " \\ " ) ;
unix_format ( finfo - > name ) ;
if ( lowercase )
strlower ( finfo - > name ) ;
1998-11-25 21:17:20 +00:00
if ( ! dos_directory_exist ( finfo - > name , NULL ) & &
1998-11-09 03:45:49 +00:00
dos_mkdir ( finfo - > name , 0777 ) ! = 0 ) {
DEBUG ( 0 , ( " failed to create directory %s \n " , CNV_LANG ( finfo - > name ) ) ) ;
pstrcpy ( cur_dir , saved_curdir ) ;
return ;
}
if ( dos_chdir ( finfo - > name ) ! = 0 ) {
DEBUG ( 0 , ( " failed to chdir to directory %s \n " , CNV_LANG ( finfo - > name ) ) ) ;
pstrcpy ( cur_dir , saved_curdir ) ;
return ;
1996-06-04 06:42:03 +00:00
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
pstrcpy ( mget_mask , cur_dir ) ;
1998-11-14 03:34:44 +00:00
pstrcat ( mget_mask , " * " ) ;
1998-11-09 03:45:49 +00:00
do_list ( mget_mask , aSYSTEM | aHIDDEN | aDIR , do_mget , False , True ) ;
chdir ( " .. " ) ;
pstrcpy ( cur_dir , saved_curdir ) ;
1996-06-04 06:42:03 +00:00
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
/****************************************************************************
view the file using the pager
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void cmd_more ( void )
{
fstring rname , lname , tmpname , pager_cmd ;
char * pager ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
fstrcpy ( rname , cur_dir ) ;
fstrcat ( rname , " \\ " ) ;
slprintf ( tmpname ,
sizeof ( fstring ) - 1 ,
" %s/smbmore.%d " , tmpdir ( ) , ( int ) getpid ( ) ) ;
fstrcpy ( lname , tmpname ) ;
if ( ! next_token ( NULL , rname + strlen ( rname ) , NULL , sizeof ( rname ) - strlen ( rname ) ) ) {
DEBUG ( 0 , ( " more <filename> \n " ) ) ;
return ;
}
dos_clean_name ( rname ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
do_get ( rname , lname ) ;
1998-04-11 07:52:13 +00:00
1998-11-09 03:45:49 +00:00
pager = getenv ( " PAGER " ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
slprintf ( pager_cmd , sizeof ( pager_cmd ) - 1 ,
" %s %s " , ( pager ? pager : PAGER ) , tmpname ) ;
system ( pager_cmd ) ;
unlink ( tmpname ) ;
}
1998-04-11 07:52:13 +00:00
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
/****************************************************************************
do a mget command
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void cmd_mget ( void )
{
1998-11-09 20:33:37 +00:00
uint16 attribute = aSYSTEM | aHIDDEN ;
1998-11-09 03:45:49 +00:00
pstring mget_mask ;
fstring buf ;
char * p = buf ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
* mget_mask = 0 ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( recurse )
attribute | = aDIR ;
abort_mget = False ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
while ( next_token ( NULL , p , NULL , sizeof ( buf ) ) ) {
pstrcpy ( mget_mask , cur_dir ) ;
if ( mget_mask [ strlen ( mget_mask ) - 1 ] ! = ' \\ ' )
pstrcat ( mget_mask , " \\ " ) ;
if ( * p = = ' \\ ' )
pstrcpy ( mget_mask , p ) ;
else
pstrcat ( mget_mask , p ) ;
do_list ( mget_mask , attribute , do_mget , False , True ) ;
1996-06-04 06:42:03 +00:00
}
1998-11-09 03:45:49 +00:00
if ( ! * mget_mask ) {
pstrcpy ( mget_mask , cur_dir ) ;
if ( mget_mask [ strlen ( mget_mask ) - 1 ] ! = ' \\ ' )
pstrcat ( mget_mask , " \\ " ) ;
1998-11-14 03:34:44 +00:00
pstrcat ( mget_mask , " * " ) ;
1998-11-09 03:45:49 +00:00
do_list ( mget_mask , attribute , do_mget , False , True ) ;
1996-06-04 06:42:03 +00:00
}
1996-05-04 07:50:46 +00:00
}
1996-06-04 06:42:03 +00:00
1996-05-04 07:50:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
make a directory of name " name "
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL do_mkdir ( char * name )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
if ( ! cli_mkdir ( cli , name ) ) {
DEBUG ( 0 , ( " %s making remote directory %s \n " ,
cli_errstr ( cli ) , CNV_LANG ( name ) ) ) ;
return ( False ) ;
}
return ( True ) ;
1996-05-04 07:50:46 +00:00
}
1998-09-21 08:45:11 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
make a directory of name " name "
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void cmd_quit ( void )
1998-09-21 08:45:11 +00:00
{
1998-11-09 03:45:49 +00:00
cli_shutdown ( cli ) ;
exit ( 0 ) ;
1998-09-21 08:45:11 +00:00
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
1996-05-04 07:50:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
make a directory
1996-05-04 07:50:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_mkdir ( void )
{
pstring mask ;
fstring buf ;
char * p = buf ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
pstrcpy ( mask , cur_dir ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! next_token ( NULL , p , NULL , sizeof ( buf ) ) ) {
if ( ! recurse )
DEBUG ( 0 , ( " mkdir <dirname> \n " ) ) ;
return ;
1998-10-24 02:49:09 +00:00
}
1998-11-09 03:45:49 +00:00
pstrcat ( mask , p ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( recurse ) {
pstring ddir ;
pstring ddir2 ;
* ddir2 = 0 ;
pstrcpy ( ddir , mask ) ;
trim_string ( ddir , " . " , NULL ) ;
p = strtok ( ddir , " / \\ " ) ;
while ( p ) {
pstrcat ( ddir2 , p ) ;
if ( ! cli_chkpath ( cli , ddir2 ) ) {
do_mkdir ( ddir2 ) ;
}
pstrcat ( ddir2 , " \\ " ) ;
p = strtok ( NULL , " / \\ " ) ;
}
} else {
do_mkdir ( mask ) ;
}
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
put a single file
1996-05-04 07:50:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void do_put ( char * rname , char * lname )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
int fnum ;
FILE * f ;
int nread = 0 ;
char * buf = NULL ;
int maxwrite = 65520 ;
struct timeval tp_start ;
GetTimeOfDay ( & tp_start ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
fnum = cli_open ( cli , rname , O_WRONLY | O_CREAT | O_TRUNC , DENY_NONE ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( fnum = = - 1 ) {
DEBUG ( 0 , ( " %s opening remote file %s \n " , cli_errstr ( cli ) , CNV_LANG ( rname ) ) ) ;
return ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
/* allow files to be piped into smbclient
jdblair 24. jun .98 */
if ( ! strcmp ( lname , " - " ) ) {
f = stdin ;
/* size of file is not known */
} else {
1998-11-17 20:50:07 +00:00
f = sys_fopen ( lname , " r " ) ;
1998-11-09 03:45:49 +00:00
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! f ) {
DEBUG ( 0 , ( " Error opening local file %s \n " , lname ) ) ;
return ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 1 , ( " putting file %s as %s " , lname ,
CNV_LANG ( rname ) ) ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
buf = ( char * ) malloc ( maxwrite ) ;
while ( ! feof ( f ) ) {
int n = maxwrite ;
int ret ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ( n = readfile ( buf , 1 , n , f ) ) < 1 ) {
DEBUG ( 0 , ( " Error reading local file \n " ) ) ;
break ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
ret = cli_write ( cli , fnum , 0 , buf , nread , n ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( n ! = ret ) {
DEBUG ( 0 , ( " Error writing file: %s \n " , cli_errstr ( cli ) ) ) ;
break ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
nread + = n ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_close ( cli , fnum ) ) {
DEBUG ( 0 , ( " %s closing remote file %s \n " , cli_errstr ( cli ) , CNV_LANG ( rname ) ) ) ;
fclose ( f ) ;
if ( buf ) free ( buf ) ;
return ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
fclose ( f ) ;
if ( buf ) free ( buf ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
{
struct timeval tp_end ;
int this_time ;
GetTimeOfDay ( & tp_end ) ;
this_time =
( tp_end . tv_sec - tp_start . tv_sec ) * 1000 +
( tp_end . tv_usec - tp_start . tv_usec ) / 1000 ;
put_total_time_ms + = this_time ;
put_total_size + = nread ;
DEBUG ( 1 , ( " (%g kb/s) (average %g kb/s) \n " ,
nread / ( 1.024 * this_time + 1.0e-4 ) ,
put_total_size / ( 1.024 * put_total_time_ms ) ) ) ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( f = = stdin ) {
cli_shutdown ( cli ) ;
exit ( 0 ) ;
}
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
1996-05-04 07:50:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
put a file
1996-05-04 07:50:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_put ( void )
{
pstring lname ;
pstring rname ;
fstring buf ;
char * p = buf ;
pstrcpy ( rname , cur_dir ) ;
pstrcat ( rname , " \\ " ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! next_token ( NULL , p , NULL , sizeof ( buf ) ) ) {
DEBUG ( 0 , ( " put <filename> \n " ) ) ;
return ;
}
pstrcpy ( lname , p ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( next_token ( NULL , p , NULL , sizeof ( buf ) ) )
pstrcat ( rname , p ) ;
else
pstrcat ( rname , lname ) ;
dos_clean_name ( rname ) ;
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
SMB_STRUCT_STAT st ;
/* allow '-' to represent stdin
jdblair , 24. jun .98 */
if ( ! file_exist ( lname , & st ) & &
( strcmp ( lname , " - " ) ) ) {
DEBUG ( 0 , ( " %s does not exist \n " , lname ) ) ;
return ;
}
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
do_put ( rname , lname ) ;
1998-08-11 02:13:01 +00:00
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
seek in a directory / file list until you get something that doesn ' t start with
the specified name
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL seek_list ( FILE * f , char * name )
{
1998-11-09 03:45:49 +00:00
pstring s ;
while ( ! feof ( f ) ) {
if ( fscanf ( f , " %s " , s ) ! = 1 ) return ( False ) ;
trim_string ( s , " ./ " , NULL ) ;
if ( strncmp ( s , name , strlen ( name ) ) ! = 0 ) {
pstrcpy ( name , s ) ;
return ( True ) ;
}
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
return ( False ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
set the file selection mask
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_select ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstrcpy ( fileselection , " " ) ;
next_token ( NULL , fileselection , NULL , sizeof ( fileselection ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
mput some files
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_mput ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring lname ;
pstring rname ;
fstring buf ;
char * p = buf ;
while ( next_token ( NULL , p , NULL , sizeof ( buf ) ) ) {
SMB_STRUCT_STAT st ;
pstring cmd ;
pstring tmpname ;
FILE * f ;
slprintf ( tmpname , sizeof ( pstring ) - 1 ,
" %s/ls.smb.%d " , tmpdir ( ) , ( int ) getpid ( ) ) ;
if ( recurse )
slprintf ( cmd , sizeof ( pstring ) - 1 ,
" find . -name \" %s \" -print > %s " , p , tmpname ) ;
else
slprintf ( cmd , sizeof ( pstring ) - 1 ,
" /bin/ls %s > %s " , p , tmpname ) ;
system ( cmd ) ;
1996-05-04 07:50:46 +00:00
1998-11-17 20:50:07 +00:00
f = sys_fopen ( tmpname , " r " ) ;
1998-11-09 03:45:49 +00:00
if ( ! f ) continue ;
while ( ! feof ( f ) ) {
pstring quest ;
if ( fscanf ( f , " %s " , lname ) ! = 1 ) break ;
trim_string ( lname , " ./ " , NULL ) ;
again1 :
/* check if it's a directory */
if ( directory_exist ( lname , & st ) ) {
if ( ! recurse ) continue ;
slprintf ( quest , sizeof ( pstring ) - 1 ,
" Put directory %s? " , lname ) ;
if ( prompt & & ! yesno ( quest ) ) {
pstrcat ( lname , " / " ) ;
if ( ! seek_list ( f , lname ) )
break ;
goto again1 ;
}
pstrcpy ( rname , cur_dir ) ;
pstrcat ( rname , lname ) ;
if ( ! cli_chkpath ( cli , rname ) & & ! do_mkdir ( rname ) ) {
pstrcat ( lname , " / " ) ;
if ( ! seek_list ( f , lname ) )
break ;
goto again1 ;
}
continue ;
} else {
slprintf ( quest , sizeof ( quest ) - 1 ,
" Put file %s? " , lname ) ;
if ( prompt & & ! yesno ( quest ) ) continue ;
pstrcpy ( rname , cur_dir ) ;
pstrcat ( rname , lname ) ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
dos_format ( rname ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
do_put ( rname , lname ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
fclose ( f ) ;
unlink ( tmpname ) ;
1996-05-04 07:50:46 +00:00
}
}
1998-11-09 03:45:49 +00:00
1996-05-04 07:50:46 +00:00
/****************************************************************************
cancel a print job
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_cancel ( int job )
{
1998-11-09 03:45:49 +00:00
if ( cli_printjob_del ( cli , job ) ) {
printf ( " Job %d cancelled \n " , job ) ;
} else {
printf ( " Error calcelling job %d : %s \n " , job , cli_errstr ( cli ) ) ;
}
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
cancel a print job
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_cancel ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fstring buf ;
int job ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
printf ( " cancel <jobid> ... \n " ) ;
return ;
}
do {
job = atoi ( buf ) ;
do_cancel ( job ) ;
} while ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) ;
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
print a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_print ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring lname ;
pstring rname ;
char * p ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! next_token ( NULL , lname , NULL , sizeof ( lname ) ) ) {
DEBUG ( 0 , ( " print <filename> \n " ) ) ;
return ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
pstrcpy ( rname , lname ) ;
p = strrchr ( rname , ' / ' ) ;
if ( p ) {
slprintf ( rname , sizeof ( rname ) - 1 , " %s-%d " , p + 1 , ( int ) getpid ( ) ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( strequal ( lname , " - " ) ) {
slprintf ( rname , sizeof ( rname ) - 1 , " stdin-%d " , ( int ) getpid ( ) ) ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
do_put ( rname , lname ) ;
1996-05-04 07:50:46 +00:00
}
1997-07-01 01:19:13 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
show a print queue entry
1997-07-01 01:19:13 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void queue_fn ( struct print_job_info * p )
1997-07-01 01:19:13 +00:00
{
1998-11-09 03:45:49 +00:00
DEBUG ( 0 , ( " %-6d %-9d %s \n " , ( int ) p - > id , ( int ) p - > size , p - > name ) ) ;
1997-07-01 01:19:13 +00:00
}
1996-08-13 08:57:55 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
show a print queue
1996-08-13 08:57:55 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_queue ( void )
1996-08-13 08:57:55 +00:00
{
1998-11-09 03:45:49 +00:00
cli_print_queue ( cli , queue_fn ) ;
1996-08-13 08:57:55 +00:00
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
delete some files
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void do_del ( file_info * finfo )
{
1998-11-09 03:45:49 +00:00
pstring mask ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
pstrcpy ( mask , cur_dir ) ;
pstrcat ( mask , finfo - > name ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( finfo - > mode & aDIR )
return ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_unlink ( cli , mask ) ) {
DEBUG ( 0 , ( " %s deleting remote file %s \n " , cli_errstr ( cli ) , CNV_LANG ( mask ) ) ) ;
}
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
delete some files
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_del ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring mask ;
fstring buf ;
1998-11-09 20:33:37 +00:00
uint16 attribute = aSYSTEM | aHIDDEN ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( recurse )
attribute | = aDIR ;
pstrcpy ( mask , cur_dir ) ;
if ( ! next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
DEBUG ( 0 , ( " del <filename> \n " ) ) ;
return ;
}
pstrcat ( mask , buf ) ;
do_list ( mask , attribute , do_del , False , False ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
remove a directory
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_rmdir ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring mask ;
fstring buf ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
pstrcpy ( mask , cur_dir ) ;
if ( ! next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
DEBUG ( 0 , ( " rmdir <dirname> \n " ) ) ;
return ;
}
pstrcat ( mask , buf ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_rmdir ( cli , mask ) ) {
DEBUG ( 0 , ( " %s removing remote directory file %s \n " ,
cli_errstr ( cli ) , CNV_LANG ( mask ) ) ) ;
}
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
rename some files
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_rename ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring src , dest ;
fstring buf , buf2 ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
pstrcpy ( src , cur_dir ) ;
pstrcpy ( dest , cur_dir ) ;
if ( ! next_token ( NULL , buf , NULL , sizeof ( buf ) ) | |
! next_token ( NULL , buf2 , NULL , sizeof ( buf2 ) ) ) {
DEBUG ( 0 , ( " rename <src> <dest> \n " ) ) ;
return ;
}
pstrcat ( src , buf ) ;
pstrcat ( dest , buf2 ) ;
if ( ! cli_rename ( cli , src , dest ) ) {
DEBUG ( 0 , ( " %s renaming files \n " , cli_errstr ( cli ) ) ) ;
return ;
}
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
toggle the prompt flag
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_prompt ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
prompt = ! prompt ;
DEBUG ( 2 , ( " prompting is now %s \n " , prompt ? " on " : " off " ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
set the newer than time
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_newer ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fstring buf ;
BOOL ok ;
SMB_STRUCT_STAT sbuf ;
ok = next_token ( NULL , buf , NULL , sizeof ( buf ) ) ;
if ( ok & & ( dos_stat ( buf , & sbuf ) = = 0 ) ) {
newer_than = sbuf . st_mtime ;
DEBUG ( 1 , ( " Getting files newer than %s " ,
asctime ( LocalTime ( & newer_than ) ) ) ) ;
} else {
newer_than = 0 ;
}
if ( ok & & newer_than = = 0 )
DEBUG ( 0 , ( " Error setting newer-than time \n " ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
set the archive level
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_archive ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fstring buf ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
archive_level = atoi ( buf ) ;
} else
DEBUG ( 0 , ( " Archive level is %d \n " , archive_level ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
toggle the lowercaseflag
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_lowercase ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
lowercase = ! lowercase ;
DEBUG ( 2 , ( " filename lowercasing is now %s \n " , lowercase ? " on " : " off " ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
toggle the recurse flag
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_recurse ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
recurse = ! recurse ;
DEBUG ( 2 , ( " directory recursion is now %s \n " , recurse ? " on " : " off " ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
toggle the translate flag
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_translate ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
translation = ! translation ;
DEBUG ( 2 , ( " CR/LF<->LF and print text translation now %s \n " ,
translation ? " on " : " off " ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
do a printmode command
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_printmode ( void )
{
fstring buf ;
fstring mode ;
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
if ( strequal ( buf , " text " ) ) {
printmode = 0 ;
} else {
if ( strequal ( buf , " graphics " ) )
printmode = 1 ;
else
printmode = atoi ( buf ) ;
}
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
switch ( printmode )
{
case 0 :
fstrcpy ( mode , " text " ) ;
break ;
case 1 :
fstrcpy ( mode , " graphics " ) ;
break ;
default :
slprintf ( mode , sizeof ( mode ) - 1 , " %d " , printmode ) ;
break ;
}
DEBUG ( 2 , ( " the printmode is now %s \n " , mode ) ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
1998-11-09 03:45:49 +00:00
do the lcd command
1996-05-04 07:50:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_lcd ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fstring buf ;
pstring d ;
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) )
1998-11-25 21:17:20 +00:00
chdir ( buf ) ;
DEBUG ( 2 , ( " the local directory is now %s \n " , sys_getwd ( d ) ) ) ;
1998-11-09 03:45:49 +00:00
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
/****************************************************************************
list a share name
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void browse_fn ( const char * name , uint32 m , const char * comment )
{
1998-06-04 18:49:13 +00:00
fstring typestr ;
* typestr = 0 ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
switch ( m )
1998-06-04 18:49:13 +00:00
{
case STYPE_DISKTREE :
fstrcpy ( typestr , " Disk " ) ; break ;
case STYPE_PRINTQ :
1998-11-09 03:45:49 +00:00
fstrcpy ( typestr , " Printer " ) ; break ;
1998-06-04 18:49:13 +00:00
case STYPE_DEVICE :
fstrcpy ( typestr , " Device " ) ; break ;
case STYPE_IPC :
1998-11-09 03:45:49 +00:00
fstrcpy ( typestr , " IPC " ) ; break ;
1998-06-04 18:49:13 +00:00
}
1996-05-04 07:50:46 +00:00
1998-06-04 18:49:13 +00:00
printf ( " \t %-15.15s%-10.10s%s \n " ,
1998-11-09 03:45:49 +00:00
name , typestr , comment ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
1998-11-09 03:45:49 +00:00
try and browse available connections on a host
1996-05-04 07:50:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static BOOL browse_host ( BOOL sort )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
printf ( " \n \t Sharename Type Comment \n " ) ;
printf ( " \t --------- ---- ------- \n " ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
return cli_RNetShareEnum ( cli , browse_fn ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
/****************************************************************************
list a server name
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void server_fn ( const char * name , uint32 m , const char * comment )
{
printf ( " \t %-16.16s %s \n " , name , comment ) ;
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
try and browse available connections on a host
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1996-07-17 18:33:36 +00:00
static BOOL list_servers ( char * wk_grp )
1996-05-04 07:50:46 +00:00
{
1998-06-04 18:49:13 +00:00
printf ( " \n \t Server Comment \n " ) ;
printf ( " \t --------- ------- \n " ) ;
1998-11-09 03:45:49 +00:00
cli_NetServerEnum ( cli , workgroup , SV_TYPE_ALL , server_fn ) ;
1998-06-04 18:49:13 +00:00
printf ( " \n \t Workgroup Master \n " ) ;
printf ( " \t --------- ------- \n " ) ;
1998-11-09 03:45:49 +00:00
cli_NetServerEnum ( cli , workgroup , SV_TYPE_DOMAIN_ENUM , server_fn ) ;
return True ;
1996-05-04 07:50:46 +00:00
}
1998-09-18 12:47:46 +00:00
/* Some constants for completing filename arguments */
# define COMPL_NONE 0 /* No completions */
# define COMPL_REMOTE 1 /* Complete remote filename */
# define COMPL_LOCAL 2 /* Complete local filename */
1996-05-04 07:50:46 +00:00
/* This defines the commands supported by this client */
struct
{
char * name ;
1998-11-09 03:45:49 +00:00
void ( * fn ) ( void ) ;
1996-05-04 07:50:46 +00:00
char * description ;
1998-09-18 12:47:46 +00:00
char compl_args [ 2 ] ; /* Completion argument info */
1996-05-04 07:50:46 +00:00
} commands [ ] =
{
1998-09-23 00:57:34 +00:00
{ " ls " , cmd_dir , " <mask> list the contents of the current directory " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " dir " , cmd_dir , " <mask> list the contents of the current directory " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " du " , cmd_du , " <mask> computes the total size of the current directory " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " lcd " , cmd_lcd , " [directory] change/report the local current working directory " , { COMPL_LOCAL , COMPL_NONE } } ,
{ " cd " , cmd_cd , " [directory] change/report the remote directory " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " pwd " , cmd_pwd , " show current remote directory (same as 'cd' with no args) " , { COMPL_NONE , COMPL_NONE } } ,
{ " get " , cmd_get , " <remote name> [local name] get a file " , { COMPL_REMOTE , COMPL_LOCAL } } ,
{ " mget " , cmd_mget , " <mask> get all the matching files " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " put " , cmd_put , " <local name> [remote name] put a file " , { COMPL_LOCAL , COMPL_REMOTE } } ,
{ " mput " , cmd_mput , " <mask> put all matching files " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " rename " , cmd_rename , " <src> <dest> rename some files " , { COMPL_REMOTE , COMPL_REMOTE } } ,
{ " more " , cmd_more , " <remote name> view a remote file with your pager " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " mask " , cmd_select , " <mask> mask all filenames against this " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " del " , cmd_del , " <mask> delete all matching files " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " rm " , cmd_del , " <mask> delete all matching files " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " mkdir " , cmd_mkdir , " <directory> make a directory " , { COMPL_NONE , COMPL_NONE } } ,
{ " md " , cmd_mkdir , " <directory> make a directory " , { COMPL_NONE , COMPL_NONE } } ,
{ " rmdir " , cmd_rmdir , " <directory> remove a directory " , { COMPL_NONE , COMPL_NONE } } ,
{ " rd " , cmd_rmdir , " <directory> remove a directory " , { COMPL_NONE , COMPL_NONE } } ,
{ " prompt " , cmd_prompt , " toggle prompting for filenames for mget and mput " , { COMPL_NONE , COMPL_NONE } } ,
{ " recurse " , cmd_recurse , " toggle directory recursion for mget and mput " , { COMPL_NONE , COMPL_NONE } } ,
{ " translate " , cmd_translate , " toggle text translation for printing " , { COMPL_NONE , COMPL_NONE } } ,
{ " lowercase " , cmd_lowercase , " toggle lowercasing of filenames for get " , { COMPL_NONE , COMPL_NONE } } ,
{ " print " , cmd_print , " <file name> print a file " , { COMPL_NONE , COMPL_NONE } } ,
{ " printmode " , cmd_printmode , " <graphics or text> set the print mode " , { COMPL_NONE , COMPL_NONE } } ,
{ " queue " , cmd_queue , " show the print queue " , { COMPL_NONE , COMPL_NONE } } ,
{ " cancel " , cmd_cancel , " <jobid> cancel a print queue entry " , { COMPL_NONE , COMPL_NONE } } ,
1998-11-09 03:45:49 +00:00
{ " quit " , cmd_quit , " logoff the server " , { COMPL_NONE , COMPL_NONE } } ,
{ " q " , cmd_quit , " logoff the server " , { COMPL_NONE , COMPL_NONE } } ,
{ " exit " , cmd_quit , " logoff the server " , { COMPL_NONE , COMPL_NONE } } ,
1998-09-23 00:57:34 +00:00
{ " newer " , cmd_newer , " <file> only mget files newer than the specified local file " , { COMPL_LOCAL , COMPL_NONE } } ,
{ " archive " , cmd_archive , " <level> \n 0=ignore archive bit \n 1=only get archive files \n 2=only get archive files and reset archive bit \n 3=get all files and reset archive bit " , { COMPL_NONE , COMPL_NONE } } ,
1998-10-04 07:09:38 +00:00
{ " tar " , cmd_tar , " tar <c|x>[IXFqbgNan] current directory to/from <file name> " , { COMPL_NONE , COMPL_NONE } } ,
1998-09-23 00:57:34 +00:00
{ " blocksize " , cmd_block , " blocksize <number> (default 20) " , { COMPL_NONE , COMPL_NONE } } ,
1996-05-04 07:50:46 +00:00
{ " tarmode " , cmd_tarmode ,
1998-09-23 00:57:34 +00:00
" <full|inc|reset|noreset> tar's behaviour towards archive bits " , { COMPL_NONE , COMPL_NONE } } ,
{ " setmode " , cmd_setmode , " filename <setmode string> change modes of file " , { COMPL_REMOTE , COMPL_NONE } } ,
{ " help " , cmd_help , " [command] give help on a command " , { COMPL_NONE , COMPL_NONE } } ,
{ " ? " , cmd_help , " [command] give help on a command " , { COMPL_NONE , COMPL_NONE } } ,
{ " ! " , NULL , " run a shell command on the local system " , { COMPL_NONE , COMPL_NONE } } ,
{ " " , NULL , NULL , { COMPL_NONE , COMPL_NONE } }
1996-05-04 07:50:46 +00:00
} ;
/*******************************************************************
lookup a command string in the list of commands , including
abbreviations
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int process_tok ( fstring tok )
{
1998-11-09 03:45:49 +00:00
int i = 0 , matches = 0 ;
int cmd = 0 ;
int tok_len = strlen ( tok ) ;
while ( commands [ i ] . fn ! = NULL ) {
if ( strequal ( commands [ i ] . name , tok ) ) {
matches = 1 ;
cmd = i ;
break ;
} else if ( strnequal ( commands [ i ] . name , tok , tok_len ) ) {
matches + + ;
cmd = i ;
}
i + + ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( matches = = 0 )
return ( - 1 ) ;
else if ( matches = = 1 )
return ( cmd ) ;
else
return ( - 2 ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
help
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void cmd_help ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
int i = 0 , j ;
fstring buf ;
if ( next_token ( NULL , buf , NULL , sizeof ( buf ) ) ) {
if ( ( i = process_tok ( buf ) ) > = 0 )
DEBUG ( 0 , ( " HELP %s: \n \t %s \n \n " , commands [ i ] . name , commands [ i ] . description ) ) ;
} else {
while ( commands [ i ] . description ) {
for ( j = 0 ; commands [ i ] . description & & ( j < 5 ) ; j + + ) {
DEBUG ( 0 , ( " %-15s " , commands [ i ] . name ) ) ;
i + + ;
}
DEBUG ( 0 , ( " \n " ) ) ;
}
1996-05-04 07:50:46 +00:00
}
}
/****************************************************************************
wait for keyboard activity , swallowing network packets
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void wait_keyboard ( void )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fd_set fds ;
struct timeval timeout ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
while ( 1 ) {
FD_ZERO ( & fds ) ;
FD_SET ( cli - > fd , & fds ) ;
FD_SET ( fileno ( stdin ) , & fds ) ;
timeout . tv_sec = 20 ;
timeout . tv_usec = 0 ;
sys_select ( MAX ( cli - > fd , fileno ( stdin ) ) + 1 , & fds , & timeout ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( FD_ISSET ( fileno ( stdin ) , & fds ) )
return ;
/* We deliberately use receive_smb instead of
client_receive_smb as we want to receive
session keepalives and then drop them here .
*/
if ( FD_ISSET ( cli - > fd , & fds ) )
receive_smb ( cli - > fd , cli - > inbuf , 0 ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
cli_chkpath ( cli , " \\ " ) ;
}
1996-05-04 07:50:46 +00:00
}
1998-09-27 20:38:06 +00:00
1998-09-18 12:47:46 +00:00
/****************************************************************************
1998-11-09 03:45:49 +00:00
process a - c command string
1998-09-18 12:47:46 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 03:45:49 +00:00
static void process_command_string ( char * cmd )
1998-09-18 12:47:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring line ;
char * ptr ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
while ( cmd [ 0 ] ! = ' \0 ' ) {
char * p ;
fstring tok ;
int i ;
if ( ( p = strchr ( cmd , ' ; ' ) ) = = 0 ) {
strncpy ( line , cmd , 999 ) ;
line [ 1000 ] = ' \0 ' ;
cmd + = strlen ( cmd ) ;
} else {
if ( p - cmd > 999 ) p = cmd + 999 ;
strncpy ( line , cmd , p - cmd ) ;
line [ p - cmd ] = ' \0 ' ;
cmd = p + 1 ;
}
/* input language code to internal one */
CNV_INPUT ( line ) ;
/* and get the first part of the command */
ptr = line ;
if ( ! next_token ( & ptr , tok , NULL , sizeof ( tok ) ) ) continue ;
if ( ( i = process_tok ( tok ) ) > = 0 ) {
commands [ i ] . fn ( ) ;
} else if ( i = = - 2 ) {
DEBUG ( 0 , ( " %s: command abbreviation ambiguous \n " , CNV_LANG ( tok ) ) ) ;
} else {
DEBUG ( 0 , ( " %s: command not found \n " , CNV_LANG ( tok ) ) ) ;
}
}
}
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
/****************************************************************************
process commands on stdin
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void process_stdin ( void )
1998-09-18 12:47:46 +00:00
{
1998-11-09 03:45:49 +00:00
pstring line ;
char * ptr ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
while ( ! feof ( stdin ) ) {
fstring tok ;
int i ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
/* display a prompt */
DEBUG ( 0 , ( " smb: %s> " , CNV_LANG ( cur_dir ) ) ) ;
dbgflush ( ) ;
wait_keyboard ( ) ;
/* and get a response */
if ( ! fgets ( line , 1000 , stdin ) )
break ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
/* input language code to internal one */
CNV_INPUT ( line ) ;
/* special case - first char is ! */
if ( * line = = ' ! ' ) {
system ( line + 1 ) ;
continue ;
}
/* and get the first part of the command */
ptr = line ;
if ( ! next_token ( & ptr , tok , NULL , sizeof ( tok ) ) ) continue ;
if ( ( i = process_tok ( tok ) ) > = 0 ) {
commands [ i ] . fn ( ) ;
} else if ( i = = - 2 ) {
DEBUG ( 0 , ( " %s: command abbreviation ambiguous \n " , CNV_LANG ( tok ) ) ) ;
} else {
DEBUG ( 0 , ( " %s: command not found \n " , CNV_LANG ( tok ) ) ) ;
}
}
1998-09-18 12:47:46 +00:00
}
1998-11-09 03:45:49 +00:00
/*****************************************************
return a connection to a server
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct cli_state * do_connect ( char * server , char * share )
1998-09-18 12:47:46 +00:00
{
1998-11-09 03:45:49 +00:00
struct cli_state * c ;
struct nmb_name called , calling ;
char * server_n ;
struct in_addr ip ;
extern struct in_addr ipzero ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( * share = = ' \\ ' ) {
server = share + 2 ;
share = strchr ( server , ' \\ ' ) ;
if ( ! share ) return NULL ;
* share = 0 ;
share + + ;
}
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
server_n = server ;
ip = ipzero ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
make_nmb_name ( & calling , global_myname , 0x0 , " " ) ;
make_nmb_name ( & called , server , name_type , " " ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
again :
ip = ipzero ;
if ( have_ip ) ip = dest_ip ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
/* have to open a new connection */
if ( ! ( c = cli_initialise ( NULL ) ) | | ! cli_connect ( c , server_n , & ip ) ) {
DEBUG ( 0 , ( " Connection to %s failed \n " , server_n ) ) ;
return NULL ;
}
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_session_request ( c , & calling , & called ) ) {
DEBUG ( 0 , ( " session request to %s failed \n " , called . name ) ) ;
cli_shutdown ( c ) ;
if ( strcmp ( called . name , " *SMBSERVER " ) ) {
make_nmb_name ( & called , " *SMBSERVER " , 0x20 , " " ) ;
goto again ;
}
return NULL ;
}
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 4 , ( " session request ok \n " ) ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_negprot ( c ) ) {
DEBUG ( 0 , ( " protocol negotiation failed \n " ) ) ;
cli_shutdown ( c ) ;
return NULL ;
}
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! got_pass ) {
char * pass = getpass ( " Password: " ) ;
if ( pass ) {
pstrcpy ( password , pass ) ;
}
}
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_session_setup ( c , username ,
password , strlen ( password ) ,
password , strlen ( password ) ,
workgroup ) ) {
DEBUG ( 0 , ( " session setup failed: %s \n " , cli_errstr ( c ) ) ) ;
return NULL ;
}
1998-09-18 12:47:46 +00:00
1998-11-12 22:17:51 +00:00
/*
* These next two lines are needed to emulate
* old client behaviour for people who have
* scripts based on client output .
* QUESTION ? Do we want to have a ' client compatibility
* mode to turn these on / off ? JRA .
*/
1998-11-12 23:10:48 +00:00
if ( * c - > server_domain | | * c - > server_os | | * c - > server_type )
1998-11-12 22:17:51 +00:00
DEBUG ( 1 , ( " Domain=[%s] OS=[%s] Server=[%s] \n " ,
1998-11-12 23:10:48 +00:00
c - > server_domain , c - > server_os , c - > server_type ) ) ;
1998-11-12 22:17:51 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 4 , ( " session setup ok \n " ) ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! cli_send_tconX ( c , share , " ????? " ,
password , strlen ( password ) + 1 ) ) {
DEBUG ( 0 , ( " tree connect failed: %s \n " , cli_errstr ( c ) ) ) ;
cli_shutdown ( c ) ;
return NULL ;
1998-09-18 12:47:46 +00:00
}
1998-11-09 03:45:49 +00:00
DEBUG ( 4 , ( " tconx ok \n " ) ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
return c ;
1998-09-18 12:47:46 +00:00
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
process commands from the client
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1996-06-04 06:42:03 +00:00
static BOOL process ( char * base_directory )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
cli = do_connect ( desthost , service ) ;
if ( ! cli ) {
return ( False ) ;
1996-05-31 15:13:29 +00:00
}
1998-11-12 22:17:51 +00:00
1998-11-09 03:45:49 +00:00
if ( * base_directory ) do_cd ( base_directory ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( cmdstr ) {
process_command_string ( cmdstr ) ;
} else {
process_stdin ( ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
cli_shutdown ( cli ) ;
return ( True ) ;
1996-05-04 07:50:46 +00:00
}
/****************************************************************************
usage on the program
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1996-06-04 06:42:03 +00:00
static void usage ( char * pname )
1996-05-04 07:50:46 +00:00
{
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " Usage: %s service <password> " , pname ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \n Version %s \n " , VERSION ) ) ;
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " \t -s smb.conf pathname to smb.conf file \n " ) ) ;
DEBUG ( 0 , ( " \t -B IP addr broadcast IP address to use \n " ) ) ;
DEBUG ( 0 , ( " \t -O socket_options socket options to use \n " ) ) ;
DEBUG ( 0 , ( " \t -R name resolve order use these name resolution services only \n " ) ) ;
DEBUG ( 0 , ( " \t -M host send a winpopup message to the host \n " ) ) ;
DEBUG ( 0 , ( " \t -i scope use this NetBIOS scope \n " ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \t -N don't ask for a password \n " ) ) ;
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " \t -n netbios name. Use this name as my netbios name \n " ) ) ;
DEBUG ( 0 , ( " \t -d debuglevel set the debuglevel \n " ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \t -P connect to service as a printer \n " ) ) ;
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " \t -p port connect to the specified port \n " ) ) ;
DEBUG ( 0 , ( " \t -l log basename. Basename for log/debug files \n " ) ) ;
DEBUG ( 0 , ( " \t -h Print this help message. \n " ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \t -I dest IP use this IP to connect to \n " ) ) ;
DEBUG ( 0 , ( " \t -E write messages to stderr instead of stdout \n " ) ) ;
DEBUG ( 0 , ( " \t -U username set the network username \n " ) ) ;
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " \t -L host get a list of shares available on a host \n " ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \t -t terminal code terminal i/o code {sjis|euc|jis7|jis8|junet|hex} \n " ) ) ;
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " \t -m max protocol set the max protocol level \n " ) ) ;
DEBUG ( 0 , ( " \t -W workgroup set the workgroup name \n " ) ) ;
1998-10-04 07:09:38 +00:00
DEBUG ( 0 , ( " \t -T<c|x>IXFqgbNan command line tar \n " ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \t -D directory start from directory \n " ) ) ;
1998-10-29 02:18:17 +00:00
DEBUG ( 0 , ( " \t -c command string execute semicolon separated commands \n " ) ) ;
1996-05-04 07:50:46 +00:00
DEBUG ( 0 , ( " \n " ) ) ;
}
1998-11-09 03:45:49 +00:00
/****************************************************************************
get a password from a a file or file descriptor
exit on failure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void get_password_file ( void )
{
int fd = - 1 ;
char * p ;
BOOL close_it = False ;
pstring spec ;
char pass [ 128 ] ;
if ( ( p = getenv ( " PASSWD_FD " ) ) ! = NULL ) {
pstrcpy ( spec , " descriptor " ) ;
pstrcat ( spec , p ) ;
sscanf ( p , " %d " , & fd ) ;
close_it = False ;
} else if ( ( p = getenv ( " PASSWD_FILE " ) ) ! = NULL ) {
1998-11-17 20:50:07 +00:00
fd = sys_open ( p , O_RDONLY , 0 ) ;
1998-11-09 03:45:49 +00:00
pstrcpy ( spec , p ) ;
if ( fd < 0 ) {
fprintf ( stderr , " Error opening PASSWD_FILE %s: %s \n " ,
spec , strerror ( errno ) ) ;
exit ( 1 ) ;
}
close_it = True ;
}
for ( p = pass , * p = ' \0 ' ; /* ensure that pass is null-terminated */
p & & p - pass < sizeof ( pass ) ; ) {
switch ( read ( fd , p , 1 ) ) {
case 1 :
if ( * p ! = ' \n ' & & * p ! = ' \0 ' ) {
* + + p = ' \0 ' ; /* advance p, and null-terminate pass */
break ;
}
case 0 :
if ( p - pass ) {
* p = ' \0 ' ; /* null-terminate it, just in case... */
p = NULL ; /* then force the loop condition to become false */
break ;
} else {
fprintf ( stderr , " Error reading password from file %s: %s \n " ,
spec , " empty password \n " ) ;
exit ( 1 ) ;
}
default :
fprintf ( stderr , " Error reading password from file %s: %s \n " ,
spec , strerror ( errno ) ) ;
exit ( 1 ) ;
}
}
pstrcpy ( password , pass ) ;
if ( close_it )
close ( fd ) ;
}
/****************************************************************************
handle a - L query
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int do_host_query ( char * query_host , int port )
{
cli = do_connect ( query_host , " IPC$ " ) ;
1998-11-17 01:44:25 +00:00
if ( ! cli )
return 1 ;
1998-11-09 03:45:49 +00:00
browse_host ( True ) ;
list_servers ( workgroup ) ;
cli_shutdown ( cli ) ;
return ( 0 ) ;
}
/****************************************************************************
handle a tar operation
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int do_tar_op ( int port , char * base_directory )
{
int ret ;
cli = do_connect ( desthost , service ) ;
1998-11-17 01:44:25 +00:00
if ( ! cli )
return 1 ;
1998-11-09 03:45:49 +00:00
recurse = True ;
if ( * base_directory ) do_cd ( base_directory ) ;
ret = process_tar ( ) ;
cli_shutdown ( cli ) ;
return ( ret ) ;
}
/****************************************************************************
handle a message operation
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int do_message_op ( void )
{
struct in_addr ip ;
struct nmb_name called , calling ;
ip = ipzero ;
make_nmb_name ( & calling , global_myname , 0x0 , " " ) ;
make_nmb_name ( & called , desthost , name_type , " " ) ;
ip = ipzero ;
if ( have_ip ) ip = dest_ip ;
if ( ! ( cli = cli_initialise ( NULL ) ) | | ! cli_connect ( cli , desthost , & ip ) ) {
DEBUG ( 0 , ( " Connection to %s failed \n " , desthost ) ) ;
return 1 ;
}
if ( ! cli_session_request ( cli , & calling , & called ) ) {
DEBUG ( 0 , ( " session request failed \n " ) ) ;
cli_shutdown ( cli ) ;
return 1 ;
}
send_message ( ) ;
cli_shutdown ( cli ) ;
return 0 ;
}
1996-05-04 07:50:46 +00:00
/****************************************************************************
main program
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1996-06-04 06:42:03 +00:00
int main ( int argc , char * argv [ ] )
1996-05-04 07:50:46 +00:00
{
1998-11-09 03:45:49 +00:00
fstring base_directory ;
char * pname = argv [ 0 ] ;
int port = SMB_PORT ;
int opt ;
extern FILE * dbf ;
extern char * optarg ;
extern int optind ;
pstring query_host ;
BOOL message = False ;
BOOL explicit_user = False ;
extern char tar_type ;
static pstring servicesf = CONFIGFILE ;
pstring term_code ;
pstring new_name_resolve_order ;
char * p ;
1997-09-11 20:17:32 +00:00
# ifdef KANJI
1998-11-09 03:45:49 +00:00
pstrcpy ( term_code , KANJI ) ;
1997-09-11 20:17:32 +00:00
# else /* KANJI */
1998-11-09 03:45:49 +00:00
* term_code = 0 ;
1997-09-11 20:17:32 +00:00
# endif /* KANJI */
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
* query_host = 0 ;
* base_directory = 0 ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
* new_name_resolve_order = 0 ;
1998-03-16 20:59:47 +00:00
1998-11-09 03:45:49 +00:00
DEBUGLEVEL = 2 ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
setup_logging ( pname , True ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
TimeInit ( ) ;
charset_initialise ( ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! get_myname ( myhostname , NULL ) ) {
DEBUG ( 0 , ( " Failed to get my hostname. \n " ) ) ;
}
1998-09-29 04:43:40 +00:00
1998-11-09 03:45:49 +00:00
in_client = True ; /* Make sure that we tell lp_load we are */
1998-06-15 22:02:14 +00:00
1998-11-09 03:45:49 +00:00
if ( ! lp_load ( servicesf , True , False , False ) ) {
fprintf ( stderr , " Can't load %s - run testparm to debug it \n " , servicesf ) ;
}
codepage_initialise ( lp_client_code_page ( ) ) ;
1998-06-15 22:02:14 +00:00
1998-11-09 03:45:49 +00:00
interpret_coding_system ( term_code ) ;
1998-06-15 22:02:14 +00:00
1998-07-29 03:08:05 +00:00
# ifdef WITH_SSL
1998-11-09 03:45:49 +00:00
sslutil_init ( 0 ) ;
1998-06-16 01:35:52 +00:00
# endif
1998-11-09 03:45:49 +00:00
pstrcpy ( workgroup , lp_workgroup ( ) ) ;
1998-09-21 08:45:11 +00:00
1998-11-09 03:45:49 +00:00
load_interfaces ( ) ;
myumask = umask ( 0 ) ;
umask ( myumask ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( getenv ( " USER " ) ) {
pstrcpy ( username , getenv ( " USER " ) ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
/* modification to support userid%passwd syntax in the USER var
25. Aug .97 , jdblair @ uab . edu */
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ( p = strchr ( username , ' % ' ) ) ) {
* p = 0 ;
pstrcpy ( password , p + 1 ) ;
got_pass = True ;
memset ( strchr ( getenv ( " USER " ) , ' % ' ) + 1 , ' X ' , strlen ( password ) ) ;
}
strupper ( username ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
/* modification to support PASSWD environmental var
25. Aug .97 , jdblair @ uab . edu */
if ( getenv ( " PASSWD " ) ) {
pstrcpy ( password , getenv ( " PASSWD " ) ) ;
got_pass = True ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( getenv ( " PASSWD_FD " ) | | getenv ( " PASSWD_FILE " ) ) {
get_password_file ( ) ;
1998-10-29 02:18:17 +00:00
got_pass = True ;
1998-11-09 03:45:49 +00:00
}
if ( * username = = 0 & & getenv ( " LOGNAME " ) ) {
pstrcpy ( username , getenv ( " LOGNAME " ) ) ;
strupper ( username ) ;
}
if ( * username = = 0 ) {
pstrcpy ( username , " GUEST " ) ;
}
if ( argc < 2 ) {
1998-10-29 02:18:17 +00:00
usage ( pname ) ;
1998-11-09 03:45:49 +00:00
exit ( 1 ) ;
}
if ( * argv [ 1 ] ! = ' - ' ) {
pstrcpy ( service , argv [ 1 ] ) ;
/* Convert any '/' characters in the service name to '\' characters */
string_replace ( service , ' / ' , ' \\ ' ) ;
argc - - ;
argv + + ;
if ( count_chars ( service , ' \\ ' ) < 3 ) {
usage ( pname ) ;
printf ( " \n %s: Not enough ' \\ ' characters in service \n " , service ) ;
exit ( 1 ) ;
1998-10-29 02:18:17 +00:00
}
1998-11-09 03:45:49 +00:00
if ( argc > 1 & & ( * argv [ 1 ] ! = ' - ' ) ) {
got_pass = True ;
pstrcpy ( password , argv [ 1 ] ) ;
memset ( argv [ 1 ] , ' X ' , strlen ( argv [ 1 ] ) ) ;
argc - - ;
argv + + ;
}
}
while ( ( opt =
getopt ( argc , argv , " s:B:O:R:M:i:Nn:d:Pp:l:hI:EU:L:t:m:W:T:D:c: " ) ) ! = EOF ) {
switch ( opt ) {
case ' s ' :
pstrcpy ( servicesf , optarg ) ;
break ;
case ' B ' :
iface_set_default ( NULL , optarg , NULL ) ;
break ;
case ' O ' :
pstrcpy ( user_socket_options , optarg ) ;
break ;
case ' R ' :
pstrcpy ( new_name_resolve_order , optarg ) ;
break ;
case ' M ' :
name_type = 0x03 ; /* messages are sent to NetBIOS name type 0x3 */
pstrcpy ( desthost , optarg ) ;
message = True ;
break ;
case ' i ' :
pstrcpy ( scope , optarg ) ;
break ;
case ' N ' :
got_pass = True ;
break ;
case ' n ' :
pstrcpy ( global_myname , optarg ) ;
break ;
case ' d ' :
if ( * optarg = = ' A ' )
DEBUGLEVEL = 10000 ;
else
DEBUGLEVEL = atoi ( optarg ) ;
break ;
case ' P ' :
/* not needed anymore */
break ;
case ' p ' :
port = atoi ( optarg ) ;
break ;
case ' l ' :
slprintf ( debugf , sizeof ( debugf ) - 1 , " %s.client " , optarg ) ;
break ;
case ' h ' :
usage ( pname ) ;
exit ( 0 ) ;
break ;
case ' I ' :
1998-10-29 02:18:17 +00:00
{
1998-11-09 03:45:49 +00:00
dest_ip = * interpret_addr2 ( optarg ) ;
if ( zero_ip ( dest_ip ) )
exit ( 1 ) ;
have_ip = True ;
1998-10-29 02:18:17 +00:00
}
1998-11-09 03:45:49 +00:00
break ;
case ' E ' :
dbf = stderr ;
break ;
case ' U ' :
{
char * lp ;
explicit_user = True ;
pstrcpy ( username , optarg ) ;
if ( ( lp = strchr ( username , ' % ' ) ) ) {
* lp = 0 ;
pstrcpy ( password , lp + 1 ) ;
got_pass = True ;
memset ( strchr ( optarg , ' % ' ) + 1 , ' X ' , strlen ( password ) ) ;
}
}
break ;
case ' L ' :
pstrcpy ( query_host , optarg ) ;
if ( ! explicit_user )
* username = ' \0 ' ;
break ;
case ' t ' :
pstrcpy ( term_code , optarg ) ;
break ;
case ' m ' :
/* no longer supported */
break ;
case ' W ' :
pstrcpy ( workgroup , optarg ) ;
break ;
case ' T ' :
if ( ! tar_parseargs ( argc , argv , optarg , optind ) ) {
usage ( pname ) ;
exit ( 1 ) ;
}
break ;
case ' D ' :
pstrcpy ( base_directory , optarg ) ;
break ;
case ' c ' :
cmdstr = optarg ;
got_pass = True ;
break ;
default :
1998-10-29 02:18:17 +00:00
usage ( pname ) ;
exit ( 1 ) ;
}
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
get_myname ( ( * global_myname ) ? NULL : global_myname , NULL ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( * new_name_resolve_order )
lp_set_name_resolve_order ( new_name_resolve_order ) ;
1998-09-18 12:47:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ! tar_type & & ! * query_host & & ! * service & & ! message ) {
usage ( pname ) ;
exit ( 1 ) ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
DEBUG ( 3 , ( " Client started (version %s). \n " , VERSION ) ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( tar_type ) {
return do_tar_op ( port , base_directory ) ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( ( p = strchr ( query_host , ' # ' ) ) ) {
* p = 0 ;
p + + ;
sscanf ( p , " %x " , & name_type ) ;
}
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
if ( * query_host ) {
return do_host_query ( query_host , port ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( message ) {
return do_message_op ( ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
if ( ! process ( base_directory ) ) {
close_sockets ( ) ;
return ( 1 ) ;
1996-05-04 07:50:46 +00:00
}
1998-11-09 03:45:49 +00:00
close_sockets ( ) ;
1996-05-04 07:50:46 +00:00
1998-11-09 03:45:49 +00:00
return ( 0 ) ;
1996-05-04 07:50:46 +00:00
}