2023-10-31 15:48:09 +01:00
/*
2003-08-13 01:53:07 +00:00
Unix SMB / CIFS implementation .
RAW_SFILEINFO_ * calls
Copyright ( C ) James Myers 2003
Copyright ( C ) Andrew Tridgell 2003
2007-03-05 22:26:38 +00:00
Copyright ( C ) James Peach 2007
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 02:07:03 +00:00
the Free Software Foundation ; either version 3 of the License , or
2003-08-13 01:53:07 +00:00
( at your option ) any later version .
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00: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 .
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
You should have received a copy of the GNU General Public License
2007-07-10 02:07:03 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2003-08-13 01:53:07 +00:00
*/
# include "includes.h"
2004-11-01 01:03:22 +00:00
# include "libcli/raw/libcliraw.h"
2008-04-02 04:53:27 +02:00
# include "libcli/raw/raw_proto.h"
2006-06-29 07:02:14 +00:00
# include "librpc/gen_ndr/ndr_security.h"
2003-08-13 01:53:07 +00:00
2005-11-18 06:28:15 +00:00
/*
Handle setfileinfo / setpathinfo passthu constructions
*/
2007-10-06 22:28:14 +00:00
bool smb_raw_setfileinfo_passthru ( TALLOC_CTX * mem_ctx ,
2005-11-18 06:28:15 +00:00
enum smb_setfileinfo_level level ,
2023-10-31 15:48:09 +01:00
union smb_setfileinfo * parms ,
2005-11-18 06:28:15 +00:00
DATA_BLOB * blob )
2023-10-31 15:48:09 +01:00
{
2010-01-05 09:42:54 -08:00
unsigned int len ;
2003-08-13 01:53:07 +00:00
# define NEED_BLOB(n) do { \
* blob = data_blob_talloc ( mem_ctx , NULL , n ) ; \
2008-09-23 16:45:10 +10:00
if ( blob - > data = = NULL & & n ! = 0 ) return false ; \
2003-08-13 01:53:07 +00:00
} while ( 0 )
2005-11-18 06:28:15 +00:00
switch ( level ) {
case RAW_SFILEINFO_BASIC_INFORMATION :
NEED_BLOB ( 40 ) ;
smbcli_push_nttime ( blob - > data , 0 , parms - > basic_info . in . create_time ) ;
smbcli_push_nttime ( blob - > data , 8 , parms - > basic_info . in . access_time ) ;
smbcli_push_nttime ( blob - > data , 16 , parms - > basic_info . in . write_time ) ;
smbcli_push_nttime ( blob - > data , 24 , parms - > basic_info . in . change_time ) ;
SIVAL ( blob - > data , 32 , parms - > basic_info . in . attrib ) ;
SIVAL ( blob - > data , 36 , 0 ) ; /* padding */
2007-10-06 22:28:14 +00:00
return true ;
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_DISPOSITION_INFORMATION :
NEED_BLOB ( 4 ) ;
SIVAL ( blob - > data , 0 , parms - > disposition_info . in . delete_on_close ) ;
2007-10-06 22:28:14 +00:00
return true ;
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_ALLOCATION_INFORMATION :
NEED_BLOB ( 8 ) ;
SBVAL ( blob - > data , 0 , parms - > allocation_info . in . alloc_size ) ;
2007-10-06 22:28:14 +00:00
return true ;
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_END_OF_FILE_INFORMATION :
NEED_BLOB ( 8 ) ;
SBVAL ( blob - > data , 0 , parms - > end_of_file_info . in . size ) ;
2007-10-06 22:28:14 +00:00
return true ;
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_RENAME_INFORMATION :
NEED_BLOB ( 12 ) ;
SIVAL ( blob - > data , 0 , parms - > rename_information . in . overwrite ) ;
SIVAL ( blob - > data , 4 , parms - > rename_information . in . root_fid ) ;
len = smbcli_blob_append_string ( NULL , mem_ctx , blob ,
2023-10-31 15:48:09 +01:00
parms - > rename_information . in . new_name ,
2005-11-18 06:28:15 +00:00
STR_UNICODE | STR_TERMINATE ) ;
SIVAL ( blob - > data , 8 , len - 2 ) ;
2007-10-06 22:28:14 +00:00
return true ;
2005-11-18 06:28:15 +00:00
2008-02-14 14:54:21 +11:00
case RAW_SFILEINFO_RENAME_INFORMATION_SMB2 :
NEED_BLOB ( 20 ) ;
SIVAL ( blob - > data , 0 , parms - > rename_information . in . overwrite ) ;
2011-08-26 21:14:04 -07:00
SIVAL ( blob - > data , 4 , 0 ) ;
2008-02-14 14:54:21 +11:00
SBVAL ( blob - > data , 8 , parms - > rename_information . in . root_fid ) ;
len = smbcli_blob_append_string ( NULL , mem_ctx , blob ,
2023-10-31 15:48:09 +01:00
parms - > rename_information . in . new_name ,
2008-02-14 14:54:21 +11:00
STR_UNICODE | STR_TERMINATE ) ;
SIVAL ( blob - > data , 16 , len - 2 ) ;
return true ;
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_POSITION_INFORMATION :
NEED_BLOB ( 8 ) ;
SBVAL ( blob - > data , 0 , parms - > position_information . in . position ) ;
2007-10-06 22:28:14 +00:00
return true ;
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_MODE_INFORMATION :
NEED_BLOB ( 4 ) ;
SIVAL ( blob - > data , 0 , parms - > mode_information . in . mode ) ;
2007-10-06 22:28:14 +00:00
return true ;
2006-06-29 07:02:14 +00:00
case RAW_FILEINFO_SEC_DESC : {
2007-11-09 19:24:51 +01:00
enum ndr_err_code ndr_err ;
2010-05-09 17:20:01 +02:00
ndr_err = ndr_push_struct_blob ( blob , mem_ctx , parms - > set_secdesc . in . sd ,
2007-11-09 19:24:51 +01:00
( ndr_push_flags_fn_t ) ndr_push_security_descriptor ) ;
if ( ! NDR_ERR_CODE_IS_SUCCESS ( ndr_err ) ) {
return false ;
}
2006-06-29 07:02:14 +00:00
2007-10-06 22:28:14 +00:00
return true ;
2006-06-29 07:02:14 +00:00
}
2008-09-23 16:45:10 +10:00
case RAW_SFILEINFO_FULL_EA_INFORMATION :
printf ( " num_eas=%d \n " , parms - > full_ea_information . in . eas . num_eas ) ;
NEED_BLOB ( ea_list_size_chained (
parms - > full_ea_information . in . eas . num_eas ,
parms - > full_ea_information . in . eas . eas , 4 ) ) ;
2023-10-31 15:48:09 +01:00
ea_put_list_chained ( blob - > data ,
2008-09-23 16:45:10 +10:00
parms - > full_ea_information . in . eas . num_eas ,
parms - > full_ea_information . in . eas . eas , 4 ) ;
return true ;
2005-11-18 06:28:15 +00:00
/* Unhandled levels */
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_PIPE_INFORMATION :
case RAW_SFILEINFO_VALID_DATA_INFORMATION :
case RAW_SFILEINFO_SHORT_NAME_INFORMATION :
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_1025 :
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_1027 :
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_1029 :
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_1030 :
case RAW_SFILEINFO_1031 :
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_1032 :
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_1036 :
case RAW_SFILEINFO_1041 :
case RAW_SFILEINFO_1042 :
case RAW_SFILEINFO_1043 :
case RAW_SFILEINFO_1044 :
2005-11-18 06:28:15 +00:00
break ;
default :
DEBUG ( 0 , ( " Unhandled setfileinfo passthru level %d \n " , level ) ) ;
2007-10-06 22:28:14 +00:00
return false ;
2005-11-18 06:28:15 +00:00
}
2007-10-06 22:28:14 +00:00
return false ;
2005-11-18 06:28:15 +00:00
}
/*
Handle setfileinfo / setpathinfo trans2 backend .
*/
2007-10-06 22:28:14 +00:00
static bool smb_raw_setinfo_backend ( struct smbcli_tree * tree ,
2005-11-18 06:28:15 +00:00
TALLOC_CTX * mem_ctx ,
2023-10-31 15:48:09 +01:00
union smb_setfileinfo * parms ,
2005-11-18 06:28:15 +00:00
DATA_BLOB * blob )
2023-10-31 15:48:09 +01:00
{
2003-08-13 01:53:07 +00:00
switch ( parms - > generic . level ) {
case RAW_SFILEINFO_GENERIC :
case RAW_SFILEINFO_SETATTR :
case RAW_SFILEINFO_SETATTRE :
2004-11-18 01:41:43 +00:00
case RAW_SFILEINFO_SEC_DESC :
2003-08-13 01:53:07 +00:00
/* not handled here */
2007-10-06 22:28:14 +00:00
return false ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_STANDARD :
NEED_BLOB ( 12 ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date2 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
blob - > data , 0 , parms - > standard . in . create_time ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date2 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
blob - > data , 4 , parms - > standard . in . access_time ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date2 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
blob - > data , 8 , parms - > standard . in . write_time ) ;
2007-10-06 22:28:14 +00:00
return true ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_EA_SET :
2004-12-17 04:51:23 +00:00
NEED_BLOB ( ea_list_size ( parms - > ea_set . in . num_eas , parms - > ea_set . in . eas ) ) ;
ea_put_list ( blob - > data , parms - > ea_set . in . num_eas , parms - > ea_set . in . eas ) ;
2007-10-06 22:28:14 +00:00
return true ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_BASIC_INFO :
case RAW_SFILEINFO_BASIC_INFORMATION :
2023-10-31 15:48:09 +01:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_BASIC_INFORMATION ,
2005-11-18 06:28:15 +00:00
parms , blob ) ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_UNIX_BASIC :
2006-06-08 07:11:25 +00:00
NEED_BLOB ( 100 ) ;
2003-08-13 01:53:07 +00:00
SBVAL ( blob - > data , 0 , parms - > unix_basic . in . end_of_file ) ;
SBVAL ( blob - > data , 8 , parms - > unix_basic . in . num_bytes ) ;
2004-08-04 13:23:35 +00:00
smbcli_push_nttime ( blob - > data , 16 , parms - > unix_basic . in . status_change_time ) ;
smbcli_push_nttime ( blob - > data , 24 , parms - > unix_basic . in . access_time ) ;
smbcli_push_nttime ( blob - > data , 32 , parms - > unix_basic . in . change_time ) ;
2003-08-13 01:53:07 +00:00
SBVAL ( blob - > data , 40 , parms - > unix_basic . in . uid ) ;
SBVAL ( blob - > data , 48 , parms - > unix_basic . in . gid ) ;
SIVAL ( blob - > data , 56 , parms - > unix_basic . in . file_type ) ;
SBVAL ( blob - > data , 60 , parms - > unix_basic . in . dev_major ) ;
SBVAL ( blob - > data , 68 , parms - > unix_basic . in . dev_minor ) ;
SBVAL ( blob - > data , 76 , parms - > unix_basic . in . unique_id ) ;
2006-06-08 07:11:25 +00:00
SBVAL ( blob - > data , 84 , parms - > unix_basic . in . permissions ) ;
SBVAL ( blob - > data , 92 , parms - > unix_basic . in . nlink ) ;
2007-10-06 22:28:14 +00:00
return true ;
2003-08-13 01:53:07 +00:00
2007-03-05 22:26:38 +00:00
case RAW_SFILEINFO_UNIX_INFO2 :
NEED_BLOB ( 116 ) ;
SBVAL ( blob - > data , 0 , parms - > unix_info2 . in . end_of_file ) ;
SBVAL ( blob - > data , 8 , parms - > unix_info2 . in . num_bytes ) ;
smbcli_push_nttime ( blob - > data , 16 , parms - > unix_info2 . in . status_change_time ) ;
smbcli_push_nttime ( blob - > data , 24 , parms - > unix_info2 . in . access_time ) ;
smbcli_push_nttime ( blob - > data , 32 , parms - > unix_info2 . in . change_time ) ;
SBVAL ( blob - > data , 40 , parms - > unix_info2 . in . uid ) ;
SBVAL ( blob - > data , 48 , parms - > unix_info2 . in . gid ) ;
2007-11-11 13:59:01 +01:00
SIVAL ( blob - > data , 56 , parms - > unix_info2 . in . file_type ) ;
2007-03-05 22:26:38 +00:00
SBVAL ( blob - > data , 60 , parms - > unix_info2 . in . dev_major ) ;
SBVAL ( blob - > data , 68 , parms - > unix_info2 . in . dev_minor ) ;
SBVAL ( blob - > data , 76 , parms - > unix_info2 . in . unique_id ) ;
SBVAL ( blob - > data , 84 , parms - > unix_info2 . in . permissions ) ;
SBVAL ( blob - > data , 92 , parms - > unix_info2 . in . nlink ) ;
smbcli_push_nttime ( blob - > data , 100 , parms - > unix_info2 . in . create_time ) ;
SIVAL ( blob - > data , 108 , parms - > unix_info2 . in . file_flags ) ;
SIVAL ( blob - > data , 112 , parms - > unix_info2 . in . flags_mask ) ;
2007-10-06 22:28:14 +00:00
return true ;
2007-03-05 22:26:38 +00:00
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_DISPOSITION_INFO :
case RAW_SFILEINFO_DISPOSITION_INFORMATION :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_DISPOSITION_INFORMATION ,
parms , blob ) ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_ALLOCATION_INFO :
case RAW_SFILEINFO_ALLOCATION_INFORMATION :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_ALLOCATION_INFORMATION ,
parms , blob ) ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_END_OF_FILE_INFO :
case RAW_SFILEINFO_END_OF_FILE_INFORMATION :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_END_OF_FILE_INFORMATION ,
parms , blob ) ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_RENAME_INFORMATION :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_RENAME_INFORMATION ,
parms , blob ) ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_POSITION_INFORMATION :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_POSITION_INFORMATION ,
parms , blob ) ;
2003-08-13 01:53:07 +00:00
case RAW_SFILEINFO_MODE_INFORMATION :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , RAW_SFILEINFO_MODE_INFORMATION ,
parms , blob ) ;
2023-10-31 15:48:09 +01:00
2005-11-18 06:28:15 +00:00
/* Unhandled passthru levels */
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_PIPE_INFORMATION :
case RAW_SFILEINFO_VALID_DATA_INFORMATION :
case RAW_SFILEINFO_SHORT_NAME_INFORMATION :
case RAW_SFILEINFO_FULL_EA_INFORMATION :
2005-11-10 03:48:56 +00:00
case RAW_SFILEINFO_1025 :
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_1027 :
2005-11-10 03:48:56 +00:00
case RAW_SFILEINFO_1029 :
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_1030 :
case RAW_SFILEINFO_1031 :
2005-11-10 03:48:56 +00:00
case RAW_SFILEINFO_1032 :
2008-06-02 11:02:57 +10:00
case RAW_SFILEINFO_1036 :
case RAW_SFILEINFO_1041 :
case RAW_SFILEINFO_1042 :
case RAW_SFILEINFO_1043 :
case RAW_SFILEINFO_1044 :
2005-11-18 06:28:15 +00:00
return smb_raw_setfileinfo_passthru ( mem_ctx , parms - > generic . level ,
parms , blob ) ;
2011-06-11 16:55:16 +02:00
/* Unhandled levels */
2005-11-18 06:28:15 +00:00
case RAW_SFILEINFO_UNIX_LINK :
case RAW_SFILEINFO_UNIX_HLINK :
2008-02-14 14:54:21 +11:00
case RAW_SFILEINFO_RENAME_INFORMATION_SMB2 :
2011-06-11 16:55:16 +02:00
case RAW_SFILEINFO_LINK_INFORMATION :
2005-11-10 03:48:56 +00:00
break ;
2003-08-13 01:53:07 +00:00
}
2007-10-06 22:28:14 +00:00
return false ;
2003-08-13 01:53:07 +00:00
}
/****************************************************************************
Very raw set file info - takes data blob ( async send )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-08-04 13:23:35 +00:00
static struct smbcli_request * smb_raw_setfileinfo_blob_send ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
TALLOC_CTX * mem_ctx ,
2004-05-25 17:24:24 +00:00
uint16_t fnum ,
uint16_t info_level ,
2003-08-13 01:53:07 +00:00
DATA_BLOB * blob )
{
struct smb_trans2 tp ;
2004-05-25 17:24:24 +00:00
uint16_t setup = TRANSACT2_SETFILEINFO ;
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
tp . in . max_setup = 0 ;
2023-10-31 15:48:09 +01:00
tp . in . flags = 0 ;
2003-08-13 01:53:07 +00:00
tp . in . timeout = 0 ;
tp . in . setup_count = 1 ;
tp . in . max_param = 2 ;
tp . in . max_data = 0 ;
tp . in . setup = & setup ;
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
tp . in . params = data_blob_talloc ( mem_ctx , NULL , 6 ) ;
if ( ! tp . in . params . data ) {
return NULL ;
}
SSVAL ( tp . in . params . data , 0 , fnum ) ;
SSVAL ( tp . in . params . data , 2 , info_level ) ;
SSVAL ( tp . in . params . data , 4 , 0 ) ; /* reserved */
tp . in . data = * blob ;
return smb_raw_trans2_send ( tree , & tp ) ;
}
/****************************************************************************
Very raw set path info - takes data blob
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-08-04 13:23:35 +00:00
static struct smbcli_request * smb_raw_setpathinfo_blob_send ( struct smbcli_tree * tree ,
2004-08-11 21:10:16 +00:00
TALLOC_CTX * mem_ctx ,
const char * fname ,
uint16_t info_level ,
DATA_BLOB * blob )
2003-08-13 01:53:07 +00:00
{
struct smb_trans2 tp ;
2004-05-25 17:24:24 +00:00
uint16_t setup = TRANSACT2_SETPATHINFO ;
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
tp . in . max_setup = 0 ;
2023-10-31 15:48:09 +01:00
tp . in . flags = 0 ;
2003-08-13 01:53:07 +00:00
tp . in . timeout = 0 ;
tp . in . setup_count = 1 ;
tp . in . max_param = 2 ;
tp . in . max_data = 0 ;
tp . in . setup = & setup ;
2023-10-31 15:48:09 +01:00
2004-08-11 21:10:16 +00:00
tp . in . params = data_blob_talloc ( mem_ctx , NULL , 6 ) ;
2003-08-13 01:53:07 +00:00
if ( ! tp . in . params . data ) {
return NULL ;
}
SSVAL ( tp . in . params . data , 0 , info_level ) ;
2004-08-11 21:10:16 +00:00
SIVAL ( tp . in . params . data , 2 , 0 ) ;
2023-10-31 15:48:09 +01:00
smbcli_blob_append_string ( tree - > session , mem_ctx ,
2004-08-11 21:10:16 +00:00
& tp . in . params ,
fname , STR_TERMINATE ) ;
2003-08-13 01:53:07 +00:00
tp . in . data = * blob ;
return smb_raw_trans2_send ( tree , & tp ) ;
}
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
/****************************************************************************
Handle setattr ( async send )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-08-04 13:23:35 +00:00
static struct smbcli_request * smb_raw_setattr_send ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
union smb_setfileinfo * parms )
{
2004-08-04 13:23:35 +00:00
struct smbcli_request * req ;
2003-08-13 01:53:07 +00:00
2004-08-04 13:23:35 +00:00
req = smbcli_request_setup ( tree , SMBsetatr , 8 , 0 ) ;
2003-08-13 01:53:07 +00:00
if ( ! req ) return NULL ;
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
SSVAL ( req - > out . vwv , VWV ( 0 ) , parms - > setattr . in . attrib ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date3 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
req - > out . vwv , VWV ( 1 ) , parms - > setattr . in . write_time ) ;
2003-08-13 01:53:07 +00:00
memset ( req - > out . vwv + VWV ( 3 ) , 0 , 10 ) ; /* reserved */
2006-03-12 22:48:25 +00:00
smbcli_req_append_ascii4 ( req , parms - > setattr . in . file . path , STR_TERMINATE ) ;
2004-08-04 13:23:35 +00:00
smbcli_req_append_ascii4 ( req , " " , STR_TERMINATE ) ;
2023-10-31 15:48:09 +01:00
2004-08-04 13:23:35 +00:00
if ( ! smbcli_request_send ( req ) ) {
smbcli_request_destroy ( req ) ;
2003-08-13 01:53:07 +00:00
return NULL ;
}
return req ;
}
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
/****************************************************************************
Handle setattrE . ( async send )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-08-04 13:23:35 +00:00
static struct smbcli_request * smb_raw_setattrE_send ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
union smb_setfileinfo * parms )
{
2004-08-04 13:23:35 +00:00
struct smbcli_request * req ;
2003-08-13 01:53:07 +00:00
2004-08-04 13:23:35 +00:00
req = smbcli_request_setup ( tree , SMBsetattrE , 7 , 0 ) ;
2003-08-13 01:53:07 +00:00
if ( ! req ) return NULL ;
2023-10-31 15:48:09 +01:00
2006-03-12 22:48:25 +00:00
SSVAL ( req - > out . vwv , VWV ( 0 ) , parms - > setattre . in . file . fnum ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date2 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
req - > out . vwv , VWV ( 1 ) , parms - > setattre . in . create_time ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date2 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
req - > out . vwv , VWV ( 3 ) , parms - > setattre . in . access_time ) ;
2023-10-31 15:48:09 +01:00
raw_push_dos_date2 ( tree - > session - > transport ,
2004-04-10 20:18:22 +00:00
req - > out . vwv , VWV ( 5 ) , parms - > setattre . in . write_time ) ;
2003-08-15 15:13:43 +00:00
2004-08-04 13:23:35 +00:00
if ( ! smbcli_request_send ( req ) ) {
smbcli_request_destroy ( req ) ;
2003-08-13 01:53:07 +00:00
return NULL ;
}
return req ;
}
/****************************************************************************
Set file info ( async send )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-08-04 13:23:35 +00:00
struct smbcli_request * smb_raw_setfileinfo_send ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
union smb_setfileinfo * parms )
{
DATA_BLOB blob ;
TALLOC_CTX * mem_ctx ;
2004-08-04 13:23:35 +00:00
struct smbcli_request * req ;
2003-08-13 01:53:07 +00:00
if ( parms - > generic . level = = RAW_SFILEINFO_SETATTRE ) {
return smb_raw_setattrE_send ( tree , parms ) ;
}
2004-11-18 01:41:43 +00:00
if ( parms - > generic . level = = RAW_SFILEINFO_SEC_DESC ) {
return smb_raw_set_secdesc_send ( tree , parms ) ;
}
2003-08-13 01:53:07 +00:00
if ( parms - > generic . level > = RAW_SFILEINFO_GENERIC ) {
return NULL ;
}
mem_ctx = talloc_init ( " setpathinfo " ) ;
if ( ! mem_ctx ) return NULL ;
if ( ! smb_raw_setinfo_backend ( tree , mem_ctx , parms , & blob ) ) {
2005-01-27 07:08:20 +00:00
talloc_free ( mem_ctx ) ;
2003-08-13 01:53:07 +00:00
return NULL ;
}
2023-10-31 15:48:09 +01:00
2003-08-13 01:53:07 +00:00
/* send request and process the output */
2023-10-31 15:48:09 +01:00
req = smb_raw_setfileinfo_blob_send ( tree ,
2003-08-13 01:53:07 +00:00
mem_ctx ,
2023-10-31 15:48:09 +01:00
parms - > generic . in . file . fnum ,
parms - > generic . level ,
2003-08-13 01:53:07 +00:00
& blob ) ;
2005-01-27 07:08:20 +00:00
talloc_free ( mem_ctx ) ;
2003-08-13 01:53:07 +00:00
return req ;
}
/****************************************************************************
Set file info ( async send )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-04-02 04:53:27 +02:00
_PUBLIC_ NTSTATUS smb_raw_setfileinfo ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
union smb_setfileinfo * parms )
{
2004-08-04 13:23:35 +00:00
struct smbcli_request * req = smb_raw_setfileinfo_send ( tree , parms ) ;
return smbcli_request_simple_recv ( req ) ;
2003-08-13 01:53:07 +00:00
}
/****************************************************************************
Set path info ( async send )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-04-02 04:53:27 +02:00
_PUBLIC_ struct smbcli_request * smb_raw_setpathinfo_send ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
union smb_setfileinfo * parms )
{
DATA_BLOB blob ;
TALLOC_CTX * mem_ctx ;
2004-08-04 13:23:35 +00:00
struct smbcli_request * req ;
2003-08-13 01:53:07 +00:00
if ( parms - > generic . level = = RAW_SFILEINFO_SETATTR ) {
return smb_raw_setattr_send ( tree , parms ) ;
}
if ( parms - > generic . level > = RAW_SFILEINFO_GENERIC ) {
return NULL ;
}
mem_ctx = talloc_init ( " setpathinfo " ) ;
if ( ! mem_ctx ) return NULL ;
if ( ! smb_raw_setinfo_backend ( tree , mem_ctx , parms , & blob ) ) {
2005-01-27 07:08:20 +00:00
talloc_free ( mem_ctx ) ;
2003-08-13 01:53:07 +00:00
return NULL ;
}
/* send request and process the output */
2023-10-31 15:48:09 +01:00
req = smb_raw_setpathinfo_blob_send ( tree ,
2003-08-13 01:53:07 +00:00
mem_ctx ,
2023-10-31 15:48:09 +01:00
parms - > generic . in . file . path ,
2003-08-13 01:53:07 +00:00
parms - > generic . level ,
& blob ) ;
2005-01-27 07:08:20 +00:00
talloc_free ( mem_ctx ) ;
2003-08-13 01:53:07 +00:00
return req ;
}
/****************************************************************************
Set path info ( sync interface )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-04-02 04:53:27 +02:00
_PUBLIC_ NTSTATUS smb_raw_setpathinfo ( struct smbcli_tree * tree ,
2003-08-13 01:53:07 +00:00
union smb_setfileinfo * parms )
{
2004-08-04 13:23:35 +00:00
struct smbcli_request * req = smb_raw_setpathinfo_send ( tree , parms ) ;
return smbcli_request_simple_recv ( req ) ;
2003-08-13 01:53:07 +00:00
}