2007-12-01 05:02:19 +03:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2000-04-25 18:04:06 +04:00
client transaction calls
Copyright ( C ) Andrew Tridgell 1994 - 1998
2007-12-01 05:02:19 +03:00
2000-04-25 18:04:06 +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
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2000-04-25 18:04:06 +04:00
( at your option ) any later version .
2007-12-01 05:02:19 +03:00
2000-04-25 18:04:06 +04:00
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 .
2007-12-01 05:02:19 +03:00
2000-04-25 18:04:06 +04:00
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2000-04-25 18:04:06 +04:00
*/
# include "includes.h"
2011-05-06 13:47:43 +04:00
# include "libsmb/libsmb.h"
2011-04-28 19:38:09 +04:00
# include "../lib/util/tevent_ntstatus.h"
2010-08-26 11:58:09 +04:00
# include "async_smb.h"
2011-08-28 20:05:04 +04:00
# include "../libcli/smb/smbXcli_base.h"
2008-09-09 16:47:23 +04:00
struct cli_trans_state {
struct cli_state * cli ;
2011-08-28 20:05:04 +04:00
struct tevent_req * req ;
struct cli_trans_state * * ptr ;
2008-09-09 16:47:23 +04:00
} ;
2011-06-08 12:31:23 +04:00
static int cli_trans_state_destructor ( struct cli_trans_state * state )
{
2011-08-28 20:05:04 +04:00
talloc_set_destructor ( state - > ptr , NULL ) ;
talloc_free ( state - > ptr ) ;
2011-06-08 12:31:23 +04:00
return 0 ;
}
2011-08-28 20:05:04 +04:00
static int cli_trans_state_ptr_destructor ( struct cli_trans_state * * ptr )
2009-04-05 22:51:52 +04:00
{
2011-08-28 20:05:04 +04:00
struct cli_trans_state * state = * ptr ;
void * parent = talloc_parent ( state ) ;
2008-09-09 16:47:23 +04:00
2011-08-28 20:05:04 +04:00
talloc_set_destructor ( state , NULL ) ;
2011-06-08 02:44:34 +04:00
2011-08-28 20:05:04 +04:00
talloc_reparent ( state , parent , state - > req ) ;
talloc_free ( state ) ;
return 0 ;
2008-09-09 16:47:23 +04:00
}
2009-04-05 22:51:52 +04:00
struct tevent_req * cli_trans_send (
2011-10-26 17:43:08 +04:00
TALLOC_CTX * mem_ctx , struct tevent_context * ev ,
2016-08-18 22:45:32 +03:00
struct cli_state * cli , uint16_t additional_flags2 , uint8_t cmd ,
2009-04-05 22:51:52 +04:00
const char * pipe_name , uint16_t fid , uint16_t function , int flags ,
uint16_t * setup , uint8_t num_setup , uint8_t max_setup ,
uint8_t * param , uint32_t num_param , uint32_t max_param ,
uint8_t * data , uint32_t num_data , uint32_t max_data )
2008-09-09 16:47:23 +04:00
{
2009-04-05 22:51:52 +04:00
struct cli_trans_state * state ;
2011-08-28 20:05:04 +04:00
uint8_t additional_flags = 0 ;
uint8_t clear_flags = 0 ;
uint16_t clear_flags2 = 0 ;
2009-03-09 11:50:36 +03:00
2011-08-28 20:05:04 +04:00
state = talloc_zero ( mem_ctx , struct cli_trans_state ) ;
if ( state = = NULL ) {
2009-04-05 22:51:52 +04:00
return NULL ;
2008-09-09 16:47:23 +04:00
}
2009-04-05 22:51:52 +04:00
state - > cli = cli ;
2011-08-28 20:05:04 +04:00
state - > ptr = talloc ( state , struct cli_trans_state * ) ;
if ( state - > ptr = = NULL ) {
talloc_free ( state ) ;
return NULL ;
2008-09-09 16:47:23 +04:00
}
2011-08-28 20:05:04 +04:00
* state - > ptr = state ;
state - > req = smb1cli_trans_send ( state , ev ,
cli - > conn , cmd ,
additional_flags , clear_flags ,
additional_flags2 , clear_flags2 ,
cli - > timeout ,
2012-07-23 23:34:58 +04:00
cli - > smb1 . pid ,
cli - > smb1 . tcon ,
2012-07-23 22:15:21 +04:00
cli - > smb1 . session ,
2011-08-28 20:05:04 +04:00
pipe_name , fid , function , flags ,
setup , num_setup , max_setup ,
param , num_param , max_param ,
data , num_data , max_data ) ;
if ( state - > req = = NULL ) {
talloc_free ( state ) ;
return NULL ;
2008-09-09 16:47:23 +04:00
}
2011-06-08 18:11:00 +04:00
2011-08-28 20:05:04 +04:00
talloc_reparent ( state , state - > req , state - > ptr ) ;
2011-06-08 12:31:23 +04:00
talloc_set_destructor ( state , cli_trans_state_destructor ) ;
2011-08-28 20:05:04 +04:00
talloc_set_destructor ( state - > ptr , cli_trans_state_ptr_destructor ) ;
2011-06-08 18:11:00 +04:00
2011-08-28 20:05:04 +04:00
return state - > req ;
2008-09-09 16:47:23 +04:00
}
2009-04-05 22:51:52 +04:00
NTSTATUS cli_trans_recv ( struct tevent_req * req , TALLOC_CTX * mem_ctx ,
2010-08-05 14:48:52 +04:00
uint16_t * recv_flags2 ,
2009-11-14 13:12:50 +03:00
uint16_t * * setup , uint8_t min_setup ,
uint8_t * num_setup ,
uint8_t * * param , uint32_t min_param ,
uint32_t * num_param ,
uint8_t * * data , uint32_t min_data ,
uint32_t * num_data )
2008-09-09 16:47:23 +04:00
{
2008-12-01 10:23:35 +03:00
NTSTATUS status ;
2011-08-28 20:05:04 +04:00
void * parent = talloc_parent ( req ) ;
struct cli_trans_state * state =
talloc_get_type ( parent ,
struct cli_trans_state ) ;
bool map_dos_errors = true ;
status = smb1cli_trans_recv ( req , mem_ctx , recv_flags2 ,
setup , min_setup , num_setup ,
param , min_param , num_param ,
data , min_data , num_data ) ;
if ( state ) {
map_dos_errors = state - > cli - > map_dos_errors ;
state - > cli - > raw_status = status ;
talloc_free ( state - > ptr ) ;
state = NULL ;
}
if ( NT_STATUS_IS_DOS ( status ) & & map_dos_errors ) {
uint8_t eclass = NT_STATUS_DOS_CLASS ( status ) ;
uint16_t ecode = NT_STATUS_DOS_CODE ( status ) ;
/*
* TODO : is it really a good idea to do a mapping here ?
*
* The old cli_pull_error ( ) also does it , so I do not change
* the behavior yet .
*/
status = dos_to_ntstatus ( eclass , ecode ) ;
2008-09-09 16:47:23 +04:00
}
2011-08-28 20:05:04 +04:00
return status ;
2008-09-09 16:47:23 +04:00
}
NTSTATUS cli_trans ( TALLOC_CTX * mem_ctx , struct cli_state * cli ,
uint8_t trans_cmd ,
const char * pipe_name , uint16_t fid , uint16_t function ,
int flags ,
uint16_t * setup , uint8_t num_setup , uint8_t max_setup ,
uint8_t * param , uint32_t num_param , uint32_t max_param ,
uint8_t * data , uint32_t num_data , uint32_t max_data ,
2010-08-05 14:48:52 +04:00
uint16_t * recv_flags2 ,
2009-11-14 13:12:50 +03:00
uint16_t * * rsetup , uint8_t min_rsetup , uint8_t * num_rsetup ,
uint8_t * * rparam , uint32_t min_rparam , uint32_t * num_rparam ,
uint8_t * * rdata , uint32_t min_rdata , uint32_t * num_rdata )
2008-09-09 16:47:23 +04:00
{
2011-08-28 20:05:04 +04:00
NTSTATUS status ;
uint8_t additional_flags = 0 ;
uint8_t clear_flags = 0 ;
uint16_t additional_flags2 = 0 ;
uint16_t clear_flags2 = 0 ;
2008-09-09 16:47:23 +04:00
2011-08-28 20:05:04 +04:00
status = smb1cli_trans ( mem_ctx ,
cli - > conn , trans_cmd ,
additional_flags , clear_flags ,
additional_flags2 , clear_flags2 ,
cli - > timeout ,
2012-07-23 23:34:58 +04:00
cli - > smb1 . pid ,
cli - > smb1 . tcon ,
2012-07-23 22:15:21 +04:00
cli - > smb1 . session ,
2011-08-28 20:05:04 +04:00
pipe_name , fid , function , flags ,
setup , num_setup , max_setup ,
param , num_param , max_param ,
data , num_data , max_data ,
recv_flags2 ,
rsetup , min_rsetup , num_rsetup ,
rparam , min_rparam , num_rparam ,
rdata , min_rdata , num_rdata ) ;
cli - > raw_status = status ;
if ( NT_STATUS_IS_DOS ( status ) & & cli - > map_dos_errors ) {
uint8_t eclass = NT_STATUS_DOS_CLASS ( status ) ;
uint16_t ecode = NT_STATUS_DOS_CODE ( status ) ;
2008-09-09 16:47:23 +04:00
/*
2011-08-28 20:05:04 +04:00
* TODO : is it really a good idea to do a mapping here ?
*
* The old cli_pull_error ( ) also does it , so I do not change
* the behavior yet .
2008-09-09 16:47:23 +04:00
*/
2011-08-28 20:05:04 +04:00
status = dos_to_ntstatus ( eclass , ecode ) ;
2008-09-09 16:47:23 +04:00
}
return status ;
}