1997-10-21 13:12:41 +04:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
SMB client generic functions
1999-12-13 16:27:58 +03:00
Copyright ( C ) Andrew Tridgell 1994 - 1998
1997-10-21 13:12:41 +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 .
*/
1998-07-29 07:08:05 +04:00
# define NO_SYSLOG
1997-10-21 13:12:41 +04:00
# include "includes.h"
1997-11-23 08:55:44 +03:00
# include "trans2.h"
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
1997-10-21 13:12:41 +04:00
extern int DEBUGLEVEL ;
1999-12-13 16:27:58 +03:00
extern pstring user_socket_options ;
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
static void cli_process_oplock ( struct cli_state * cli ) ;
1999-01-25 04:46:14 +03:00
1999-12-13 16:27:58 +03:00
/*
* Change the port number used to call on
*/
1999-01-25 04:46:14 +03:00
int cli_set_port ( struct cli_state * cli , int port )
{
1999-12-13 16:27:58 +03:00
if ( port > 0 )
1999-08-03 21:43:12 +04:00
cli - > port = port ;
1999-01-25 04:46:14 +03:00
1999-12-13 16:27:58 +03:00
return cli - > port ;
1999-01-25 04:46:14 +03:00
}
1998-10-19 06:48:57 +04:00
1999-10-08 02:10:29 +04:00
/****************************************************************************
1999-12-13 16:27:58 +03:00
recv an smb
1999-10-08 02:10:29 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static BOOL cli_receive_smb ( struct cli_state * cli )
1999-10-08 02:10:29 +04:00
{
1999-12-13 16:27:58 +03:00
BOOL ret ;
again :
ret = client_receive_smb ( cli - > fd , cli - > inbuf , cli - > timeout ) ;
if ( ret ) {
/* it might be an oplock break request */
if ( CVAL ( cli - > inbuf , smb_com ) = = SMBlockingX & &
SVAL ( cli - > inbuf , smb_vwv6 ) = = 0 & &
SVAL ( cli - > inbuf , smb_vwv7 ) = = 0 ) {
if ( cli - > use_oplocks ) cli_process_oplock ( cli ) ;
/* try to prevent loops */
CVAL ( cli - > inbuf , smb_com ) = 0xFF ;
goto again ;
1999-10-08 02:10:29 +04:00
}
}
1999-12-13 16:27:58 +03:00
return ret ;
1998-11-09 06:45:49 +03:00
}
1998-10-19 06:48:57 +04:00
/****************************************************************************
send an smb to a fd and re - establish if necessary
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static BOOL cli_send_smb ( struct cli_state * cli )
1998-10-19 06:48:57 +04:00
{
size_t len ;
size_t nwritten = 0 ;
ssize_t ret ;
BOOL reestablished = False ;
1999-08-19 00:10:12 +04:00
len = smb_len ( cli - > outbuf ) + 4 ;
1998-10-19 06:48:57 +04:00
while ( nwritten < len ) {
ret = write_socket ( cli - > fd , cli - > outbuf + nwritten , len - nwritten ) ;
1999-12-13 16:27:58 +03:00
if ( ret < = 0 & & errno = = EPIPE & & ! reestablished ) {
1998-10-19 06:48:57 +04:00
if ( cli_reestablish_connection ( cli ) ) {
reestablished = True ;
nwritten = 0 ;
continue ;
}
}
if ( ret < = 0 ) {
DEBUG ( 0 , ( " Error writing %d bytes to client. %d. Exiting \n " ,
1999-12-13 16:27:58 +03:00
( int ) len , ( int ) ret ) ) ;
close_sockets ( ) ;
exit ( 1 ) ;
1998-10-19 06:48:57 +04:00
}
nwritten + = ret ;
}
return True ;
}
1999-12-13 16:27:58 +03:00
/****************************************************************************
setup basics in a outgoing packet
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void cli_setup_packet ( struct cli_state * cli )
{
cli - > rap_error = 0 ;
cli - > nt_error = 0 ;
SSVAL ( cli - > outbuf , smb_pid , cli - > pid ) ;
SSVAL ( cli - > outbuf , smb_uid , cli - > vuid ) ;
SSVAL ( cli - > outbuf , smb_mid , cli - > mid ) ;
if ( cli - > protocol > PROTOCOL_CORE ) {
SCVAL ( cli - > outbuf , smb_flg , 0x8 ) ;
SSVAL ( cli - > outbuf , smb_flg2 , 0x1 ) ;
}
1999-06-24 22:58:08 +04:00
}
1999-12-13 16:27:58 +03:00
1999-06-24 22:58:08 +04:00
/****************************************************************************
1999-12-13 16:27:58 +03:00
process an oplock break request from the server
1999-06-24 22:58:08 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static void cli_process_oplock ( struct cli_state * cli )
1999-06-24 22:58:08 +04:00
{
1999-12-13 16:27:58 +03:00
char * oldbuf = cli - > outbuf ;
pstring buf ;
int fnum ;
fnum = SVAL ( cli - > inbuf , smb_vwv2 ) ;
/* damn, we really need to keep a record of open files so we
can detect a oplock break and a close crossing on the
wire . for now this swallows the errors */
if ( fnum = = 0 ) return ;
cli - > outbuf = buf ;
memset ( buf , ' \0 ' , smb_size ) ;
set_message ( buf , 8 , 0 , True ) ;
CVAL ( buf , smb_com ) = SMBlockingX ;
SSVAL ( buf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( buf , smb_vwv0 , 0xFF ) ;
SSVAL ( buf , smb_vwv1 , 0 ) ;
SSVAL ( buf , smb_vwv2 , fnum ) ;
SSVAL ( buf , smb_vwv3 , 2 ) ; /* oplock break ack */
SIVAL ( buf , smb_vwv4 , 0 ) ; /* timoeut */
SSVAL ( buf , smb_vwv6 , 0 ) ; /* unlockcount */
SSVAL ( buf , smb_vwv7 , 0 ) ; /* lockcount */
cli_send_smb ( cli ) ;
cli - > outbuf = oldbuf ;
1999-06-24 22:58:08 +04:00
}
1999-12-13 16:27:58 +03:00
1998-04-24 00:12:17 +04:00
/*****************************************************
RAP error codes - a small start but will be extended .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct
{
int err ;
char * message ;
} rap_errmap [ ] =
{
{ 5 , " User has insufficient privilege " } ,
{ 86 , " The specified password is invalid " } ,
{ 2226 , " Operation only permitted on a Primary Domain Controller " } ,
{ 2242 , " The password of this user has expired. " } ,
{ 2243 , " The password of this user cannot change. " } ,
{ 2244 , " This password cannot be used now (password history conflict). " } ,
{ 2245 , " The password is shorter than required. " } ,
{ 2246 , " The password of this user is too recent to change. " } ,
1999-12-13 16:27:58 +03:00
/* these really shouldn't be here ... */
{ 0x80 , " Not listening on called name " } ,
{ 0x81 , " Not listening for calling name " } ,
{ 0x82 , " Called name not present " } ,
{ 0x83 , " Called name present, but insufficient resources " } ,
1998-04-24 00:12:17 +04:00
{ 0 , NULL }
} ;
/****************************************************************************
1999-12-13 16:27:58 +03:00
return a description of an SMB error
1998-04-24 00:12:17 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static char * cli_smb_errstr ( struct cli_state * cli )
1998-04-24 00:12:17 +04:00
{
1999-12-13 16:27:58 +03:00
return smb_errstr ( cli - > inbuf ) ;
1998-04-24 00:12:17 +04:00
}
1999-12-13 16:27:58 +03:00
/******************************************************
Return an error message - either an SMB error or a RAP
error .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char * cli_errstr ( struct cli_state * cli )
1998-04-24 00:12:17 +04:00
{
1999-12-13 16:27:58 +03:00
static fstring error_message ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
uint8 errclass ;
uint32 errnum ;
1999-12-13 16:27:58 +03:00
uint32 nt_rpc_error ;
int i ;
1998-04-24 00:12:17 +04:00
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
/*
* Errors are of three kinds - smb errors ,
* dealt with by cli_smb_errstr , NT errors ,
* whose code is in cli . nt_error , and rap
* errors , whose error code is in cli . rap_error .
*/
1998-04-24 02:59:19 +04:00
1999-12-13 16:27:58 +03:00
cli_error ( cli , & errclass , & errnum , & nt_rpc_error ) ;
1998-04-24 02:59:19 +04:00
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( errclass ! = 0 )
{
1999-12-13 16:27:58 +03:00
return cli_smb_errstr ( cli ) ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
}
1998-04-24 02:59:19 +04:00
1999-12-13 16:27:58 +03:00
/*
* Was it an NT error ?
*/
if ( nt_rpc_error )
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
{
1999-12-13 16:27:58 +03:00
char * nt_msg = get_nt_error_msg ( nt_rpc_error ) ;
if ( nt_msg = = NULL )
{
slprintf ( error_message , sizeof ( fstring ) - 1 , " NT code %d " , nt_rpc_error ) ;
}
else
{
fstrcpy ( error_message , nt_msg ) ;
}
return error_message ;
1999-06-24 22:58:08 +04:00
}
1999-10-08 02:10:29 +04:00
1999-12-13 16:27:58 +03:00
/*
* Must have been a rap error .
*/
1999-10-08 02:10:29 +04:00
1999-12-13 16:27:58 +03:00
slprintf ( error_message , sizeof ( error_message ) - 1 , " code %d " , cli - > rap_error ) ;
for ( i = 0 ; rap_errmap [ i ] . message ! = NULL ; i + + )
1999-10-08 02:10:29 +04:00
{
1999-12-13 16:27:58 +03:00
if ( rap_errmap [ i ] . err = = cli - > rap_error )
{
fstrcpy ( error_message , rap_errmap [ i ] . message ) ;
break ;
}
}
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
return error_message ;
}
1997-10-21 13:12:41 +04:00
1998-10-04 13:42:51 +04:00
/*****************************************************************************
Convert a character pointer in a cli_call_api ( ) response to a form we can use .
This function contains code to prevent core dumps if the server returns
invalid data .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static char * fix_char_ptr ( unsigned int datap , unsigned int converter ,
char * rdata , int rdrcnt )
{
if ( datap = = 0 ) { /* turn NULL pointers into zero length strings */
return " " ;
} else {
unsigned int offset = datap - converter ;
if ( offset > = rdrcnt ) {
DEBUG ( 1 , ( " bad char ptr: datap=%u, converter=%u rdrcnt=%d> " ,
datap , converter , rdrcnt ) ) ;
return " <ERROR> " ;
} else {
return & rdata [ offset ] ;
}
}
}
1997-10-21 13:12:41 +04:00
/****************************************************************************
send a SMB trans or trans2 request
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static BOOL cli_send_trans ( struct cli_state * cli , int trans ,
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
char * name , int pipe_name_len ,
int fid , int flags ,
uint16 * setup , int lsetup , int msetup ,
char * param , int lparam , int mparam ,
char * data , int ldata , int mdata )
1997-10-21 13:12:41 +04:00
{
int i ;
int this_ldata , this_lparam ;
int tot_data = 0 , tot_param = 0 ;
char * outdata , * outparam ;
char * p ;
1997-11-23 08:55:44 +03:00
this_lparam = MIN ( lparam , cli - > max_xmit - ( 500 + lsetup * 2 ) ) ; /* hack */
this_ldata = MIN ( ldata , cli - > max_xmit - ( 500 + lsetup * 2 + this_lparam ) ) ;
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1997-10-21 13:12:41 +04:00
set_message ( cli - > outbuf , 14 + lsetup , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = trans ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
1997-10-23 23:27:53 +04:00
cli_setup_packet ( cli ) ;
1997-10-21 13:12:41 +04:00
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
outparam = smb_buf ( cli - > outbuf ) + ( trans = = SMBtrans ? pipe_name_len + 1 : 3 ) ;
1997-10-21 13:12:41 +04:00
outdata = outparam + this_lparam ;
/* primary request */
SSVAL ( cli - > outbuf , smb_tpscnt , lparam ) ; /* tpscnt */
SSVAL ( cli - > outbuf , smb_tdscnt , ldata ) ; /* tdscnt */
SSVAL ( cli - > outbuf , smb_mprcnt , mparam ) ; /* mprcnt */
SSVAL ( cli - > outbuf , smb_mdrcnt , mdata ) ; /* mdrcnt */
SCVAL ( cli - > outbuf , smb_msrcnt , msetup ) ; /* msrcnt */
SSVAL ( cli - > outbuf , smb_flags , flags ) ; /* flags */
SIVAL ( cli - > outbuf , smb_timeout , 0 ) ; /* timeout */
SSVAL ( cli - > outbuf , smb_pscnt , this_lparam ) ; /* pscnt */
SSVAL ( cli - > outbuf , smb_psoff , smb_offset ( outparam , cli - > outbuf ) ) ; /* psoff */
SSVAL ( cli - > outbuf , smb_dscnt , this_ldata ) ; /* dscnt */
SSVAL ( cli - > outbuf , smb_dsoff , smb_offset ( outdata , cli - > outbuf ) ) ; /* dsoff */
SCVAL ( cli - > outbuf , smb_suwcnt , lsetup ) ; /* suwcnt */
for ( i = 0 ; i < lsetup ; i + + ) /* setup[] */
1997-11-23 08:55:44 +03:00
SSVAL ( cli - > outbuf , smb_setup + i * 2 , setup [ i ] ) ;
1997-10-21 13:12:41 +04:00
p = smb_buf ( cli - > outbuf ) ;
if ( trans = = SMBtrans ) {
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
memcpy ( p , name , pipe_name_len + 1 ) ; /* name[] */
1997-10-21 13:12:41 +04:00
} else {
* p + + = 0 ; /* put in a null smb_name */
* p + + = ' D ' ; * p + + = ' ' ; /* observed in OS/2 */
}
if ( this_lparam ) /* param[] */
memcpy ( outparam , param , this_lparam ) ;
if ( this_ldata ) /* data[] */
memcpy ( outdata , data , this_ldata ) ;
set_message ( cli - > outbuf , 14 + lsetup , /* wcnt, bcc */
PTR_DIFF ( outdata + this_ldata , smb_buf ( cli - > outbuf ) ) , False ) ;
1999-12-13 16:27:58 +03:00
show_msg ( cli - > outbuf ) ;
cli_send_smb ( cli ) ;
1997-10-21 13:12:41 +04:00
if ( this_ldata < ldata | | this_lparam < lparam ) {
/* receive interim response */
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) | |
1997-11-10 22:23:17 +03:00
CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
1997-10-21 13:12:41 +04:00
return ( False ) ;
}
tot_data = this_ldata ;
tot_param = this_lparam ;
while ( tot_data < ldata | | tot_param < lparam ) {
this_lparam = MIN ( lparam - tot_param , cli - > max_xmit - 500 ) ; /* hack */
this_ldata = MIN ( ldata - tot_data , cli - > max_xmit - ( 500 + this_lparam ) ) ;
set_message ( cli - > outbuf , trans = = SMBtrans ? 8 : 9 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = trans = = SMBtrans ? SMBtranss : SMBtranss2 ;
outparam = smb_buf ( cli - > outbuf ) ;
outdata = outparam + this_lparam ;
/* secondary request */
SSVAL ( cli - > outbuf , smb_tpscnt , lparam ) ; /* tpscnt */
SSVAL ( cli - > outbuf , smb_tdscnt , ldata ) ; /* tdscnt */
SSVAL ( cli - > outbuf , smb_spscnt , this_lparam ) ; /* pscnt */
SSVAL ( cli - > outbuf , smb_spsoff , smb_offset ( outparam , cli - > outbuf ) ) ; /* psoff */
SSVAL ( cli - > outbuf , smb_spsdisp , tot_param ) ; /* psdisp */
SSVAL ( cli - > outbuf , smb_sdscnt , this_ldata ) ; /* dscnt */
SSVAL ( cli - > outbuf , smb_sdsoff , smb_offset ( outdata , cli - > outbuf ) ) ; /* dsoff */
SSVAL ( cli - > outbuf , smb_sdsdisp , tot_data ) ; /* dsdisp */
if ( trans = = SMBtrans2 )
1997-11-23 08:55:44 +03:00
SSVALS ( cli - > outbuf , smb_sfid , fid ) ; /* fid */
1997-10-21 13:12:41 +04:00
if ( this_lparam ) /* param[] */
1999-12-13 16:27:58 +03:00
memcpy ( outparam , param + tot_param , this_lparam ) ;
1997-10-21 13:12:41 +04:00
if ( this_ldata ) /* data[] */
1999-12-13 16:27:58 +03:00
memcpy ( outdata , data + tot_data , this_ldata ) ;
1997-10-21 13:12:41 +04:00
set_message ( cli - > outbuf , trans = = SMBtrans ? 8 : 9 , /* wcnt, bcc */
PTR_DIFF ( outdata + this_ldata , smb_buf ( cli - > outbuf ) ) , False ) ;
1999-12-13 16:27:58 +03:00
show_msg ( cli - > outbuf ) ;
cli_send_smb ( cli ) ;
1997-10-21 13:12:41 +04:00
tot_data + = this_ldata ;
tot_param + = this_lparam ;
}
}
return ( True ) ;
}
/****************************************************************************
receive a SMB trans or trans2 response allocating the necessary memory
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
static BOOL cli_receive_trans ( struct cli_state * cli , int trans ,
char * * param , int * param_len ,
char * * data , int * data_len )
1997-10-21 13:12:41 +04:00
{
int total_data = 0 ;
int total_param = 0 ;
int this_data , this_param ;
1999-12-13 16:27:58 +03:00
uint8 eclass ;
uint32 ecode ;
1997-10-21 13:12:41 +04:00
* data_len = * param_len = 0 ;
1998-10-04 07:27:04 +04:00
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1999-12-13 16:27:58 +03:00
show_msg ( cli - > inbuf ) ;
1997-10-21 13:12:41 +04:00
/* sanity check */
if ( CVAL ( cli - > inbuf , smb_com ) ! = trans ) {
DEBUG ( 0 , ( " Expected %s response, got command 0x%02x \n " ,
trans = = SMBtrans ? " SMBtrans " : " SMBtrans2 " ,
CVAL ( cli - > inbuf , smb_com ) ) ) ;
return ( False ) ;
}
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
1999-12-13 16:27:58 +03:00
/*
* An NT RPC pipe call can return ERRDOS , ERRmoredata
* to a trans call . This is not an error and should not
* be treated as such .
*/
if ( cli_error ( cli , & eclass , & ecode , NULL ) )
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
{
1999-12-13 16:27:58 +03:00
if ( cli - > nt_pipe_fnum = = 0 | | ! ( eclass = = ERRDOS & & ecode = = ERRmoredata ) )
return ( False ) ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
}
1997-10-21 13:12:41 +04:00
/* parse out the lengths */
total_data = SVAL ( cli - > inbuf , smb_tdrcnt ) ;
total_param = SVAL ( cli - > inbuf , smb_tprcnt ) ;
/* allocate it */
* data = Realloc ( * data , total_data ) ;
* param = Realloc ( * param , total_param ) ;
while ( 1 ) {
this_data = SVAL ( cli - > inbuf , smb_drcnt ) ;
this_param = SVAL ( cli - > inbuf , smb_prcnt ) ;
if ( this_data + * data_len > total_data | |
this_param + * param_len > total_param ) {
DEBUG ( 1 , ( " Data overflow in cli_receive_trans \n " ) ) ;
return False ;
}
if ( this_data )
memcpy ( * data + SVAL ( cli - > inbuf , smb_drdisp ) ,
smb_base ( cli - > inbuf ) + SVAL ( cli - > inbuf , smb_droff ) ,
this_data ) ;
if ( this_param )
memcpy ( * param + SVAL ( cli - > inbuf , smb_prdisp ) ,
smb_base ( cli - > inbuf ) + SVAL ( cli - > inbuf , smb_proff ) ,
this_param ) ;
* data_len + = this_data ;
* param_len + = this_param ;
/* parse out the total lengths again - they can shrink! */
total_data = SVAL ( cli - > inbuf , smb_tdrcnt ) ;
total_param = SVAL ( cli - > inbuf , smb_tprcnt ) ;
if ( total_data < = * data_len & & total_param < = * param_len )
break ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1999-12-13 16:27:58 +03:00
show_msg ( cli - > inbuf ) ;
1997-10-21 13:12:41 +04:00
/* sanity check */
if ( CVAL ( cli - > inbuf , smb_com ) ! = trans ) {
DEBUG ( 0 , ( " Expected %s response, got command 0x%02x \n " ,
trans = = SMBtrans ? " SMBtrans " : " SMBtrans2 " ,
CVAL ( cli - > inbuf , smb_com ) ) ) ;
return ( False ) ;
}
1999-12-13 16:27:58 +03:00
if ( cli_error ( cli , & eclass , & ecode , NULL ) )
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
{
1999-12-13 16:27:58 +03:00
if ( cli - > nt_pipe_fnum = = 0 | | ! ( eclass = = ERRDOS & & ecode = = ERRmoredata ) )
return ( False ) ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
}
1997-10-21 13:12:41 +04:00
}
return ( True ) ;
}
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
/****************************************************************************
Call a remote api on an arbitrary pipe . takes param , data and setup buffers .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_api_pipe ( struct cli_state * cli , char * pipe_name , int pipe_name_len ,
uint16 * setup , uint32 setup_count , uint32 max_setup_count ,
char * params , uint32 param_count , uint32 max_param_count ,
char * data , uint32 data_count , uint32 max_data_count ,
char * * rparam , uint32 * rparam_count ,
char * * rdata , uint32 * rdata_count )
{
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( pipe_name_len = = 0 )
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
pipe_name_len = strlen ( pipe_name ) ;
cli_send_trans ( cli , SMBtrans ,
pipe_name , pipe_name_len ,
0 , 0 , /* fid, flags */
setup , setup_count , max_setup_count ,
params , param_count , max_param_count ,
data , data_count , max_data_count ) ;
return ( cli_receive_trans ( cli , SMBtrans ,
1998-05-11 10:38:36 +04:00
rparam , ( int * ) rparam_count ,
rdata , ( int * ) rdata_count ) ) ;
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
}
1997-10-21 13:12:41 +04:00
/****************************************************************************
call a remote api
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-08-25 10:42:09 +04:00
BOOL cli_api ( struct cli_state * cli ,
char * param , int prcnt , int mprcnt ,
char * data , int drcnt , int mdrcnt ,
char * * rparam , int * rprcnt ,
char * * rdata , int * rdrcnt )
1997-10-21 13:12:41 +04:00
{
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
cli_send_trans ( cli , SMBtrans ,
PIPE_LANMAN , strlen ( PIPE_LANMAN ) , /* Name, length */
0 , 0 , /* fid, flags */
NULL , 0 , 0 , /* Setup, length, max */
param , prcnt , mprcnt , /* Params, length, max */
data , drcnt , mdrcnt /* Data, length, max */
) ;
1997-10-21 13:12:41 +04:00
return ( cli_receive_trans ( cli , SMBtrans ,
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
rparam , rprcnt ,
rdata , rdrcnt ) ) ;
1997-10-21 13:12:41 +04:00
}
/****************************************************************************
perform a NetWkstaUserLogon
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_NetWkstaUserLogon ( struct cli_state * cli , char * user , char * workstation )
{
char * rparam = NULL ;
char * rdata = NULL ;
char * p ;
int rdrcnt , rprcnt ;
pstring param ;
memset ( param , 0 , sizeof ( param ) ) ;
/* send a SMBtrans command with api NetWkstaUserLogon */
p = param ;
SSVAL ( p , 0 , 132 ) ; /* api number */
p + = 2 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " OOWb54WrLh " ) ;
1997-10-21 13:12:41 +04:00
p = skip_string ( p , 1 ) ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " WB21BWDWWDDDDDDDzzzD " ) ;
1997-10-21 13:12:41 +04:00
p = skip_string ( p , 1 ) ;
SSVAL ( p , 0 , 1 ) ;
p + = 2 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , user ) ;
1997-10-21 13:12:41 +04:00
strupper ( p ) ;
1998-09-30 00:24:17 +04:00
p + = 21 ;
1998-10-08 10:49:00 +04:00
p + + ;
p + = 15 ;
p + + ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , workstation ) ;
1997-10-21 13:12:41 +04:00
strupper ( p ) ;
p + = 16 ;
1998-10-04 11:51:34 +04:00
SSVAL ( p , 0 , CLI_BUFFER_SIZE ) ;
1997-10-21 13:12:41 +04:00
p + = 2 ;
1998-10-04 11:51:34 +04:00
SSVAL ( p , 0 , CLI_BUFFER_SIZE ) ;
1997-10-21 13:12:41 +04:00
p + = 2 ;
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
if ( cli_api ( cli ,
param , PTR_DIFF ( p , param ) , 1024 , /* param, length, max */
1998-10-04 11:51:34 +04:00
NULL , 0 , CLI_BUFFER_SIZE , /* data, length, max */
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
& rparam , & rprcnt , /* return params, return size */
& rdata , & rdrcnt /* return data, return size */
) ) {
1998-04-24 02:59:19 +04:00
cli - > rap_error = SVAL ( rparam , 0 ) ;
1997-10-21 13:12:41 +04:00
p = rdata ;
1998-04-24 02:59:19 +04:00
if ( cli - > rap_error = = 0 ) {
1997-10-21 13:12:41 +04:00
DEBUG ( 4 , ( " NetWkstaUserLogon success \n " ) ) ;
1999-11-25 01:45:09 +03:00
cli - > privileges = SVAL ( p , 24 ) ;
1997-10-21 13:12:41 +04:00
fstrcpy ( cli - > eff_name , p + 2 ) ;
} else {
1998-04-24 02:59:19 +04:00
DEBUG ( 1 , ( " NetwkstaUserLogon gave error %d \n " , cli - > rap_error ) ) ;
1997-10-21 13:12:41 +04:00
}
}
1998-09-30 00:24:17 +04:00
if ( rparam )
free ( rparam ) ;
if ( rdata )
free ( rdata ) ;
1998-04-24 02:59:19 +04:00
return ( cli - > rap_error = = 0 ) ;
1997-10-21 13:12:41 +04:00
}
1998-04-28 13:53:42 +04:00
/****************************************************************************
call a NetShareEnum - try and browse available connections on a host
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-03 17:12:08 +04:00
BOOL cli_RNetShareEnum ( struct cli_state * cli , void ( * fn ) ( const char * , uint32 , const char * ) )
1998-04-28 13:53:42 +04:00
{
char * rparam = NULL ;
char * rdata = NULL ;
char * p ;
int rdrcnt , rprcnt ;
pstring param ;
int count = - 1 ;
/* now send a SMBtrans command with api RNetShareEnum */
p = param ;
SSVAL ( p , 0 , 0 ) ; /* api number */
p + = 2 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " WrLeh " ) ;
1998-04-28 13:53:42 +04:00
p = skip_string ( p , 1 ) ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " B13BWz " ) ;
1998-04-28 13:53:42 +04:00
p = skip_string ( p , 1 ) ;
SSVAL ( p , 0 , 1 ) ;
1998-10-16 21:40:01 +04:00
SSVAL ( p , 2 , 0xFFFF ) ;
1998-04-28 13:53:42 +04:00
p + = 4 ;
if ( cli_api ( cli ,
1998-04-28 20:43:02 +04:00
param , PTR_DIFF ( p , param ) , 1024 , /* Param, length, maxlen */
1998-10-16 21:40:01 +04:00
NULL , 0 , 0xFFFF , /* data, length, maxlen */
1998-04-28 20:43:02 +04:00
& rparam , & rprcnt , /* return params, length */
& rdata , & rdrcnt ) ) /* return data, length */
1998-04-28 13:53:42 +04:00
{
int res = SVAL ( rparam , 0 ) ;
int converter = SVAL ( rparam , 2 ) ;
int i ;
1998-10-16 21:40:01 +04:00
if ( res = = 0 | | res = = ERRmoredata ) {
count = SVAL ( rparam , 4 ) ;
p = rdata ;
for ( i = 0 ; i < count ; i + + , p + = 20 ) {
char * sname = p ;
int type = SVAL ( p , 14 ) ;
int comment_offset = IVAL ( p , 16 ) & 0xFFFF ;
char * cmnt = comment_offset ? ( rdata + comment_offset - converter ) : " " ;
1999-12-13 16:27:58 +03:00
dos_to_unix ( sname , True ) ;
dos_to_unix ( cmnt , True ) ;
1998-10-16 21:40:01 +04:00
fn ( sname , type , cmnt ) ;
}
} else {
DEBUG ( 4 , ( " NetShareEnum res=%d \n " , res ) ) ;
}
} else {
DEBUG ( 4 , ( " NetShareEnum failed \n " ) ) ;
1998-04-28 13:53:42 +04:00
}
1998-09-30 00:24:17 +04:00
if ( rparam )
free ( rparam ) ;
if ( rdata )
free ( rdata ) ;
1998-04-28 13:53:42 +04:00
1998-10-03 12:33:07 +04:00
return count ;
1998-04-28 13:53:42 +04:00
}
1998-10-03 12:33:07 +04:00
1997-10-21 13:12:41 +04:00
1997-10-26 10:32:02 +03:00
/****************************************************************************
call a NetServerEnum for the specified workgroup and servertype mask .
This function then calls the specified callback function for each name returned .
The callback function takes 3 arguments : the machine name , the server type and
the comment .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_NetServerEnum ( struct cli_state * cli , char * workgroup , uint32 stype ,
1998-10-04 15:25:06 +04:00
void ( * fn ) ( const char * , uint32 , const char * ) )
1997-10-26 10:32:02 +03:00
{
char * rparam = NULL ;
char * rdata = NULL ;
int rdrcnt , rprcnt ;
char * p ;
pstring param ;
int uLevel = 1 ;
int count = - 1 ;
/* send a SMBtrans command with api NetServerEnum */
p = param ;
SSVAL ( p , 0 , 0x68 ) ; /* api number */
p + = 2 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " WrLehDz " ) ;
1997-10-26 10:32:02 +03:00
p = skip_string ( p , 1 ) ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " B16BBDz " ) ;
1997-10-26 10:32:02 +03:00
p = skip_string ( p , 1 ) ;
SSVAL ( p , 0 , uLevel ) ;
1998-10-04 11:51:34 +04:00
SSVAL ( p , 2 , CLI_BUFFER_SIZE ) ;
1997-10-26 10:32:02 +03:00
p + = 4 ;
SIVAL ( p , 0 , stype ) ;
p + = 4 ;
pstrcpy ( p , workgroup ) ;
p = skip_string ( p , 1 ) ;
if ( cli_api ( cli ,
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
param , PTR_DIFF ( p , param ) , 8 , /* params, length, max */
1998-10-04 11:51:34 +04:00
NULL , 0 , CLI_BUFFER_SIZE , /* data, length, max */
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
& rparam , & rprcnt , /* return params, return size */
& rdata , & rdrcnt /* return data, return size */
) ) {
1997-10-26 10:32:02 +03:00
int res = SVAL ( rparam , 0 ) ;
int converter = SVAL ( rparam , 2 ) ;
int i ;
1998-10-16 21:40:01 +04:00
if ( res = = 0 | | res = = ERRmoredata ) {
1997-10-26 10:32:02 +03:00
count = SVAL ( rparam , 4 ) ;
p = rdata ;
for ( i = 0 ; i < count ; i + + , p + = 26 ) {
char * sname = p ;
1997-11-23 05:41:22 +03:00
int comment_offset = ( IVAL ( p , 22 ) & 0xFFFF ) - converter ;
char * cmnt = comment_offset ? ( rdata + comment_offset ) : " " ;
if ( comment_offset < 0 | | comment_offset > rdrcnt ) continue ;
1997-10-26 10:32:02 +03:00
stype = IVAL ( p , 18 ) & ~ SV_TYPE_LOCAL_LIST_ONLY ;
1999-12-13 16:27:58 +03:00
dos_to_unix ( sname , True ) ;
dos_to_unix ( cmnt , True ) ;
1997-10-26 10:32:02 +03:00
fn ( sname , stype , cmnt ) ;
}
}
}
1998-09-30 00:24:17 +04:00
if ( rparam )
free ( rparam ) ;
if ( rdata )
free ( rdata ) ;
1997-10-26 10:32:02 +03:00
return ( count > 0 ) ;
}
1997-10-21 13:12:41 +04:00
static struct {
int prot ;
char * name ;
}
prots [ ] =
{
{ PROTOCOL_CORE , " PC NETWORK PROGRAM 1.0 " } ,
{ PROTOCOL_COREPLUS , " MICROSOFT NETWORKS 1.03 " } ,
{ PROTOCOL_LANMAN1 , " MICROSOFT NETWORKS 3.0 " } ,
{ PROTOCOL_LANMAN1 , " LANMAN1.0 " } ,
{ PROTOCOL_LANMAN2 , " LM1.2X002 " } ,
{ PROTOCOL_LANMAN2 , " Samba " } ,
{ PROTOCOL_NT1 , " NT LANMAN 1.0 " } ,
1998-10-10 00:17:11 +04:00
{ PROTOCOL_NT1 , " NT LM 0.12 " } ,
1997-10-21 13:12:41 +04:00
{ - 1 , NULL }
} ;
/****************************************************************************
1999-12-13 16:27:58 +03:00
Send a session setup . The username is in UNIX character format and must be
converted to DOS codepage format before sending . If the password is in
plaintext , the same should be done .
1997-10-21 13:12:41 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
BOOL cli_session_setup ( struct cli_state * cli ,
char * user ,
char * pass , int passlen ,
char * ntpass , int ntpasslen ,
char * workgroup )
1997-10-21 13:12:41 +04:00
{
char * p ;
1999-12-13 16:27:58 +03:00
fstring pword , ntpword ;
1999-10-08 02:10:29 +04:00
1999-12-13 16:27:58 +03:00
if ( cli - > protocol < PROTOCOL_LANMAN1 )
1999-12-04 01:02:03 +03:00
return True ;
1999-12-13 16:27:58 +03:00
if ( passlen > sizeof ( pword ) - 1 | | ntpasslen > sizeof ( ntpword ) - 1 ) {
return False ;
}
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
if ( ( ( passlen = = 0 ) | | ( passlen = = 1 ) ) & & ( pass [ 0 ] = = ' \0 ' ) ) {
/* Null session connect. */
pword [ 0 ] = ' \0 ' ;
ntpword [ 0 ] = ' \0 ' ;
} else {
if ( ( cli - > sec_mode & 2 ) & & passlen ! = 24 ) {
/*
* Encrypted mode needed , and non encrypted password supplied .
*/
passlen = 24 ;
ntpasslen = 24 ;
fstrcpy ( pword , pass ) ;
unix_to_dos ( pword , True ) ;
fstrcpy ( ntpword , ntpass ) ; ;
unix_to_dos ( ntpword , True ) ;
SMBencrypt ( ( uchar * ) pword , ( uchar * ) cli - > cryptkey , ( uchar * ) pword ) ;
SMBNTencrypt ( ( uchar * ) ntpword , ( uchar * ) cli - > cryptkey , ( uchar * ) ntpword ) ;
} else if ( ( cli - > sec_mode & 2 ) & & passlen = = 24 ) {
/*
* Encrypted mode needed , and encrypted password supplied .
*/
memcpy ( pword , pass , passlen ) ;
if ( ntpasslen = = 24 ) {
memcpy ( ntpword , ntpass , ntpasslen ) ;
} else {
fstrcpy ( ntpword , " " ) ;
ntpasslen = 0 ;
}
} else {
/*
* Plaintext mode needed , assume plaintext supplied .
*/
fstrcpy ( pword , pass ) ;
unix_to_dos ( pword , True ) ;
fstrcpy ( ntpword , " " ) ;
ntpasslen = 0 ;
}
1999-01-27 03:08:33 +03:00
}
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
/* if in share level security then don't send a password now */
if ( ! ( cli - > sec_mode & 1 ) ) {
fstrcpy ( pword , " " ) ;
passlen = 1 ;
fstrcpy ( ntpword , " " ) ;
ntpasslen = 1 ;
}
1997-10-21 13:12:41 +04:00
/* send a session setup command */
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1997-10-21 13:12:41 +04:00
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( cli - > protocol < PROTOCOL_NT1 )
{
1997-10-21 13:12:41 +04:00
set_message ( cli - > outbuf , 10 , 1 + strlen ( user ) + passlen , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBsesssetupX ;
1997-10-23 23:27:53 +04:00
cli_setup_packet ( cli ) ;
1997-10-21 13:12:41 +04:00
CVAL ( cli - > outbuf , smb_vwv0 ) = 0xFF ;
SSVAL ( cli - > outbuf , smb_vwv2 , cli - > max_xmit ) ;
SSVAL ( cli - > outbuf , smb_vwv3 , 2 ) ;
SSVAL ( cli - > outbuf , smb_vwv4 , 1 ) ;
SIVAL ( cli - > outbuf , smb_vwv5 , cli - > sesskey ) ;
SSVAL ( cli - > outbuf , smb_vwv7 , passlen ) ;
p = smb_buf ( cli - > outbuf ) ;
1999-12-13 16:27:58 +03:00
memcpy ( p , pword , passlen ) ;
1997-10-21 13:12:41 +04:00
p + = passlen ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , user ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-10-21 13:12:41 +04:00
strupper ( p ) ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
}
1999-12-13 16:27:58 +03:00
else
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
{
1997-10-21 13:12:41 +04:00
set_message ( cli - > outbuf , 13 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBsesssetupX ;
1997-10-23 23:27:53 +04:00
cli_setup_packet ( cli ) ;
1997-10-21 13:12:41 +04:00
CVAL ( cli - > outbuf , smb_vwv0 ) = 0xFF ;
1998-10-04 11:51:34 +04:00
SSVAL ( cli - > outbuf , smb_vwv2 , CLI_BUFFER_SIZE ) ;
1997-10-21 13:12:41 +04:00
SSVAL ( cli - > outbuf , smb_vwv3 , 2 ) ;
SSVAL ( cli - > outbuf , smb_vwv4 , cli - > pid ) ;
SIVAL ( cli - > outbuf , smb_vwv5 , cli - > sesskey ) ;
SSVAL ( cli - > outbuf , smb_vwv7 , passlen ) ;
SSVAL ( cli - > outbuf , smb_vwv8 , ntpasslen ) ;
1999-12-13 16:27:58 +03:00
SSVAL ( cli - > outbuf , smb_vwv11 , 0 ) ;
1997-10-21 13:12:41 +04:00
p = smb_buf ( cli - > outbuf ) ;
1999-12-13 16:27:58 +03:00
memcpy ( p , pword , passlen ) ;
1997-10-21 13:12:41 +04:00
p + = SVAL ( cli - > outbuf , smb_vwv7 ) ;
1999-12-13 16:27:58 +03:00
memcpy ( p , ntpword , ntpasslen ) ;
1998-10-03 12:33:07 +04:00
p + = SVAL ( cli - > outbuf , smb_vwv8 ) ;
1999-12-13 16:27:58 +03:00
pstrcpy ( p , user ) ;
unix_to_dos ( p , True ) ;
strupper ( p ) ;
p = skip_string ( p , 1 ) ;
pstrcpy ( p , workgroup ) ;
strupper ( p ) ;
p = skip_string ( p , 1 ) ;
pstrcpy ( p , " Unix " ) ; p = skip_string ( p , 1 ) ;
pstrcpy ( p , " Samba " ) ; p = skip_string ( p , 1 ) ;
1997-10-21 13:12:41 +04:00
set_message ( cli - > outbuf , 13 , PTR_DIFF ( p , smb_buf ( cli - > outbuf ) ) , False ) ;
}
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1999-10-08 02:10:29 +04:00
1999-12-13 16:27:58 +03:00
show_msg ( cli - > inbuf ) ;
1999-10-08 02:10:29 +04:00
1999-12-13 16:27:58 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1999-10-08 02:10:29 +04:00
1999-12-13 16:27:58 +03:00
/* use the returned vuid from now on */
cli - > vuid = SVAL ( cli - > inbuf , smb_uid ) ;
if ( cli - > protocol > = PROTOCOL_NT1 ) {
/*
* Save off some of the connected server
* info .
*/
char * server_domain , * server_os , * server_type ;
server_os = smb_buf ( cli - > inbuf ) ;
server_type = skip_string ( server_os , 1 ) ;
server_domain = skip_string ( server_type , 1 ) ;
fstrcpy ( cli - > server_os , server_os ) ;
dos_to_unix ( cli - > server_os , True ) ;
fstrcpy ( cli - > server_type , server_type ) ;
dos_to_unix ( cli - > server_type , True ) ;
fstrcpy ( cli - > server_domain , server_domain ) ;
dos_to_unix ( cli - > server_domain , True ) ;
1998-11-13 01:17:51 +03:00
}
1999-12-13 16:27:58 +03:00
fstrcpy ( cli - > user_name , user ) ;
dos_to_unix ( cli - > user_name , True ) ;
1997-10-21 13:12:41 +04:00
return True ;
}
1999-12-13 16:27:58 +03:00
/****************************************************************************
Send a uloggoff .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_ulogoff ( struct cli_state * cli )
1999-06-29 22:47:06 +04:00
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
set_message ( cli - > outbuf , 2 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBulogoffX ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , 0xFF ) ;
SSVAL ( cli - > outbuf , smb_vwv2 , 0 ) ; /* no additional info */
1999-07-08 23:44:06 +04:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
if ( ! cli_receive_smb ( cli ) )
return False ;
1998-04-21 06:23:24 +04:00
return CVAL ( cli - > inbuf , smb_rcls ) = = 0 ;
}
1997-10-21 13:12:41 +04:00
/****************************************************************************
send a tconX
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_send_tconX ( struct cli_state * cli ,
1997-11-01 16:22:16 +03:00
char * share , char * dev , char * pass , int passlen )
1997-10-21 13:12:41 +04:00
{
1999-12-13 16:27:58 +03:00
fstring fullshare , pword , dos_pword ;
1997-10-21 13:12:41 +04:00
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-10-21 13:12:41 +04:00
1998-10-04 13:42:51 +04:00
fstrcpy ( cli - > share , share ) ;
1998-10-07 04:40:18 +04:00
/* in user level security don't send a password now */
1997-11-10 22:23:17 +03:00
if ( cli - > sec_mode & 1 ) {
1997-11-01 16:22:16 +03:00
passlen = 1 ;
pass = " " ;
}
1997-11-10 22:23:17 +03:00
if ( ( cli - > sec_mode & 2 ) & & * pass & & passlen ! = 24 ) {
1999-12-13 16:27:58 +03:00
/*
* Non - encrypted passwords - convert to DOS codepage before encryption .
*/
1997-11-01 16:22:16 +03:00
passlen = 24 ;
1999-12-13 16:27:58 +03:00
fstrcpy ( dos_pword , pass ) ;
unix_to_dos ( dos_pword , True ) ;
SMBencrypt ( ( uchar * ) dos_pword , ( uchar * ) cli - > cryptkey , ( uchar * ) pword ) ;
1997-11-01 16:22:16 +03:00
} else {
1999-12-13 16:27:58 +03:00
if ( ! ( cli - > sec_mode & 2 ) ) {
/*
* Non - encrypted passwords - convert to DOS codepage before using .
*/
fstrcpy ( pword , pass ) ;
unix_to_dos ( pword , True ) ;
} else {
memcpy ( pword , pass , passlen ) ;
}
1997-11-01 16:22:16 +03:00
}
1998-05-11 10:38:36 +04:00
slprintf ( fullshare , sizeof ( fullshare ) - 1 ,
" \\ \\ %s \\ %s " , cli - > desthost , share ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( fullshare , True ) ;
1998-11-14 07:16:07 +03:00
strupper ( fullshare ) ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
set_message ( cli - > outbuf , 4 ,
2 + strlen ( fullshare ) + passlen + strlen ( dev ) , True ) ;
1997-10-21 13:12:41 +04:00
CVAL ( cli - > outbuf , smb_com ) = SMBtconX ;
1997-10-23 23:27:53 +04:00
cli_setup_packet ( cli ) ;
1997-10-21 13:12:41 +04:00
SSVAL ( cli - > outbuf , smb_vwv0 , 0xFF ) ;
SSVAL ( cli - > outbuf , smb_vwv3 , passlen ) ;
p = smb_buf ( cli - > outbuf ) ;
memcpy ( p , pword , passlen ) ;
p + = passlen ;
1999-12-13 16:27:58 +03:00
fstrcpy ( p , fullshare ) ;
p = skip_string ( p , 1 ) ;
pstrcpy ( p , dev ) ;
unix_to_dos ( p , True ) ;
1997-10-21 13:12:41 +04:00
SCVAL ( cli - > inbuf , smb_rcls , 1 ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-10-21 13:12:41 +04:00
1998-10-16 21:40:01 +04:00
fstrcpy ( cli - > dev , " A: " ) ;
1999-12-13 16:27:58 +03:00
if ( cli - > protocol > = PROTOCOL_NT1 ) {
fstrcpy ( cli - > dev , smb_buf ( cli - > inbuf ) ) ;
1998-10-16 21:40:01 +04:00
}
if ( strcasecmp ( share , " IPC$ " ) = = 0 ) {
fstrcpy ( cli - > dev , " IPC " ) ;
}
1998-10-04 13:42:51 +04:00
1998-10-16 21:40:01 +04:00
/* only grab the device if we have a recent protocol level */
1999-12-13 16:27:58 +03:00
if ( cli - > protocol > = PROTOCOL_NT1 & &
smb_buflen ( cli - > inbuf ) = = 3 ) {
1998-10-03 12:33:07 +04:00
/* almost certainly win95 - enable bug fixes */
cli - > win95 = True ;
}
1997-10-21 13:12:41 +04:00
cli - > cnum = SVAL ( cli - > inbuf , smb_tid ) ;
return True ;
}
/****************************************************************************
send a tree disconnect
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_tdis ( struct cli_state * cli )
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1997-10-21 13:12:41 +04:00
set_message ( cli - > outbuf , 0 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBtdis ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
1997-10-23 23:27:53 +04:00
cli_setup_packet ( cli ) ;
1997-10-21 13:12:41 +04:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1997-11-10 22:23:17 +03:00
return CVAL ( cli - > inbuf , smb_rcls ) = = 0 ;
1997-10-21 13:12:41 +04:00
}
1997-11-30 05:58:34 +03:00
/****************************************************************************
rename a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-03 13:39:11 +04:00
BOOL cli_rename ( struct cli_state * cli , char * fname_src , char * fname_dst )
1997-11-30 05:58:34 +03:00
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-30 05:58:34 +03:00
set_message ( cli - > outbuf , 1 , 4 + strlen ( fname_src ) + strlen ( fname_dst ) , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBmv ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
2000-01-06 03:06:46 +03:00
SSVAL ( cli - > outbuf , smb_vwv0 , aSYSTEM | aHIDDEN | aDIR ) ;
1997-11-30 05:58:34 +03:00
p = smb_buf ( cli - > outbuf ) ;
* p + + = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , fname_src ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-11-30 05:58:34 +03:00
p = skip_string ( p , 1 ) ;
* p + + = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , fname_dst ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-11-30 05:58:34 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-30 05:58:34 +03:00
return False ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
return True ;
}
1997-11-01 16:22:16 +03:00
/****************************************************************************
delete a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_unlink ( struct cli_state * cli , char * fname )
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-01 16:22:16 +03:00
set_message ( cli - > outbuf , 1 , 2 + strlen ( fname ) , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBunlink ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , aSYSTEM | aHIDDEN ) ;
p = smb_buf ( cli - > outbuf ) ;
* p + + = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , fname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-11-24 16:44:52 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-24 16:44:52 +03:00
return False ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
return True ;
}
/****************************************************************************
create a directory
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_mkdir ( struct cli_state * cli , char * dname )
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-24 16:44:52 +03:00
set_message ( cli - > outbuf , 0 , 2 + strlen ( dname ) , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBmkdir ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
p = smb_buf ( cli - > outbuf ) ;
* p + + = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , dname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-11-24 16:44:52 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-24 16:44:52 +03:00
return False ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
return True ;
}
/****************************************************************************
remove a directory
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_rmdir ( struct cli_state * cli , char * dname )
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-24 16:44:52 +03:00
set_message ( cli - > outbuf , 0 , 2 + strlen ( dname ) , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBrmdir ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
p = smb_buf ( cli - > outbuf ) ;
* p + + = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , dname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-01 16:22:16 +03:00
return False ;
}
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-11-01 16:22:16 +03:00
return True ;
}
1998-10-09 23:34:57 +04:00
/****************************************************************************
open a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
int cli_nt_create ( struct cli_state * cli , char * fname )
1998-10-09 23:34:57 +04:00
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1998-10-09 23:34:57 +04:00
set_message ( cli - > outbuf , 24 , 1 + strlen ( fname ) , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBntcreateX ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , 0xFF ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_Flags , 0x06 ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_RootDirectoryFid , 0x0 ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_DesiredAccess , 0x2019f ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_FileAttributes , 0x0 ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_ShareAccess , 0x03 ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_CreateDisposition , 0x01 ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_CreateOptions , 0x0 ) ;
SIVAL ( cli - > outbuf , smb_ntcreate_ImpersonationLevel , 0x02 ) ;
SSVAL ( cli - > outbuf , smb_ntcreate_NameLength , strlen ( fname ) ) ;
p = smb_buf ( cli - > outbuf ) ;
pstrcpy ( p , fname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1998-10-09 23:34:57 +04:00
p = skip_string ( p , 1 ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1998-10-09 23:34:57 +04:00
return - 1 ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return - 1 ;
}
return SVAL ( cli - > inbuf , smb_vwv2 + 1 ) ;
}
1997-11-01 16:22:16 +03:00
/****************************************************************************
open a file
2000-01-08 13:15:53 +03:00
WARNING : if you open with O_WRONLY then getattrE won ' t work !
1997-11-01 16:22:16 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
int cli_open ( struct cli_state * cli , char * fname , int flags , int share_mode )
1997-11-01 16:22:16 +03:00
{
char * p ;
unsigned openfn = 0 ;
unsigned accessmode = 0 ;
if ( flags & O_CREAT )
openfn | = ( 1 < < 4 ) ;
if ( ! ( flags & O_EXCL ) ) {
if ( flags & O_TRUNC )
openfn | = ( 1 < < 1 ) ;
else
openfn | = ( 1 < < 0 ) ;
}
accessmode = ( share_mode < < 4 ) ;
1998-10-03 15:53:37 +04:00
if ( ( flags & O_ACCMODE ) = = O_RDWR ) {
1997-11-01 16:22:16 +03:00
accessmode | = 2 ;
1998-10-03 15:53:37 +04:00
} else if ( ( flags & O_ACCMODE ) = = O_WRONLY ) {
1997-11-01 16:22:16 +03:00
accessmode | = 1 ;
}
1998-04-21 02:43:54 +04:00
# if defined(O_SYNC)
1998-04-12 06:48:52 +04:00
if ( ( flags & O_SYNC ) = = O_SYNC ) {
accessmode | = ( 1 < < 14 ) ;
}
1998-04-21 02:43:54 +04:00
# endif /* O_SYNC */
1998-04-12 06:48:52 +04:00
2000-01-08 13:15:53 +03:00
if ( share_mode = = DENY_FCB ) {
accessmode = 0xFF ;
}
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-01 16:22:16 +03:00
set_message ( cli - > outbuf , 15 , 1 + strlen ( fname ) , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBopenX ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , 0xFF ) ;
SSVAL ( cli - > outbuf , smb_vwv2 , 0 ) ; /* no additional info */
SSVAL ( cli - > outbuf , smb_vwv3 , accessmode ) ;
SSVAL ( cli - > outbuf , smb_vwv4 , aSYSTEM | aHIDDEN ) ;
1997-11-23 05:41:22 +03:00
SSVAL ( cli - > outbuf , smb_vwv5 , 0 ) ;
1997-11-01 16:22:16 +03:00
SSVAL ( cli - > outbuf , smb_vwv8 , openfn ) ;
1999-12-13 16:27:58 +03:00
if ( cli - > use_oplocks ) {
/* if using oplocks then ask for a batch oplock via
core and extended methods */
CVAL ( cli - > outbuf , smb_flg ) | =
FLAG_REQUEST_OPLOCK | FLAG_REQUEST_BATCH_OPLOCK ;
SSVAL ( cli - > outbuf , smb_vwv2 , SVAL ( cli - > outbuf , smb_vwv2 ) | 6 ) ;
}
1997-11-01 16:22:16 +03:00
p = smb_buf ( cli - > outbuf ) ;
1999-12-13 16:27:58 +03:00
pstrcpy ( p , fname ) ;
unix_to_dos ( p , True ) ;
p = skip_string ( p , 1 ) ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-01 16:22:16 +03:00
return - 1 ;
}
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return - 1 ;
}
1997-11-01 16:22:16 +03:00
return SVAL ( cli - > inbuf , smb_vwv2 ) ;
}
/****************************************************************************
close a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_close ( struct cli_state * cli , int fnum )
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-01 16:22:16 +03:00
set_message ( cli - > outbuf , 3 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBclose ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , fnum ) ;
1997-11-23 05:41:22 +03:00
SIVALS ( cli - > outbuf , smb_vwv1 , - 1 ) ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-01 16:22:16 +03:00
return False ;
}
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-11-01 16:22:16 +03:00
return True ;
}
/****************************************************************************
lock a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_lock ( struct cli_state * cli , int fnum , uint32 offset , uint32 len , int timeout )
{
char * p ;
1998-10-16 04:54:16 +04:00
int saved_timeout = cli - > timeout ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-01 16:22:16 +03:00
set_message ( cli - > outbuf , 8 , 10 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBlockingX ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
CVAL ( cli - > outbuf , smb_vwv0 ) = 0xFF ;
SSVAL ( cli - > outbuf , smb_vwv2 , fnum ) ;
CVAL ( cli - > outbuf , smb_vwv3 ) = 0 ;
SIVALS ( cli - > outbuf , smb_vwv4 , timeout ) ;
SSVAL ( cli - > outbuf , smb_vwv6 , 0 ) ;
SSVAL ( cli - > outbuf , smb_vwv7 , 1 ) ;
p = smb_buf ( cli - > outbuf ) ;
SSVAL ( p , 0 , cli - > pid ) ;
SIVAL ( p , 2 , offset ) ;
SIVAL ( p , 6 , len ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-10-16 04:54:16 +04:00
cli - > timeout = ( timeout = = - 1 ) ? 0x7FFFFFFF : timeout ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1998-10-16 04:54:16 +04:00
cli - > timeout = saved_timeout ;
1997-11-01 16:22:16 +03:00
return False ;
}
1998-10-16 04:54:16 +04:00
cli - > timeout = saved_timeout ;
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-11-01 16:22:16 +03:00
return True ;
}
/****************************************************************************
unlock a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_unlock ( struct cli_state * cli , int fnum , uint32 offset , uint32 len , int timeout )
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-01 16:22:16 +03:00
set_message ( cli - > outbuf , 8 , 10 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBlockingX ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
CVAL ( cli - > outbuf , smb_vwv0 ) = 0xFF ;
SSVAL ( cli - > outbuf , smb_vwv2 , fnum ) ;
CVAL ( cli - > outbuf , smb_vwv3 ) = 0 ;
SIVALS ( cli - > outbuf , smb_vwv4 , timeout ) ;
SSVAL ( cli - > outbuf , smb_vwv6 , 1 ) ;
SSVAL ( cli - > outbuf , smb_vwv7 , 0 ) ;
p = smb_buf ( cli - > outbuf ) ;
SSVAL ( p , 0 , cli - > pid ) ;
SIVAL ( p , 2 , offset ) ;
SIVAL ( p , 6 , len ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-01 16:22:16 +03:00
return False ;
}
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-11-01 16:22:16 +03:00
return True ;
}
1998-10-04 10:22:08 +04:00
/****************************************************************************
issue a single SMBread and don ' t wait for a reply
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void cli_issue_read ( struct cli_state * cli , int fnum , off_t offset ,
size_t size , int i )
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1998-10-04 10:22:08 +04:00
set_message ( cli - > outbuf , 10 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBreadX ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
CVAL ( cli - > outbuf , smb_vwv0 ) = 0xFF ;
SSVAL ( cli - > outbuf , smb_vwv2 , fnum ) ;
SIVAL ( cli - > outbuf , smb_vwv3 , offset ) ;
SSVAL ( cli - > outbuf , smb_vwv5 , size ) ;
SSVAL ( cli - > outbuf , smb_vwv6 , size ) ;
SSVAL ( cli - > outbuf , smb_mid , cli - > mid + i ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-10-04 10:22:08 +04:00
}
1997-11-01 16:22:16 +03:00
/****************************************************************************
read from a file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-03 19:01:11 +04:00
size_t cli_read ( struct cli_state * cli , int fnum , char * buf , off_t offset , size_t size )
1997-11-01 16:22:16 +03:00
{
char * p ;
1998-10-04 10:22:08 +04:00
int total = - 1 ;
int issued = 0 ;
int received = 0 ;
1999-12-13 16:27:58 +03:00
/*
* There is a problem in this code when mpx is more than one .
* for some reason files can get corrupted when being read .
* Until we understand this fully I am serializing reads ( one
* read / one reply ) for now . JRA .
*/
#if 0
int mpx = MAX ( cli - > max_mux - 1 , 1 ) ;
# else
int mpx = 1 ;
# endif
1998-10-04 10:22:08 +04:00
int block = ( cli - > max_xmit - ( smb_size + 32 ) ) & ~ 1023 ;
int mid ;
int blocks = ( size + ( block - 1 ) ) / block ;
1998-10-06 17:10:06 +04:00
if ( size = = 0 ) return 0 ;
1999-12-13 16:27:58 +03:00
while ( received < blocks ) {
1998-10-03 12:33:07 +04:00
int size2 ;
1997-11-01 16:22:16 +03:00
1998-10-04 10:22:08 +04:00
while ( issued - received < mpx & & issued < blocks ) {
int size1 = MIN ( block , size - issued * block ) ;
cli_issue_read ( cli , fnum , offset + issued * block , size1 , issued ) ;
issued + + ;
}
1998-10-03 12:33:07 +04:00
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1998-10-04 10:22:08 +04:00
return total ;
1998-10-03 12:33:07 +04:00
}
1997-11-01 16:22:16 +03:00
1998-10-04 10:22:08 +04:00
received + + ;
mid = SVAL ( cli - > inbuf , smb_mid ) - cli - > mid ;
size2 = SVAL ( cli - > inbuf , smb_vwv5 ) ;
1999-12-13 16:27:58 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
1998-10-04 10:22:08 +04:00
blocks = MIN ( blocks , mid - 1 ) ;
continue ;
1998-10-03 12:33:07 +04:00
}
1997-11-01 16:22:16 +03:00
1998-10-04 10:22:08 +04:00
if ( size2 < = 0 ) {
blocks = MIN ( blocks , mid - 1 ) ;
/* this distinguishes EOF from an error */
total = MAX ( total , 0 ) ;
continue ;
}
if ( size2 > block ) {
1998-10-03 12:33:07 +04:00
DEBUG ( 0 , ( " server returned more than we wanted! \n " ) ) ;
exit ( 1 ) ;
}
1998-10-04 10:22:08 +04:00
if ( mid > = issued ) {
DEBUG ( 0 , ( " invalid mid from server! \n " ) ) ;
exit ( 1 ) ;
}
1998-10-03 12:33:07 +04:00
p = smb_base ( cli - > inbuf ) + SVAL ( cli - > inbuf , smb_vwv6 ) ;
1998-10-04 10:22:08 +04:00
memcpy ( buf + mid * block , p , size2 ) ;
1997-11-01 16:22:16 +03:00
1998-10-04 10:22:08 +04:00
total = MAX ( total , mid * block + size2 ) ;
1998-10-03 12:33:07 +04:00
}
1997-11-01 16:22:16 +03:00
1998-10-04 10:22:08 +04:00
while ( received < issued ) {
1998-11-09 06:45:49 +03:00
cli_receive_smb ( cli ) ;
1998-10-04 10:22:08 +04:00
received + + ;
}
1998-10-03 12:33:07 +04:00
return total ;
1997-11-01 16:22:16 +03:00
}
/****************************************************************************
1998-10-04 10:22:08 +04:00
issue a single SMBwrite and don ' t wait for a reply
1997-11-01 16:22:16 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-09 03:57:46 +04:00
static void cli_issue_write ( struct cli_state * cli , int fnum , off_t offset , uint16 mode , char * buf ,
1998-10-04 10:22:08 +04:00
size_t size , int i )
1997-11-01 16:22:16 +03:00
{
char * p ;
1998-10-03 12:33:07 +04:00
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1998-10-03 12:33:07 +04:00
1998-10-04 10:22:08 +04:00
set_message ( cli - > outbuf , 12 , size , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBwriteX ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
CVAL ( cli - > outbuf , smb_vwv0 ) = 0xFF ;
SSVAL ( cli - > outbuf , smb_vwv2 , fnum ) ;
1998-10-16 04:54:16 +04:00
1998-10-04 10:22:08 +04:00
SIVAL ( cli - > outbuf , smb_vwv3 , offset ) ;
1998-10-09 03:57:46 +04:00
SIVAL ( cli - > outbuf , smb_vwv5 , IS_BITS_SET_ALL ( mode , 0x0008 ) ? 0xFFFFFFFF : 0 ) ;
SSVAL ( cli - > outbuf , smb_vwv7 , mode ) ;
1998-10-10 00:17:11 +04:00
SSVAL ( cli - > outbuf , smb_vwv8 , IS_BITS_SET_ALL ( mode , 0x0008 ) ? size : 0 ) ;
1998-10-04 10:22:08 +04:00
SSVAL ( cli - > outbuf , smb_vwv10 , size ) ;
SSVAL ( cli - > outbuf , smb_vwv11 ,
smb_buf ( cli - > outbuf ) - smb_base ( cli - > outbuf ) ) ;
p = smb_base ( cli - > outbuf ) + SVAL ( cli - > outbuf , smb_vwv11 ) ;
memcpy ( p , buf , size ) ;
1998-10-03 12:33:07 +04:00
1998-10-04 10:22:08 +04:00
SSVAL ( cli - > outbuf , smb_mid , cli - > mid + i ) ;
1999-12-13 16:27:58 +03:00
show_msg ( cli - > outbuf ) ;
cli_send_smb ( cli ) ;
1998-10-04 10:22:08 +04:00
}
1998-10-03 12:33:07 +04:00
1998-10-04 10:22:08 +04:00
/****************************************************************************
write to a file
1998-10-09 03:57:46 +04:00
write_mode : 0x0001 disallow write cacheing
0x0002 return bytes remaining
0x0004 use raw named pipe protocol
0x0008 start of message mode named pipe protocol
1998-10-04 10:22:08 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-19 21:32:10 +04:00
ssize_t cli_write ( struct cli_state * cli ,
1998-11-09 06:45:49 +03:00
int fnum , uint16 write_mode ,
char * buf , off_t offset , size_t size )
1998-10-04 10:22:08 +04:00
{
1999-12-13 16:27:58 +03:00
int bwritten = 0 ;
int issued = 0 ;
int received = 0 ;
1998-10-04 10:22:08 +04:00
int mpx = MAX ( cli - > max_mux - 1 , 1 ) ;
int block = ( cli - > max_xmit - ( smb_size + 32 ) ) & ~ 1023 ;
int blocks = ( size + ( block - 1 ) ) / block ;
while ( received < blocks ) {
1998-10-03 12:33:07 +04:00
1999-12-13 16:27:58 +03:00
while ( ( issued - received < mpx ) & & ( issued < blocks ) )
{
int bsent = issued * block ;
int size1 = MIN ( block , size - bsent ) ;
cli_issue_write ( cli , fnum , offset + bsent ,
1998-10-09 03:57:46 +04:00
write_mode ,
1999-12-13 16:27:58 +03:00
buf + bsent ,
1998-10-04 10:22:08 +04:00
size1 , issued ) ;
issued + + ;
}
1998-10-03 12:33:07 +04:00
1999-12-13 16:27:58 +03:00
if ( ! cli_receive_smb ( cli ) )
{
return bwritten ;
1998-10-03 12:33:07 +04:00
}
1998-10-04 10:22:08 +04:00
received + + ;
1998-10-03 12:33:07 +04:00
1999-12-13 16:27:58 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 )
{
break ;
1998-10-04 10:22:08 +04:00
}
1998-10-03 12:33:07 +04:00
1999-12-13 16:27:58 +03:00
bwritten + = SVAL ( cli - > inbuf , smb_vwv2 ) ;
1998-10-03 12:33:07 +04:00
}
1999-12-13 16:27:58 +03:00
while ( received < issued & & cli_receive_smb ( cli ) )
{
1998-10-04 10:22:08 +04:00
received + + ;
}
1999-12-13 16:27:58 +03:00
return bwritten ;
}
/****************************************************************************
write to a file using a SMBwrite and not bypassing 0 byte writes
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
ssize_t cli_smbwrite ( struct cli_state * cli ,
int fnum , char * buf , off_t offset , size_t size1 )
{
char * p ;
ssize_t total = 0 ;
do {
size_t size = MIN ( size1 , cli - > max_xmit - 48 ) ;
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
set_message ( cli - > outbuf , 5 , 3 + size , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBwrite ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , fnum ) ;
SSVAL ( cli - > outbuf , smb_vwv1 , size ) ;
SIVAL ( cli - > outbuf , smb_vwv2 , offset ) ;
SSVAL ( cli - > outbuf , smb_vwv4 , 0 ) ;
p = smb_buf ( cli - > outbuf ) ;
* p + + = 1 ;
SSVAL ( p , 0 , size ) ;
memcpy ( p + 2 , buf , size ) ;
cli_send_smb ( cli ) ;
if ( ! cli_receive_smb ( cli ) ) {
return - 1 ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return - 1 ;
}
size = SVAL ( cli - > inbuf , smb_vwv0 ) ;
if ( size = = 0 ) break ;
size1 - = size ;
total + = size ;
} while ( size1 ) ;
1998-10-03 12:33:07 +04:00
return total ;
}
/****************************************************************************
do a SMBgetattrE call
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_getattrE ( struct cli_state * cli , int fd ,
1998-11-09 23:33:37 +03:00
uint16 * attr , size_t * size ,
1998-10-03 12:33:07 +04:00
time_t * c_time , time_t * a_time , time_t * m_time )
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
set_message ( cli - > outbuf , 1 , 0 , True ) ;
1997-11-01 16:22:16 +03:00
1998-10-03 12:33:07 +04:00
CVAL ( cli - > outbuf , smb_com ) = SMBgetattrE ;
1997-11-01 16:22:16 +03:00
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
1998-10-03 12:33:07 +04:00
SSVAL ( cli - > outbuf , smb_vwv0 , fd ) ;
1997-11-01 16:22:16 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1998-10-03 12:33:07 +04:00
return False ;
1997-11-01 16:22:16 +03:00
}
1998-10-03 12:33:07 +04:00
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
1998-10-03 12:33:07 +04:00
return False ;
}
if ( size ) {
* size = IVAL ( cli - > inbuf , smb_vwv6 ) ;
}
if ( attr ) {
* attr = SVAL ( cli - > inbuf , smb_vwv10 ) ;
}
if ( c_time ) {
* c_time = make_unix_date3 ( cli - > inbuf + smb_vwv0 ) ;
1997-11-10 22:23:17 +03:00
}
1997-11-01 16:22:16 +03:00
1998-10-03 12:33:07 +04:00
if ( a_time ) {
* a_time = make_unix_date3 ( cli - > inbuf + smb_vwv2 ) ;
}
if ( m_time ) {
* m_time = make_unix_date3 ( cli - > inbuf + smb_vwv4 ) ;
}
return True ;
1997-11-01 16:22:16 +03:00
}
1997-10-21 13:12:41 +04:00
1997-11-23 05:41:22 +03:00
/****************************************************************************
1997-11-23 06:09:59 +03:00
do a SMBgetatr call
1997-11-23 05:41:22 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1997-11-23 06:09:59 +03:00
BOOL cli_getatr ( struct cli_state * cli , char * fname ,
1998-11-09 23:33:37 +03:00
uint16 * attr , size_t * size , time_t * t )
1997-11-23 05:41:22 +03:00
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-23 05:41:22 +03:00
set_message ( cli - > outbuf , 0 , strlen ( fname ) + 2 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBgetatr ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
p = smb_buf ( cli - > outbuf ) ;
* p = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p + 1 , fname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p + 1 , True ) ;
1997-11-23 05:41:22 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-23 05:41:22 +03:00
return False ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-11-23 06:09:59 +03:00
if ( size ) {
* size = IVAL ( cli - > inbuf , smb_vwv3 ) ;
}
if ( t ) {
* t = make_unix_date3 ( cli - > inbuf + smb_vwv1 ) ;
}
if ( attr ) {
* attr = SVAL ( cli - > inbuf , smb_vwv0 ) ;
}
return True ;
}
/****************************************************************************
do a SMBsetatr call
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 23:33:37 +03:00
BOOL cli_setatr ( struct cli_state * cli , char * fname , uint16 attr , time_t t )
1997-11-23 06:09:59 +03:00
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
memset ( cli - > inbuf , ' \0 ' , smb_size ) ;
1997-11-23 06:09:59 +03:00
1997-12-03 02:30:43 +03:00
set_message ( cli - > outbuf , 8 , strlen ( fname ) + 4 , True ) ;
1997-11-23 06:09:59 +03:00
CVAL ( cli - > outbuf , smb_com ) = SMBsetatr ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , attr ) ;
put_dos_date3 ( cli - > outbuf , smb_vwv1 , t ) ;
p = smb_buf ( cli - > outbuf ) ;
* p = 4 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p + 1 , fname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p + 1 , True ) ;
1997-12-03 02:30:43 +03:00
p = skip_string ( p , 1 ) ;
* p = 4 ;
1997-11-23 06:09:59 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
1997-11-23 06:09:59 +03:00
return False ;
}
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 ) {
return False ;
}
1997-11-23 05:41:22 +03:00
return True ;
}
1997-11-23 08:55:44 +03:00
/****************************************************************************
send a qpathinfo call
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-04 07:27:04 +04:00
BOOL cli_qpathinfo ( struct cli_state * cli , const char * fname ,
1998-10-02 16:36:18 +04:00
time_t * c_time , time_t * a_time , time_t * m_time ,
1998-11-09 23:33:37 +03:00
size_t * size , uint16 * mode )
1997-11-23 08:55:44 +03:00
{
int data_len = 0 ;
int param_len = 0 ;
uint16 setup = TRANSACT2_QPATHINFO ;
pstring param ;
char * rparam = NULL , * rdata = NULL ;
1998-10-03 12:33:07 +04:00
int count = 8 ;
BOOL ret ;
time_t ( * date_fn ) ( void * ) ;
1997-11-23 08:55:44 +03:00
param_len = strlen ( fname ) + 7 ;
memset ( param , 0 , param_len ) ;
SSVAL ( param , 0 , SMB_INFO_STANDARD ) ;
pstrcpy ( & param [ 6 ] , fname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( & param [ 6 ] , True ) ;
1997-11-23 08:55:44 +03:00
1998-10-03 12:33:07 +04:00
do {
ret = ( cli_send_trans ( cli , SMBtrans2 ,
NULL , 0 , /* Name, length */
- 1 , 0 , /* fid, flags */
& setup , 1 , 0 , /* setup, length, max */
param , param_len , 10 , /* param, length, max */
NULL , data_len , cli - > max_xmit /* data, length, max */
) & &
cli_receive_trans ( cli , SMBtrans2 ,
& rparam , & param_len ,
& rdata , & data_len ) ) ;
if ( ! ret ) {
/* we need to work around a Win95 bug - sometimes
it gives ERRSRV / ERRerror temprarily */
uint8 eclass ;
uint32 ecode ;
1999-12-13 16:27:58 +03:00
cli_error ( cli , & eclass , & ecode , NULL ) ;
1998-10-03 12:33:07 +04:00
if ( eclass ! = ERRSRV | | ecode ! = ERRerror ) break ;
msleep ( 100 ) ;
}
} while ( count - - & & ret = = False ) ;
1997-11-23 08:55:44 +03:00
1998-10-03 12:33:07 +04:00
if ( ! ret | | ! rdata | | data_len < 22 ) {
1997-11-23 08:55:44 +03:00
return False ;
}
1998-10-03 12:33:07 +04:00
if ( cli - > win95 ) {
date_fn = make_unix_date ;
} else {
date_fn = make_unix_date2 ;
1997-11-23 08:55:44 +03:00
}
if ( c_time ) {
1998-10-03 12:33:07 +04:00
* c_time = date_fn ( rdata + 0 ) ;
1997-11-23 08:55:44 +03:00
}
if ( a_time ) {
1998-10-03 12:33:07 +04:00
* a_time = date_fn ( rdata + 4 ) ;
1997-11-23 08:55:44 +03:00
}
if ( m_time ) {
1998-10-03 12:33:07 +04:00
* m_time = date_fn ( rdata + 8 ) ;
1997-11-23 08:55:44 +03:00
}
if ( size ) {
* size = IVAL ( rdata , 12 ) ;
}
1998-10-02 16:36:18 +04:00
if ( mode ) {
* mode = SVAL ( rdata , l1_attrFile ) ;
}
1997-11-23 08:55:44 +03:00
if ( rdata ) free ( rdata ) ;
if ( rparam ) free ( rparam ) ;
return True ;
}
1997-11-23 10:26:42 +03:00
/****************************************************************************
send a qpathinfo call with the SMB_QUERY_FILE_ALL_INFO info level
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-10-08 06:28:21 +04:00
BOOL cli_qpathinfo2 ( struct cli_state * cli , const char * fname ,
1997-11-23 10:26:42 +03:00
time_t * c_time , time_t * a_time , time_t * m_time ,
1998-11-09 23:33:37 +03:00
time_t * w_time , size_t * size , uint16 * mode ,
1998-10-24 12:08:05 +04:00
SMB_INO_T * ino )
1997-11-23 10:26:42 +03:00
{
int data_len = 0 ;
int param_len = 0 ;
uint16 setup = TRANSACT2_QPATHINFO ;
pstring param ;
char * rparam = NULL , * rdata = NULL ;
param_len = strlen ( fname ) + 7 ;
memset ( param , 0 , param_len ) ;
SSVAL ( param , 0 , SMB_QUERY_FILE_ALL_INFO ) ;
pstrcpy ( & param [ 6 ] , fname ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( & param [ 6 ] , True ) ;
1997-11-23 10:26:42 +03:00
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
if ( ! cli_send_trans ( cli , SMBtrans2 ,
NULL , 0 , /* name, length */
- 1 , 0 , /* fid, flags */
& setup , 1 , 0 , /* setup, length, max */
param , param_len , 10 , /* param, length, max */
NULL , data_len , cli - > max_xmit /* data, length, max */
) ) {
1997-11-23 10:26:42 +03:00
return False ;
}
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
if ( ! cli_receive_trans ( cli , SMBtrans2 ,
& rparam , & param_len ,
& rdata , & data_len ) ) {
1997-11-23 10:26:42 +03:00
return False ;
}
if ( ! rdata | | data_len < 22 ) {
return False ;
}
if ( c_time ) {
* c_time = interpret_long_date ( rdata + 0 ) - cli - > serverzone ;
}
if ( a_time ) {
* a_time = interpret_long_date ( rdata + 8 ) - cli - > serverzone ;
}
if ( m_time ) {
* m_time = interpret_long_date ( rdata + 16 ) - cli - > serverzone ;
}
if ( w_time ) {
* w_time = interpret_long_date ( rdata + 24 ) - cli - > serverzone ;
}
1998-11-09 23:33:37 +03:00
if ( mode ) {
* mode = SVAL ( rdata , 32 ) ;
}
1997-11-23 10:26:42 +03:00
if ( size ) {
1999-12-13 16:27:58 +03:00
* size = IVAL ( rdata , 48 ) ;
1997-11-23 10:26:42 +03:00
}
1998-10-24 12:08:05 +04:00
if ( ino ) {
* ino = IVAL ( rdata , 64 ) ;
}
1997-11-23 10:26:42 +03:00
if ( rdata ) free ( rdata ) ;
if ( rparam ) free ( rparam ) ;
return True ;
}
1997-11-23 08:55:44 +03:00
/****************************************************************************
send a qfileinfo call
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_qfileinfo ( struct cli_state * cli , int fnum ,
1998-11-09 23:33:37 +03:00
uint16 * mode , size_t * size ,
1998-10-24 12:08:05 +04:00
time_t * c_time , time_t * a_time , time_t * m_time ,
time_t * w_time , SMB_INO_T * ino )
1997-11-23 08:55:44 +03:00
{
int data_len = 0 ;
int param_len = 0 ;
uint16 setup = TRANSACT2_QFILEINFO ;
pstring param ;
char * rparam = NULL , * rdata = NULL ;
1998-11-05 15:42:16 +03:00
/* if its a win95 server then fail this - win95 totally screws it
up */
if ( cli - > win95 ) return False ;
1997-11-23 08:55:44 +03:00
param_len = 4 ;
memset ( param , 0 , param_len ) ;
SSVAL ( param , 0 , fnum ) ;
1998-10-24 12:08:05 +04:00
SSVAL ( param , 2 , SMB_QUERY_FILE_ALL_INFO ) ;
1997-11-23 08:55:44 +03:00
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
if ( ! cli_send_trans ( cli , SMBtrans2 ,
NULL , 0 , /* name, length */
- 1 , 0 , /* fid, flags */
& setup , 1 , 0 , /* setup, length, max */
param , param_len , 2 , /* param, length, max */
NULL , data_len , cli - > max_xmit /* data, length, max */
) ) {
1997-11-23 08:55:44 +03:00
return False ;
}
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
if ( ! cli_receive_trans ( cli , SMBtrans2 ,
& rparam , & param_len ,
& rdata , & data_len ) ) {
1997-11-23 08:55:44 +03:00
return False ;
}
1998-11-05 15:42:16 +03:00
if ( ! rdata | | data_len < 68 ) {
1997-11-23 08:55:44 +03:00
return False ;
}
if ( c_time ) {
1998-10-24 12:08:05 +04:00
* c_time = interpret_long_date ( rdata + 0 ) - cli - > serverzone ;
1997-11-23 08:55:44 +03:00
}
if ( a_time ) {
1998-10-24 12:08:05 +04:00
* a_time = interpret_long_date ( rdata + 8 ) - cli - > serverzone ;
1997-11-23 08:55:44 +03:00
}
if ( m_time ) {
1998-10-24 12:08:05 +04:00
* m_time = interpret_long_date ( rdata + 16 ) - cli - > serverzone ;
}
if ( w_time ) {
* w_time = interpret_long_date ( rdata + 24 ) - cli - > serverzone ;
1997-11-23 08:55:44 +03:00
}
1998-11-09 23:33:37 +03:00
if ( mode ) {
* mode = SVAL ( rdata , 32 ) ;
}
1997-11-23 08:55:44 +03:00
if ( size ) {
1999-12-13 16:27:58 +03:00
* size = IVAL ( rdata , 48 ) ;
1997-11-23 08:55:44 +03:00
}
1998-10-24 12:08:05 +04:00
if ( ino ) {
* ino = IVAL ( rdata , 64 ) ;
1998-10-02 16:36:18 +04:00
}
1997-11-23 08:55:44 +03:00
if ( rdata ) free ( rdata ) ;
if ( rparam ) free ( rparam ) ;
return True ;
}
1998-10-02 16:36:18 +04:00
/****************************************************************************
interpret a long filename structure - this is mostly guesses at the moment
The length of the structure is returned
The structure of a long filename depends on the info level . 260 is used
by NT and 2 is used by OS / 2
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int interpret_long_filename ( int level , char * p , file_info * finfo )
{
extern file_info def_finfo ;
if ( finfo )
memcpy ( finfo , & def_finfo , sizeof ( * finfo ) ) ;
switch ( level )
{
case 1 : /* OS/2 understands this */
if ( finfo ) {
/* these dates are converted to GMT by make_unix_date */
finfo - > ctime = make_unix_date2 ( p + 4 ) ;
finfo - > atime = make_unix_date2 ( p + 8 ) ;
finfo - > mtime = make_unix_date2 ( p + 12 ) ;
finfo - > size = IVAL ( p , 16 ) ;
finfo - > mode = CVAL ( p , 24 ) ;
pstrcpy ( finfo - > name , p + 27 ) ;
1999-12-13 16:27:58 +03:00
dos_to_unix ( finfo - > name , True ) ;
1998-10-02 16:36:18 +04:00
}
return ( 28 + CVAL ( p , 26 ) ) ;
case 2 : /* this is what OS/2 uses mostly */
if ( finfo ) {
/* these dates are converted to GMT by make_unix_date */
finfo - > ctime = make_unix_date2 ( p + 4 ) ;
finfo - > atime = make_unix_date2 ( p + 8 ) ;
finfo - > mtime = make_unix_date2 ( p + 12 ) ;
finfo - > size = IVAL ( p , 16 ) ;
finfo - > mode = CVAL ( p , 24 ) ;
pstrcpy ( finfo - > name , p + 31 ) ;
1999-12-13 16:27:58 +03:00
dos_to_unix ( finfo - > name , True ) ;
1998-10-02 16:36:18 +04:00
}
return ( 32 + CVAL ( p , 30 ) ) ;
/* levels 3 and 4 are untested */
case 3 :
if ( finfo ) {
/* these dates are probably like the other ones */
finfo - > ctime = make_unix_date2 ( p + 8 ) ;
finfo - > atime = make_unix_date2 ( p + 12 ) ;
finfo - > mtime = make_unix_date2 ( p + 16 ) ;
finfo - > size = IVAL ( p , 20 ) ;
finfo - > mode = CVAL ( p , 28 ) ;
pstrcpy ( finfo - > name , p + 33 ) ;
1999-12-13 16:27:58 +03:00
dos_to_unix ( finfo - > name , True ) ;
1998-10-02 16:36:18 +04:00
}
return ( SVAL ( p , 4 ) + 4 ) ;
case 4 :
if ( finfo ) {
/* these dates are probably like the other ones */
finfo - > ctime = make_unix_date2 ( p + 8 ) ;
finfo - > atime = make_unix_date2 ( p + 12 ) ;
finfo - > mtime = make_unix_date2 ( p + 16 ) ;
finfo - > size = IVAL ( p , 20 ) ;
finfo - > mode = CVAL ( p , 28 ) ;
pstrcpy ( finfo - > name , p + 37 ) ;
1999-12-13 16:27:58 +03:00
dos_to_unix ( finfo - > name , True ) ;
1998-10-02 16:36:18 +04:00
}
return ( SVAL ( p , 4 ) + 4 ) ;
case 260 : /* NT uses this, but also accepts 2 */
if ( finfo ) {
int ret = SVAL ( p , 0 ) ;
int namelen ;
p + = 4 ; /* next entry offset */
p + = 4 ; /* fileindex */
/* these dates appear to arrive in a
weird way . It seems to be localtime
plus the serverzone given in the
initial connect . This is GMT when
DST is not in effect and one hour
from GMT otherwise . Can this really
be right ? ?
I suppose this could be called
kludge - GMT . Is is the GMT you get
by using the current DST setting on
a different localtime . It will be
cheap to calculate , I suppose , as
no DST tables will be needed */
finfo - > ctime = interpret_long_date ( p ) ; p + = 8 ;
finfo - > atime = interpret_long_date ( p ) ; p + = 8 ;
finfo - > mtime = interpret_long_date ( p ) ; p + = 8 ; p + = 8 ;
finfo - > size = IVAL ( p , 0 ) ; p + = 8 ;
p + = 8 ; /* alloc size */
finfo - > mode = CVAL ( p , 0 ) ; p + = 4 ;
namelen = IVAL ( p , 0 ) ; p + = 4 ;
p + = 4 ; /* EA size */
p + = 2 ; /* short name len? */
p + = 24 ; /* short name? */
1999-12-13 16:27:58 +03:00
StrnCpy ( finfo - > name , p , MIN ( sizeof ( finfo - > name ) - 1 , namelen ) ) ;
dos_to_unix ( finfo - > name , True ) ;
1998-10-02 16:36:18 +04:00
return ( ret ) ;
}
return ( SVAL ( p , 0 ) ) ;
}
DEBUG ( 1 , ( " Unknown long filename format %d \n " , level ) ) ;
return ( SVAL ( p , 0 ) ) ;
}
/****************************************************************************
do a directory listing , calling fn on each file found
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 23:33:37 +03:00
int cli_list ( struct cli_state * cli , const char * Mask , uint16 attribute ,
1998-11-09 06:45:49 +03:00
void ( * fn ) ( file_info * , const char * ) )
1998-10-02 16:36:18 +04:00
{
int max_matches = 512 ;
/* NT uses 260, OS/2 uses 2. Both accept 1. */
int info_level = cli - > protocol < PROTOCOL_NT1 ? 1 : 260 ;
char * p , * p2 ;
pstring mask ;
file_info finfo ;
int i ;
char * dirlist = NULL ;
int dirlist_len = 0 ;
1998-10-03 12:33:07 +04:00
int total_received = - 1 ;
1998-10-02 16:36:18 +04:00
BOOL First = True ;
int ff_searchcount = 0 ;
int ff_eos = 0 ;
int ff_lastname = 0 ;
int ff_dir_handle = 0 ;
int loop_count = 0 ;
char * rparam = NULL , * rdata = NULL ;
int param_len , data_len ;
uint16 setup ;
pstring param ;
pstrcpy ( mask , Mask ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( mask , True ) ;
1998-10-02 16:36:18 +04:00
while ( ff_eos = = 0 ) {
loop_count + + ;
if ( loop_count > 200 ) {
DEBUG ( 0 , ( " Error: Looping in FIND_NEXT?? \n " ) ) ;
break ;
}
param_len = 12 + strlen ( mask ) + 1 ;
if ( First ) {
setup = TRANSACT2_FINDFIRST ;
SSVAL ( param , 0 , attribute ) ; /* attribute */
SSVAL ( param , 2 , max_matches ) ; /* max count */
SSVAL ( param , 4 , 8 + 4 + 2 ) ; /* resume required + close on end + continue */
SSVAL ( param , 6 , info_level ) ;
SIVAL ( param , 8 , 0 ) ;
pstrcpy ( param + 12 , mask ) ;
} else {
setup = TRANSACT2_FINDNEXT ;
SSVAL ( param , 0 , ff_dir_handle ) ;
SSVAL ( param , 2 , max_matches ) ; /* max count */
SSVAL ( param , 4 , info_level ) ;
1999-12-13 16:27:58 +03:00
SIVAL ( param , 6 , 0 ) ; /* ff_resume_key */
1998-10-02 16:36:18 +04:00
SSVAL ( param , 10 , 8 + 4 + 2 ) ; /* resume required + close on end + continue */
pstrcpy ( param + 12 , mask ) ;
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " hand=0x%X ff_lastname=%d mask=%s \n " ,
ff_dir_handle , ff_lastname , mask ) ) ;
1998-10-02 16:36:18 +04:00
}
if ( ! cli_send_trans ( cli , SMBtrans2 ,
NULL , 0 , /* Name, length */
- 1 , 0 , /* fid, flags */
& setup , 1 , 0 , /* setup, length, max */
param , param_len , 10 , /* param, length, max */
NULL , 0 ,
cli - > max_xmit /* data, length, max */
) ) {
1998-10-03 12:33:07 +04:00
break ;
1998-10-02 16:36:18 +04:00
}
if ( ! cli_receive_trans ( cli , SMBtrans2 ,
& rparam , & param_len ,
& rdata , & data_len ) ) {
1998-10-03 12:33:07 +04:00
/* we need to work around a Win95 bug - sometimes
it gives ERRSRV / ERRerror temprarily */
uint8 eclass ;
uint32 ecode ;
1999-12-13 16:27:58 +03:00
cli_error ( cli , & eclass , & ecode , NULL ) ;
1998-10-03 12:33:07 +04:00
if ( eclass ! = ERRSRV | | ecode ! = ERRerror ) break ;
msleep ( 100 ) ;
continue ;
1998-10-02 16:36:18 +04:00
}
1998-10-03 12:33:07 +04:00
if ( total_received = = - 1 ) total_received = 0 ;
1998-10-02 16:36:18 +04:00
/* parse out some important return info */
p = rparam ;
if ( First ) {
ff_dir_handle = SVAL ( p , 0 ) ;
ff_searchcount = SVAL ( p , 2 ) ;
ff_eos = SVAL ( p , 4 ) ;
ff_lastname = SVAL ( p , 8 ) ;
} else {
ff_searchcount = SVAL ( p , 0 ) ;
ff_eos = SVAL ( p , 2 ) ;
ff_lastname = SVAL ( p , 6 ) ;
}
if ( ff_searchcount = = 0 )
break ;
/* point to the data bytes */
p = rdata ;
/* we might need the lastname for continuations */
if ( ff_lastname > 0 ) {
switch ( info_level )
{
case 260 :
StrnCpy ( mask , p + ff_lastname ,
1999-12-13 16:27:58 +03:00
MIN ( sizeof ( mask ) - 1 , data_len - ff_lastname ) ) ;
1998-10-02 16:36:18 +04:00
break ;
case 1 :
pstrcpy ( mask , p + ff_lastname + 1 ) ;
break ;
}
} else {
pstrcpy ( mask , " " ) ;
}
1999-12-13 16:27:58 +03:00
dos_to_unix ( mask , True ) ;
1998-10-02 16:36:18 +04:00
/* and add them to the dirlist pool */
dirlist = Realloc ( dirlist , dirlist_len + data_len ) ;
if ( ! dirlist ) {
DEBUG ( 0 , ( " Failed to expand dirlist \n " ) ) ;
break ;
}
/* put in a length for the last entry, to ensure we can chain entries
into the next packet */
for ( p2 = p , i = 0 ; i < ( ff_searchcount - 1 ) ; i + + )
p2 + = interpret_long_filename ( info_level , p2 , NULL ) ;
SSVAL ( p2 , 0 , data_len - PTR_DIFF ( p2 , p ) ) ;
/* grab the data for later use */
memcpy ( dirlist + dirlist_len , p , data_len ) ;
dirlist_len + = data_len ;
total_received + = ff_searchcount ;
if ( rdata ) free ( rdata ) ; rdata = NULL ;
if ( rparam ) free ( rparam ) ; rparam = NULL ;
1999-12-13 16:27:58 +03:00
DEBUG ( 3 , ( " received %d entries (eos=%d) \n " ,
ff_searchcount , ff_eos ) ) ;
if ( ff_searchcount > 0 ) loop_count = 0 ;
1998-10-02 16:36:18 +04:00
First = False ;
}
for ( p = dirlist , i = 0 ; i < total_received ; i + + ) {
p + = interpret_long_filename ( info_level , p , & finfo ) ;
1998-11-09 06:45:49 +03:00
fn ( & finfo , Mask ) ;
1998-10-02 16:36:18 +04:00
}
/* free up the dirlist buffer */
if ( dirlist ) free ( dirlist ) ;
return ( total_received ) ;
}
1998-03-19 23:06:47 +03:00
/****************************************************************************
Send a SamOEMChangePassword command
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-12 09:12:19 +03:00
BOOL cli_oem_change_password ( struct cli_state * cli , const char * user , const char * new_password ,
const char * old_password )
1998-03-19 23:06:47 +03:00
{
char param [ 16 + sizeof ( fstring ) ] ;
char data [ 532 ] ;
char * p = param ;
fstring upper_case_old_pw ;
fstring upper_case_new_pw ;
unsigned char old_pw_hash [ 16 ] ;
unsigned char new_pw_hash [ 16 ] ;
int data_len ;
int param_len = 0 ;
char * rparam = NULL ;
char * rdata = NULL ;
int rprcnt , rdrcnt ;
1999-12-13 16:27:58 +03:00
pstring dos_new_password ;
1998-03-19 23:06:47 +03:00
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( strlen ( user ) > = sizeof ( fstring ) - 1 ) {
1998-03-19 23:06:47 +03:00
DEBUG ( 0 , ( " cli_oem_change_password: user name %s is too long. \n " , user ) ) ;
return False ;
}
SSVAL ( p , 0 , 214 ) ; /* SamOEMChangePassword command. */
p + = 2 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " zsT " ) ;
1998-03-19 23:06:47 +03:00
p = skip_string ( p , 1 ) ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , " B516B16 " ) ;
1998-03-19 23:06:47 +03:00
p = skip_string ( p , 1 ) ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , user ) ;
1998-03-19 23:06:47 +03:00
p = skip_string ( p , 1 ) ;
SSVAL ( p , 0 , 532 ) ;
p + = 2 ;
param_len = PTR_DIFF ( p , param ) ;
/*
* Get the Lanman hash of the old password , we
1998-10-10 03:31:50 +04:00
* use this as the key to make_oem_passwd_hash ( ) .
1998-03-19 23:06:47 +03:00
*/
memset ( upper_case_old_pw , ' \0 ' , sizeof ( upper_case_old_pw ) ) ;
fstrcpy ( upper_case_old_pw , old_password ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( upper_case_old_pw , True ) ;
1998-03-19 23:06:47 +03:00
strupper ( upper_case_old_pw ) ;
E_P16 ( ( uchar * ) upper_case_old_pw , old_pw_hash ) ;
1999-12-13 16:27:58 +03:00
pstrcpy ( dos_new_password , new_password ) ;
unix_to_dos ( dos_new_password , True ) ;
if ( ! make_oem_passwd_hash ( data , dos_new_password , old_pw_hash , False ) )
return False ;
1998-03-19 23:06:47 +03:00
/*
* Now place the old password hash in the data .
*/
memset ( upper_case_new_pw , ' \0 ' , sizeof ( upper_case_new_pw ) ) ;
fstrcpy ( upper_case_new_pw , new_password ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( upper_case_new_pw , True ) ;
1998-03-19 23:06:47 +03:00
strupper ( upper_case_new_pw ) ;
E_P16 ( ( uchar * ) upper_case_new_pw , new_pw_hash ) ;
1998-03-24 03:37:53 +03:00
E_old_pw_hash ( new_pw_hash , old_pw_hash , ( uchar * ) & data [ 516 ] ) ;
1998-03-19 23:06:47 +03:00
data_len = 532 ;
1999-12-13 16:27:58 +03:00
if ( cli_send_trans ( cli , SMBtrans ,
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
PIPE_LANMAN , strlen ( PIPE_LANMAN ) , /* name, length */
0 , 0 , /* fid, flags */
NULL , 0 , 0 , /* setup, length, max */
param , param_len , 2 , /* param, length, max */
data , data_len , 0 /* data, length, max */
1999-12-13 16:27:58 +03:00
) = = False ) {
1998-03-19 23:06:47 +03:00
DEBUG ( 0 , ( " cli_oem_change_password: Failed to send password change for user %s \n " ,
user ) ) ;
return False ;
}
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( cli_receive_trans ( cli , SMBtrans ,
clientgen.c: Changes 'cli_xxx_' calls to use the following
regularized parameter syntax:
setup, setup_count, max_setup_count,
params, params_count, max_params_count,
data, data_count, max_data_count,
(and if a reply is needed)
*reply_params, *reply_data_len
*reply_data, *reply_data_len
This allows the pointers and the lengths
that relate to these pointers to be next
to each other in the parameter list. This
makes seeing what you are passing to these
functions much easier to see.
Getting ready for adding the lib/rpc/client
functions needed to do security=domain.
torture.c: Fixed it so it uses / rather than \\
internally for the //machine/share syntax.
Jeremy.
(This used to be commit 38350ea8b949d0908497490898ff04df7591ccac)
1998-04-18 02:44:01 +04:00
& rparam , & rprcnt ,
& rdata , & rdrcnt ) ) {
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( rparam )
1998-04-24 02:59:19 +04:00
cli - > rap_error = SVAL ( rparam , 0 ) ;
1998-03-19 23:06:47 +03:00
}
if ( rparam )
free ( rparam ) ;
if ( rdata )
free ( rdata ) ;
1998-04-24 02:59:19 +04:00
return ( cli - > rap_error = = 0 ) ;
1998-03-19 23:06:47 +03:00
}
1997-11-23 05:41:22 +03:00
1997-10-21 13:12:41 +04:00
/****************************************************************************
send a negprot command
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_negprot ( struct cli_state * cli )
{
char * p ;
int numprots ;
int plength ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1997-10-21 13:12:41 +04:00
/* setup the protocol strings */
for ( plength = 0 , numprots = 0 ;
prots [ numprots ] . name & & prots [ numprots ] . prot < = cli - > protocol ;
numprots + + )
plength + = strlen ( prots [ numprots ] . name ) + 2 ;
set_message ( cli - > outbuf , 0 , plength , True ) ;
p = smb_buf ( cli - > outbuf ) ;
for ( numprots = 0 ;
prots [ numprots ] . name & & prots [ numprots ] . prot < = cli - > protocol ;
numprots + + ) {
* p + + = 2 ;
1998-05-12 04:55:32 +04:00
pstrcpy ( p , prots [ numprots ] . name ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1997-10-21 13:12:41 +04:00
p + = strlen ( p ) + 1 ;
}
CVAL ( cli - > outbuf , smb_com ) = SMBnegprot ;
1997-10-23 23:27:53 +04:00
cli_setup_packet ( cli ) ;
1997-10-21 13:12:41 +04:00
CVAL ( smb_buf ( cli - > outbuf ) , 0 ) = 2 ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1999-12-13 16:27:58 +03:00
show_msg ( cli - > inbuf ) ;
1997-10-21 13:12:41 +04:00
1997-11-10 22:23:17 +03:00
if ( CVAL ( cli - > inbuf , smb_rcls ) ! = 0 | |
( ( int ) SVAL ( cli - > inbuf , smb_vwv0 ) > = numprots ) ) {
return ( False ) ;
}
1997-10-21 13:12:41 +04:00
cli - > protocol = prots [ SVAL ( cli - > inbuf , smb_vwv0 ) ] . prot ;
1999-12-13 16:27:58 +03:00
if ( cli - > protocol > = PROTOCOL_NT1 ) {
1997-10-21 13:12:41 +04:00
/* NT protocol */
cli - > sec_mode = CVAL ( cli - > inbuf , smb_vwv1 ) ;
1998-10-04 10:22:08 +04:00
cli - > max_mux = SVAL ( cli - > inbuf , smb_vwv1 + 1 ) ;
1997-10-21 13:12:41 +04:00
cli - > max_xmit = IVAL ( cli - > inbuf , smb_vwv3 + 1 ) ;
cli - > sesskey = IVAL ( cli - > inbuf , smb_vwv7 + 1 ) ;
1999-12-13 16:27:58 +03:00
cli - > serverzone = SVALS ( cli - > inbuf , smb_vwv15 + 1 ) ;
cli - > serverzone * = 60 ;
1997-10-21 13:12:41 +04:00
/* this time arrives in real GMT */
cli - > servertime = interpret_long_date ( cli - > inbuf + smb_vwv11 + 1 ) ;
1999-12-13 16:27:58 +03:00
memcpy ( cli - > cryptkey , smb_buf ( cli - > inbuf ) , 8 ) ;
1999-10-08 02:10:29 +04:00
cli - > capabilities = IVAL ( cli - > inbuf , smb_vwv9 + 1 ) ;
1999-12-13 16:27:58 +03:00
if ( cli - > capabilities & 1 ) {
1999-10-08 02:10:29 +04:00
cli - > readbraw_supported = True ;
cli - > writebraw_supported = True ;
1999-09-17 02:46:45 +04:00
}
1999-12-13 16:27:58 +03:00
} else if ( cli - > protocol > = PROTOCOL_LANMAN1 ) {
1997-11-23 05:41:22 +03:00
cli - > sec_mode = SVAL ( cli - > inbuf , smb_vwv1 ) ;
cli - > max_xmit = SVAL ( cli - > inbuf , smb_vwv2 ) ;
cli - > sesskey = IVAL ( cli - > inbuf , smb_vwv6 ) ;
1999-12-13 16:27:58 +03:00
cli - > serverzone = SVALS ( cli - > inbuf , smb_vwv10 ) ;
cli - > serverzone * = 60 ;
1997-11-23 05:41:22 +03:00
/* this time is converted to GMT by make_unix_date */
cli - > servertime = make_unix_date ( cli - > inbuf + smb_vwv8 ) ;
cli - > readbraw_supported = ( ( SVAL ( cli - > inbuf , smb_vwv5 ) & 0x1 ) ! = 0 ) ;
cli - > writebraw_supported = ( ( SVAL ( cli - > inbuf , smb_vwv5 ) & 0x2 ) ! = 0 ) ;
memcpy ( cli - > cryptkey , smb_buf ( cli - > inbuf ) , 8 ) ;
} else {
/* the old core protocol */
cli - > sec_mode = 0 ;
cli - > serverzone = TimeDiff ( time ( NULL ) ) ;
1997-10-21 13:12:41 +04:00
}
1998-10-04 11:51:34 +04:00
cli - > max_xmit = MIN ( cli - > max_xmit , CLI_BUFFER_SIZE ) ;
1997-10-21 13:12:41 +04:00
return True ;
}
/****************************************************************************
1998-09-26 01:01:52 +04:00
send a session request . see rfc1002 . txt 4.3 and 4.3 .2
1997-10-21 13:12:41 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-26 01:01:52 +04:00
BOOL cli_session_request ( struct cli_state * cli ,
1998-10-04 14:46:52 +04:00
struct nmb_name * calling , struct nmb_name * called )
1997-10-21 13:12:41 +04:00
{
char * p ;
int len = 4 ;
/* send a session request (RFC 1002) */
1998-09-26 01:01:52 +04:00
memcpy ( & ( cli - > calling ) , calling , sizeof ( * calling ) ) ;
memcpy ( & ( cli - > called ) , called , sizeof ( * called ) ) ;
1997-10-21 13:12:41 +04:00
/* put in the destination name */
p = cli - > outbuf + len ;
1998-09-26 01:01:52 +04:00
name_mangle ( cli - > called . name , p , cli - > called . name_type ) ;
1997-10-21 13:12:41 +04:00
len + = name_len ( p ) ;
/* and my name */
p = cli - > outbuf + len ;
1998-09-26 01:01:52 +04:00
name_mangle ( cli - > calling . name , p , cli - > calling . name_type ) ;
1997-10-21 13:12:41 +04:00
len + = name_len ( p ) ;
/* setup the packet length */
_smb_setlen ( cli - > outbuf , len ) ;
CVAL ( cli - > outbuf , 0 ) = 0x81 ;
1998-07-29 07:08:05 +04:00
# ifdef WITH_SSL
1998-06-16 05:35:52 +04:00
retry :
1998-07-29 07:08:05 +04:00
# endif /* WITH_SSL */
1998-06-16 05:35:52 +04:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1997-10-21 13:12:41 +04:00
DEBUG ( 5 , ( " Sent session request \n " ) ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) )
1997-10-21 13:12:41 +04:00
return False ;
1999-12-13 16:27:58 +03:00
if ( CVAL ( cli - > inbuf , 0 ) = = 0x84 ) {
/* C. Hoch 9/14/95 Start */
/* For information, here is the response structure.
* We do the byte - twiddling to for portability .
struct RetargetResponse {
unsigned char type ;
unsigned char flags ;
int16 length ;
int32 ip_addr ;
int16 port ;
} ;
*/
int port = ( CVAL ( cli - > inbuf , 8 ) < < 8 ) + CVAL ( cli - > inbuf , 9 ) ;
/* SESSION RETARGET */
putip ( ( char * ) & cli - > dest_ip , cli - > inbuf + 4 ) ;
close_sockets ( ) ;
cli - > fd = open_socket_out ( SOCK_STREAM , & cli - > dest_ip , port , LONG_CONNECT_TIMEOUT ) ;
if ( cli - > fd = = - 1 )
return False ;
DEBUG ( 3 , ( " Retargeted \n " ) ) ;
set_socket_options ( cli - > fd , user_socket_options ) ;
/* Try again */
return cli_session_request ( cli , calling , called ) ;
} /* C. Hoch 9/14/95 End */
1998-07-29 07:08:05 +04:00
# ifdef WITH_SSL
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( CVAL ( cli - > inbuf , 0 ) = = 0x83 & & CVAL ( cli - > inbuf , 4 ) = = 0x8e ) { /* use ssl */
if ( ! sslutil_fd_is_ssl ( cli - > fd ) ) {
if ( sslutil_connect ( cli - > fd ) = = 0 )
1998-06-16 05:35:52 +04:00
goto retry ;
}
}
1998-07-29 07:08:05 +04:00
# endif /* WITH_SSL */
1998-06-16 05:35:52 +04:00
1997-10-21 13:12:41 +04:00
if ( CVAL ( cli - > inbuf , 0 ) ! = 0x82 ) {
1998-04-24 02:59:19 +04:00
/* This is the wrong place to put the error... JRA. */
1999-12-13 16:27:58 +03:00
cli - > rap_error = CVAL ( cli - > inbuf , 4 ) ;
1997-10-21 13:12:41 +04:00
return False ;
}
return ( True ) ;
}
/****************************************************************************
open the client sockets
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-12 09:12:19 +03:00
BOOL cli_connect ( struct cli_state * cli , const char * host , struct in_addr * ip )
1997-10-21 13:12:41 +04:00
{
1998-08-31 11:21:54 +04:00
extern struct in_addr ipzero ;
1997-10-21 13:12:41 +04:00
1997-11-10 22:23:17 +03:00
fstrcpy ( cli - > desthost , host ) ;
1997-10-21 13:12:41 +04:00
1998-08-31 11:21:54 +04:00
if ( ! ip | | ip_equal ( * ip , ipzero ) ) {
1998-10-19 06:48:57 +04:00
if ( ! resolve_name ( cli - > desthost , & cli - > dest_ip , 0x20 ) ) {
1998-03-16 23:59:47 +03:00
return False ;
}
1998-10-19 06:48:57 +04:00
if ( ip ) * ip = cli - > dest_ip ;
1997-10-21 13:12:41 +04:00
} else {
1998-10-19 06:48:57 +04:00
cli - > dest_ip = * ip ;
1997-10-21 13:12:41 +04:00
}
1999-12-13 16:27:58 +03:00
if ( cli - > port = = 0 ) cli - > port = 139 ; /* Set to default */
1999-01-25 04:46:14 +03:00
1998-10-19 06:48:57 +04:00
cli - > fd = open_socket_out ( SOCK_STREAM , & cli - > dest_ip ,
1999-12-13 16:27:58 +03:00
cli - > port , cli - > timeout ) ;
1997-11-10 22:23:17 +03:00
if ( cli - > fd = = - 1 )
1999-12-13 16:27:58 +03:00
return False ;
1999-08-03 21:43:12 +04:00
1999-12-13 16:27:58 +03:00
set_socket_options ( cli - > fd , user_socket_options ) ;
1997-10-21 13:12:41 +04:00
1997-11-10 22:23:17 +03:00
return True ;
1997-10-21 13:12:41 +04:00
}
/****************************************************************************
initialise a client structure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-11-09 06:45:49 +03:00
struct cli_state * cli_initialise ( struct cli_state * cli )
1997-10-21 13:12:41 +04:00
{
1998-11-09 06:45:49 +03:00
if ( ! cli ) {
cli = ( struct cli_state * ) malloc ( sizeof ( * cli ) ) ;
1998-11-13 01:17:51 +03:00
if ( ! cli )
return NULL ;
ZERO_STRUCTP ( cli ) ;
1998-11-09 06:45:49 +03:00
}
if ( cli - > initialised ) {
1998-10-09 03:57:46 +04:00
cli_shutdown ( cli ) ;
}
1997-10-21 13:12:41 +04:00
1998-11-09 06:45:49 +03:00
ZERO_STRUCTP ( cli ) ;
1998-10-09 03:57:46 +04:00
1999-08-03 21:43:12 +04:00
cli - > port = 0 ;
1997-10-21 13:12:41 +04:00
cli - > fd = - 1 ;
cli - > cnum = - 1 ;
1998-09-30 00:24:17 +04:00
cli - > pid = ( uint16 ) getpid ( ) ;
1997-10-21 13:12:41 +04:00
cli - > mid = 1 ;
1998-09-30 00:24:17 +04:00
cli - > vuid = UID_FIELD_INVALID ;
1997-10-21 13:12:41 +04:00
cli - > protocol = PROTOCOL_NT1 ;
1999-12-13 16:27:58 +03:00
cli - > timeout = 20000 ; /* Timeout is in milliseconds. */
1998-10-04 11:51:34 +04:00
cli - > bufsize = CLI_BUFFER_SIZE + 4 ;
cli - > max_xmit = cli - > bufsize ;
1997-10-21 13:12:41 +04:00
cli - > outbuf = ( char * ) malloc ( cli - > bufsize ) ;
cli - > inbuf = ( char * ) malloc ( cli - > bufsize ) ;
1998-09-30 00:24:17 +04:00
if ( ! cli - > outbuf | | ! cli - > inbuf )
1998-10-09 03:57:46 +04:00
{
return False ;
}
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , cli - > bufsize ) ;
memset ( cli - > inbuf , ' \0 ' , cli - > bufsize ) ;
1999-12-01 19:39:51 +03:00
1999-12-13 16:27:58 +03:00
cli - > initialised = 1 ;
1998-10-09 03:57:46 +04:00
1998-11-09 06:45:49 +03:00
return cli ;
1997-10-21 13:12:41 +04:00
}
/****************************************************************************
shutdown a client structure
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void cli_shutdown ( struct cli_state * cli )
{
1998-09-30 00:24:17 +04:00
if ( cli - > outbuf )
1998-10-09 03:57:46 +04:00
{
free ( cli - > outbuf ) ;
}
1998-09-30 00:24:17 +04:00
if ( cli - > inbuf )
1998-10-09 03:57:46 +04:00
{
free ( cli - > inbuf ) ;
}
1999-12-13 16:27:58 +03:00
# ifdef WITH_SSL
if ( cli - > fd ! = - 1 )
sslutil_disconnect ( cli - > fd ) ;
# endif /* WITH_SSL */
if ( cli - > fd ! = - 1 )
close ( cli - > fd ) ;
1997-10-21 13:12:41 +04:00
memset ( cli , 0 , sizeof ( * cli ) ) ;
}
1997-11-01 16:22:16 +03:00
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
1997-11-01 16:22:16 +03:00
/****************************************************************************
return error codes for the last packet
1998-10-05 19:41:41 +04:00
returns 0 if there was no error and the best approx of a unix errno
1998-10-03 12:33:07 +04:00
otherwise
1998-10-05 19:41:41 +04:00
for 32 bit " warnings " , a return code of 0 is expected .
1997-11-01 16:22:16 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
int cli_error ( struct cli_state * cli , uint8 * eclass , uint32 * num , uint32 * nt_rpc_error )
1997-11-01 16:22:16 +03:00
{
1999-12-13 16:27:58 +03:00
int flgs2 = SVAL ( cli - > inbuf , smb_flg2 ) ;
1998-10-03 12:33:07 +04:00
char rcls ;
int code ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
if ( eclass ) * eclass = 0 ;
if ( num ) * num = 0 ;
1999-12-13 16:27:58 +03:00
if ( nt_rpc_error ) * nt_rpc_error = cli - > nt_error ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
1999-12-13 16:27:58 +03:00
if ( flgs2 & FLAGS2_32_BIT_ERROR_CODES ) {
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
/* 32 bit error codes detected */
uint32 nt_err = IVAL ( cli - > inbuf , smb_rcls ) ;
if ( num ) * num = nt_err ;
DEBUG ( 10 , ( " cli_error: 32 bit codes: code=%08x \n " , nt_err ) ) ;
1998-10-03 12:33:07 +04:00
if ( ! IS_BITS_SET_ALL ( nt_err , 0xc0000000 ) ) return 0 ;
1999-12-13 16:27:58 +03:00
switch ( nt_err & 0xFFFFFF ) {
case NT_STATUS_ACCESS_VIOLATION : return EACCES ;
case NT_STATUS_NO_SUCH_FILE : return ENOENT ;
case NT_STATUS_NO_SUCH_DEVICE : return ENODEV ;
case NT_STATUS_INVALID_HANDLE : return EBADF ;
case NT_STATUS_NO_MEMORY : return ENOMEM ;
case NT_STATUS_ACCESS_DENIED : return EACCES ;
case NT_STATUS_OBJECT_NAME_NOT_FOUND : return ENOENT ;
case NT_STATUS_SHARING_VIOLATION : return EBUSY ;
case NT_STATUS_OBJECT_PATH_INVALID : return ENOTDIR ;
case NT_STATUS_OBJECT_NAME_COLLISION : return EEXIST ;
1998-10-03 12:33:07 +04:00
}
/* for all other cases - a default code */
return EINVAL ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
}
1998-10-03 12:33:07 +04:00
rcls = CVAL ( cli - > inbuf , smb_rcls ) ;
code = SVAL ( cli - > inbuf , smb_err ) ;
if ( rcls = = 0 ) return 0 ;
if ( eclass ) * eclass = rcls ;
if ( num ) * num = code ;
if ( rcls = = ERRDOS ) {
switch ( code ) {
case ERRbadfile : return ENOENT ;
1998-10-05 06:45:50 +04:00
case ERRbadpath : return ENOTDIR ;
1998-10-04 10:43:41 +04:00
case ERRnoaccess : return EACCES ;
1998-10-06 17:10:06 +04:00
case ERRfilexists : return EEXIST ;
case ERRrename : return EEXIST ;
1998-10-26 06:31:00 +03:00
case ERRbadshare : return EBUSY ;
case ERRlock : return EBUSY ;
1998-10-03 12:33:07 +04:00
}
}
if ( rcls = = ERRSRV ) {
switch ( code ) {
case ERRbadpw : return EPERM ;
1998-10-26 06:31:00 +03:00
case ERRaccess : return EACCES ;
case ERRnoresource : return ENOMEM ;
case ERRinvdevice : return ENODEV ;
case ERRinvnetname : return ENODEV ;
Makefile.in :
- added srvsvc client files
clientgen.c :
- replaced cli_error(cli, int *cls, int *err) with
cli_error(cli, uint8 cls, uint32 *err). this version detects
32 bit status messages. the DOS error "MORE_DATA", the
equivalent of the 32 bit *warning* 0x8000 0005
(STATUS_BUFFER_OVERFLOW), was being processed as an error,
terminating the cli_receive_trans() call.
cli_pipe.c :
- replaced calls that had been incorrectly modified from
32 bit warnings (0x8000 0005 - STATUS_BUFFER_OVERFLOW)
to 8 bit DOS errors (0x01 0xEA - MORE_DATA).
the use of the old version of cli_error (DOS only)
instead of the new one (DOS and 32 bit) caused the
dce/rpc client code to fail.
- replaced 2 space indentation with tab indentation in all functions.
cli_srvsvc.c :
cmd_srvsvc.c :
- added these files back in, fixing them up to use jeremy's
modified versions of the dce/rpc client functions.
parse_srv.c :
- added back in some "unused" functions required by dce/rpc
client-side code. it would be helpful if all such "unused"
functions could be added back in.
rpcclient.c :
- added "session", "file", "share", "connection" enumeration
functions back in. these are equivalent to nt's "NetXXXXXEnum"
Win32 (MSDN) functions.
- added "srvinfo" function back in. this is equivalent to
nt's NetServerGetInfo Win32 (MSDN) function.
(This used to be commit bcf39ffdcc64e049bca2d70a394a99976291e81d)
1998-10-03 01:09:23 +04:00
}
}
1998-10-03 12:33:07 +04:00
/* for other cases */
return EINVAL ;
1997-11-01 16:22:16 +03:00
}
/****************************************************************************
set socket options on a open connection
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void cli_sockopt ( struct cli_state * cli , char * options )
{
set_socket_options ( cli - > fd , options ) ;
}
1997-11-08 07:02:05 +03:00
/****************************************************************************
set the PID to use for smb messages . Return the old pid .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-09-30 00:24:17 +04:00
uint16 cli_setpid ( struct cli_state * cli , uint16 pid )
1997-11-08 07:02:05 +03:00
{
1998-09-30 00:24:17 +04:00
uint16 ret = cli - > pid ;
1997-11-08 07:02:05 +03:00
cli - > pid = pid ;
return ret ;
}
1998-09-26 01:01:52 +04:00
/****************************************************************************
1998-10-19 06:48:57 +04:00
re - establishes a connection
1998-09-26 01:01:52 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_reestablish_connection ( struct cli_state * cli )
{
struct nmb_name calling ;
struct nmb_name called ;
fstring dest_host ;
fstring share ;
fstring dev ;
BOOL do_tcon = False ;
1998-10-19 06:48:57 +04:00
int oldfd = cli - > fd ;
1998-09-26 01:01:52 +04:00
if ( ! cli - > initialised | | cli - > fd = = - 1 )
{
DEBUG ( 3 , ( " cli_reestablish_connection: not connected \n " ) ) ;
return False ;
}
/* copy the parameters necessary to re-establish the connection */
if ( cli - > cnum ! = 0 )
{
fstrcpy ( share , cli - > share ) ;
fstrcpy ( dev , cli - > dev ) ;
1999-12-13 16:27:58 +03:00
do_tcon = True ;
1998-09-26 01:01:52 +04:00
}
memcpy ( & called , & ( cli - > called ) , sizeof ( called ) ) ;
memcpy ( & calling , & ( cli - > calling ) , sizeof ( calling ) ) ;
1999-12-13 16:27:58 +03:00
fstrcpy ( dest_host , cli - > full_dest_host_name ) ;
1998-09-26 01:01:52 +04:00
DEBUG ( 5 , ( " cli_reestablish_connection: %s connecting to %s (ip %s) - %s [%s] \n " ,
1998-11-14 04:04:13 +03:00
nmb_namestr ( & calling ) , nmb_namestr ( & called ) ,
1998-10-19 06:48:57 +04:00
inet_ntoa ( cli - > dest_ip ) ,
1999-12-13 16:27:58 +03:00
cli - > user_name , cli - > domain ) ) ;
1998-09-26 01:01:52 +04:00
1998-10-19 06:48:57 +04:00
cli - > fd = - 1 ;
if ( cli_establish_connection ( cli ,
dest_host , & cli - > dest_ip ,
& calling , & called ,
1999-12-13 16:27:58 +03:00
share , dev , False , do_tcon ) ) {
if ( cli - > fd ! = oldfd ) {
if ( dup2 ( cli - > fd , oldfd ) = = oldfd ) {
close ( cli - > fd ) ;
1998-10-19 06:48:57 +04:00
}
}
return True ;
}
return False ;
1998-09-26 01:01:52 +04:00
}
/****************************************************************************
establishes a connection right up to doing tconX , reading in a password .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_establish_connection ( struct cli_state * cli ,
1999-12-13 16:27:58 +03:00
char * dest_host , struct in_addr * dest_ip ,
1998-09-26 01:01:52 +04:00
struct nmb_name * calling , struct nmb_name * called ,
char * service , char * service_type ,
BOOL do_shutdown , BOOL do_tcon )
{
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " cli_establish_connection: %s connecting to %s (%s) - %s [%s] \n " ,
nmb_namestr ( calling ) , nmb_namestr ( called ) , inet_ntoa ( * dest_ip ) ,
cli - > user_name , cli - > domain ) ) ;
1998-09-26 01:01:52 +04:00
/* establish connection */
if ( ( ! cli - > initialised ) )
{
return False ;
}
if ( cli - > fd = = - 1 )
{
if ( ! cli_connect ( cli , dest_host , dest_ip ) )
{
DEBUG ( 1 , ( " cli_establish_connection: failed to connect to %s (%s) \n " ,
1999-12-13 16:27:58 +03:00
nmb_namestr ( calling ) , inet_ntoa ( * dest_ip ) ) ) ;
1998-09-26 01:01:52 +04:00
return False ;
}
}
if ( ! cli_session_request ( cli , calling , called ) )
{
DEBUG ( 1 , ( " failed session request \n " ) ) ;
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1999-12-13 16:27:58 +03:00
cli_shutdown ( cli ) ;
1998-09-26 01:01:52 +04:00
return False ;
}
if ( ! cli_negprot ( cli ) )
{
DEBUG ( 1 , ( " failed negprot \n " ) ) ;
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1999-12-13 16:27:58 +03:00
cli_shutdown ( cli ) ;
1998-09-26 01:01:52 +04:00
return False ;
}
1999-12-13 16:27:58 +03:00
if ( cli - > pwd . cleartext | | cli - > pwd . null_pwd )
1999-09-17 02:46:45 +04:00
{
1999-12-13 16:27:58 +03:00
fstring passwd ;
int pass_len ;
1999-09-17 02:46:45 +04:00
1999-12-13 16:27:58 +03:00
if ( cli - > pwd . null_pwd )
1998-10-16 03:51:07 +04:00
{
/* attempt null session */
1999-12-13 16:27:58 +03:00
passwd [ 0 ] = 0 ;
pass_len = 1 ;
1998-10-16 03:51:07 +04:00
}
else
{
/* attempt clear-text session */
1999-12-13 16:27:58 +03:00
pwd_get_cleartext ( & ( cli - > pwd ) , passwd ) ;
1998-10-16 03:51:07 +04:00
pass_len = strlen ( passwd ) ;
}
1998-09-26 01:01:52 +04:00
/* attempt clear-text session */
1999-12-13 16:27:58 +03:00
if ( ! cli_session_setup ( cli , cli - > user_name ,
1998-10-16 03:51:07 +04:00
passwd , pass_len ,
1999-12-13 16:27:58 +03:00
NULL , 0 ,
cli - > domain ) )
1998-09-26 01:01:52 +04:00
{
DEBUG ( 1 , ( " failed session setup \n " ) ) ;
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1998-10-09 03:57:46 +04:00
{
cli_shutdown ( cli ) ;
}
1998-09-26 01:01:52 +04:00
return False ;
}
if ( do_tcon )
{
if ( ! cli_send_tconX ( cli , service , service_type ,
( char * ) passwd , strlen ( passwd ) ) )
{
DEBUG ( 1 , ( " failed tcon_X \n " ) ) ;
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1998-10-09 03:57:46 +04:00
{
cli_shutdown ( cli ) ;
}
1998-09-26 01:01:52 +04:00
return False ;
}
}
}
else
{
/* attempt encrypted session */
1999-12-13 16:27:58 +03:00
unsigned char nt_sess_pwd [ 24 ] ;
1998-09-30 05:05:51 +04:00
unsigned char lm_sess_pwd [ 24 ] ;
1998-09-26 01:01:52 +04:00
1999-12-13 16:27:58 +03:00
/* creates (storing a copy of) and then obtains a 24 byte password OWF */
pwd_make_lm_nt_owf ( & ( cli - > pwd ) , cli - > cryptkey ) ;
pwd_get_lm_nt_owf ( & ( cli - > pwd ) , lm_sess_pwd , nt_sess_pwd ) ;
1998-09-26 01:01:52 +04:00
/* attempt encrypted session */
1999-12-13 16:27:58 +03:00
if ( ! cli_session_setup ( cli , cli - > user_name ,
( char * ) lm_sess_pwd , sizeof ( lm_sess_pwd ) ,
( char * ) nt_sess_pwd , sizeof ( nt_sess_pwd ) ,
cli - > domain ) )
1998-09-26 01:01:52 +04:00
{
DEBUG ( 1 , ( " failed session setup \n " ) ) ;
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1999-12-13 16:27:58 +03:00
cli_shutdown ( cli ) ;
1998-09-26 01:01:52 +04:00
return False ;
}
if ( do_tcon )
{
if ( ! cli_send_tconX ( cli , service , service_type ,
( char * ) nt_sess_pwd , sizeof ( nt_sess_pwd ) ) )
{
DEBUG ( 1 , ( " failed tcon_X \n " ) ) ;
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1999-12-13 16:27:58 +03:00
cli_shutdown ( cli ) ;
1998-09-26 01:01:52 +04:00
return False ;
}
}
}
1998-09-30 00:24:17 +04:00
if ( do_shutdown )
1999-12-13 16:27:58 +03:00
cli_shutdown ( cli ) ;
1998-09-26 01:01:52 +04:00
return True ;
}
1998-10-04 13:42:51 +04:00
- group database API. oops and oh dear, the threat has been carried out:
the pre-alpha "domain group" etc parameters have disappeared.
- interactive debug detection
- re-added mem_man (andrew's memory management, detects memory corruption)
- american spellings of "initialise" replaced with english spelling of
"initialise".
- started on "lookup_name()" and "lookup_sid()" functions. proper ones.
- moved lots of functions around. created some modules of commonly used
code. e.g the password file locking code, which is used in groupfile.c
and aliasfile.c and smbpass.c
- moved RID_TYPE_MASK up another bit. this is really unfortunate, but
there is no other "fast" way to identify users from groups from aliases.
i do not believe that this code saves us anything (the multipliers)
and puts us at a disadvantage (reduces the useable rid space).
the designers of NT aren't silly: if they can get away with a user-
interface-speed LsaLookupNames / LsaLookupSids, then so can we. i
spoke with isaac at the cifs conference, the only time for example that
they do a security context check is on file create. certainly not on
individual file reads / writes, which would drastically hit their
performance and ours, too.
- renamed myworkgroup to global_sam_name, amongst other things, when used
in the rpc code. there is also a global_member_name, as we are always
responsible for a SAM database, the scope of which is limited by the role
of the machine (e.g if a member of a workgroup, your SAM is for _local_
logins only, and its name is the name of your server. you even still
have a SID. see LsaQueryInfoPolicy, levels 3 and 5).
- updated functionality of groupname.c to be able to cope with names
like DOMAIN\group and SERVER\alias. used this code to be able to
do aliases as well as groups. this code may actually be better
off being used in username mapping, too.
- created a connect to serverlist function in clientgen.c and used it
in password.c
- initialisation in server.c depends on the role of the server. well,
it does now.
- rpctorture. smbtorture. EXERCISE EXTREME CAUTION.
(This used to be commit 0d21e1e6090b933f396c764af535ca3388a562db)
1998-11-17 19:19:04 +03:00
1998-10-04 14:14:21 +04:00
/****************************************************************************
cancel a print job
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int cli_printjob_del ( struct cli_state * cli , int job )
{
char * rparam = NULL ;
char * rdata = NULL ;
char * p ;
int rdrcnt , rprcnt , ret = - 1 ;
pstring param ;
1999-12-13 16:27:58 +03:00
memset ( param , ' \0 ' , sizeof ( param ) ) ;
1998-10-04 14:14:21 +04:00
p = param ;
SSVAL ( p , 0 , 81 ) ; /* DosPrintJobDel() */
p + = 2 ;
pstrcpy ( p , " W " ) ;
p = skip_string ( p , 1 ) ;
pstrcpy ( p , " " ) ;
p = skip_string ( p , 1 ) ;
SSVAL ( p , 0 , job ) ;
p + = 2 ;
if ( cli_api ( cli ,
param , PTR_DIFF ( p , param ) , 1024 , /* Param, length, maxlen */
NULL , 0 , CLI_BUFFER_SIZE , /* data, length, maxlen */
& rparam , & rprcnt , /* return params, length */
& rdata , & rdrcnt ) ) { /* return data, length */
ret = SVAL ( rparam , 0 ) ;
}
if ( rparam ) free ( rparam ) ;
if ( rdata ) free ( rdata ) ;
return ret ;
}
1998-10-04 13:42:51 +04:00
/****************************************************************************
call fn ( ) on each entry in a print queue
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int cli_print_queue ( struct cli_state * cli ,
void ( * fn ) ( struct print_job_info * ) )
{
char * rparam = NULL ;
char * rdata = NULL ;
char * p ;
int rdrcnt , rprcnt ;
pstring param ;
int result_code = 0 ;
int i = - 1 ;
1999-12-13 16:27:58 +03:00
memset ( param , ' \0 ' , sizeof ( param ) ) ;
1998-10-04 13:42:51 +04:00
p = param ;
SSVAL ( p , 0 , 76 ) ; /* API function number 76 (DosPrintJobEnum) */
p + = 2 ;
pstrcpy ( p , " zWrLeh " ) ; /* parameter description? */
p = skip_string ( p , 1 ) ;
pstrcpy ( p , " WWzWWDDzz " ) ; /* returned data format */
p = skip_string ( p , 1 ) ;
pstrcpy ( p , cli - > share ) ; /* name of queue */
p = skip_string ( p , 1 ) ;
SSVAL ( p , 0 , 2 ) ; /* API function level 2, PRJINFO_2 data structure */
SSVAL ( p , 2 , 1000 ) ; /* size of bytes of returned data buffer */
p + = 4 ;
pstrcpy ( p , " " ) ; /* subformat */
p = skip_string ( p , 1 ) ;
DEBUG ( 4 , ( " doing cli_print_queue for %s \n " , cli - > share ) ) ;
if ( cli_api ( cli ,
param , PTR_DIFF ( p , param ) , 1024 , /* Param, length, maxlen */
NULL , 0 , CLI_BUFFER_SIZE , /* data, length, maxlen */
& rparam , & rprcnt , /* return params, length */
& rdata , & rdrcnt ) ) { /* return data, length */
int converter ;
result_code = SVAL ( rparam , 0 ) ;
converter = SVAL ( rparam , 2 ) ; /* conversion factor */
if ( result_code = = 0 ) {
struct print_job_info job ;
p = rdata ;
for ( i = 0 ; i < SVAL ( rparam , 4 ) ; + + i ) {
job . id = SVAL ( p , 0 ) ;
job . priority = SVAL ( p , 2 ) ;
fstrcpy ( job . user ,
fix_char_ptr ( SVAL ( p , 4 ) , converter ,
rdata , rdrcnt ) ) ;
job . t = make_unix_date3 ( p + 12 ) ;
job . size = IVAL ( p , 16 ) ;
fstrcpy ( job . name , fix_char_ptr ( SVAL ( p , 24 ) ,
converter ,
rdata , rdrcnt ) ) ;
fn ( & job ) ;
p + = 28 ;
}
}
}
/* If any parameters or data were returned, free the storage. */
if ( rparam ) free ( rparam ) ;
if ( rdata ) free ( rdata ) ;
return i ;
}
1998-11-09 06:45:49 +03:00
/****************************************************************************
check for existance of a dir
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_chkpath ( struct cli_state * cli , char * path )
{
1999-12-13 16:27:58 +03:00
pstring path2 ;
1998-11-09 06:45:49 +03:00
char * p ;
1999-12-13 16:27:58 +03:00
safe_strcpy ( path2 , path , sizeof ( pstring ) ) ;
1998-11-09 06:45:49 +03:00
trim_string ( path2 , NULL , " \\ " ) ;
if ( ! * path2 ) * path2 = ' \\ ' ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1998-11-09 06:45:49 +03:00
set_message ( cli - > outbuf , 0 , 4 + strlen ( path2 ) , True ) ;
SCVAL ( cli - > outbuf , smb_com , SMBchkpth ) ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
p = smb_buf ( cli - > outbuf ) ;
* p + + = 4 ;
1999-12-13 16:27:58 +03:00
safe_strcpy ( p , path2 , strlen ( path2 ) ) ;
unix_to_dos ( p , True ) ;
1998-11-09 06:45:49 +03:00
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
return False ;
}
1999-12-13 16:27:58 +03:00
if ( cli_error ( cli , NULL , NULL , NULL ) ) return False ;
1998-11-09 06:45:49 +03:00
return True ;
}
/****************************************************************************
start a message sequence
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_message_start ( struct cli_state * cli , char * host , char * username ,
int * grp )
{
char * p ;
/* send a SMBsendstrt command */
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1998-11-09 06:45:49 +03:00
set_message ( cli - > outbuf , 0 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBsendstrt ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
p = smb_buf ( cli - > outbuf ) ;
* p + + = 4 ;
pstrcpy ( p , username ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1998-11-09 06:45:49 +03:00
p = skip_string ( p , 1 ) ;
* p + + = 4 ;
pstrcpy ( p , host ) ;
1999-12-13 16:27:58 +03:00
unix_to_dos ( p , True ) ;
1998-11-09 06:45:49 +03:00
p = skip_string ( p , 1 ) ;
set_message ( cli - > outbuf , 0 , PTR_DIFF ( p , smb_buf ( cli - > outbuf ) ) , False ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
return False ;
}
1999-12-13 16:27:58 +03:00
if ( cli_error ( cli , NULL , NULL , NULL ) ) return False ;
1998-11-09 06:45:49 +03:00
* grp = SVAL ( cli - > inbuf , smb_vwv0 ) ;
return True ;
}
/****************************************************************************
send a message
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_message_text ( struct cli_state * cli , char * msg , int len , int grp )
{
char * p ;
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1998-11-09 06:45:49 +03:00
set_message ( cli - > outbuf , 1 , len + 3 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBsendtxt ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , grp ) ;
p = smb_buf ( cli - > outbuf ) ;
* p = 1 ;
SSVAL ( p , 1 , len ) ;
memcpy ( p + 3 , msg , len ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
return False ;
}
1999-12-13 16:27:58 +03:00
if ( cli_error ( cli , NULL , NULL , NULL ) ) return False ;
1998-11-09 06:45:49 +03:00
return True ;
}
/****************************************************************************
end a message
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_message_end ( struct cli_state * cli , int grp )
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1998-11-09 06:45:49 +03:00
set_message ( cli - > outbuf , 1 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBsendend ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
SSVAL ( cli - > outbuf , smb_vwv0 , grp ) ;
cli_setup_packet ( cli ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
return False ;
}
1999-12-13 16:27:58 +03:00
if ( cli_error ( cli , NULL , NULL , NULL ) ) return False ;
1998-11-09 06:45:49 +03:00
return True ;
}
/****************************************************************************
query disk space
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL cli_dskattr ( struct cli_state * cli , int * bsize , int * total , int * avail )
{
1999-12-13 16:27:58 +03:00
memset ( cli - > outbuf , ' \0 ' , smb_size ) ;
1998-11-09 06:45:49 +03:00
set_message ( cli - > outbuf , 0 , 0 , True ) ;
CVAL ( cli - > outbuf , smb_com ) = SMBdskattr ;
SSVAL ( cli - > outbuf , smb_tid , cli - > cnum ) ;
cli_setup_packet ( cli ) ;
1999-12-13 16:27:58 +03:00
cli_send_smb ( cli ) ;
1998-11-09 06:45:49 +03:00
if ( ! cli_receive_smb ( cli ) ) {
return False ;
}
* bsize = SVAL ( cli - > inbuf , smb_vwv1 ) * SVAL ( cli - > inbuf , smb_vwv2 ) ;
* total = SVAL ( cli - > inbuf , smb_vwv0 ) ;
* avail = SVAL ( cli - > inbuf , smb_vwv3 ) ;
return True ;
}
1999-11-24 23:24:33 +03:00
1999-12-13 16:27:58 +03:00
/****************************************************************************
Attempt a NetBIOS session request , falling back to * SMBSERVER if needed .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL attempt_netbios_session_request ( struct cli_state * cli , char * srchost , char * desthost ,
struct in_addr * pdest_ip )
1999-12-02 21:49:28 +03:00
{
1999-12-13 16:27:58 +03:00
struct nmb_name calling , called ;
1999-12-02 21:49:28 +03:00
2000-01-07 09:55:36 +03:00
make_nmb_name ( & calling , srchost , 0x0 ) ;
1999-12-02 21:49:28 +03:00
1999-12-13 16:27:58 +03:00
/*
* If the called name is an IP address
* then use * SMBSERVER immediately .
*/
1999-12-02 21:49:28 +03:00
1999-12-13 16:27:58 +03:00
if ( is_ipaddress ( desthost ) )
2000-01-07 09:55:36 +03:00
make_nmb_name ( & called , " *SMBSERVER " , 0x20 ) ;
1999-12-13 16:27:58 +03:00
else
2000-01-07 09:55:36 +03:00
make_nmb_name ( & called , desthost , 0x20 ) ;
1999-12-02 21:49:28 +03:00
1999-12-13 16:27:58 +03:00
if ( ! cli_session_request ( cli , & calling , & called ) ) {
struct nmb_name smbservername ;
/*
* If the name wasn ' t * SMBSERVER then
* try with * SMBSERVER if the first name fails .
*/
cli_shutdown ( cli ) ;
2000-01-07 09:55:36 +03:00
make_nmb_name ( & smbservername , " *SMBSERVER " , 0x20 ) ;
1999-12-13 16:27:58 +03:00
if ( ! nmb_name_equal ( & called , & smbservername ) | |
! cli_initialise ( cli ) | |
! cli_connect ( cli , desthost , pdest_ip ) | |
! cli_session_request ( cli , & calling , & smbservername ) ) {
DEBUG ( 0 , ( " attempt_netbios_session_request: %s rejected the session for name *SMBSERVER. \n " ,
desthost ) ) ;
cli_shutdown ( cli ) ;
return False ;
}
}
return True ;
1999-12-02 21:49:28 +03:00
}