2012-02-01 14:42:39 +01:00
/*
2002-08-18 18:04:00 +00:00
Unix SMB / CIFS implementation .
VFS module functions
Copyright ( C ) Simo Sorce 2002
Copyright ( C ) Eric Lorimer 2002
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 19:25:36 +00:00
the Free Software Foundation ; either version 3 of the License , or
2002-08-18 18:04:00 +00:00
( at your option ) any later version .
2012-02-01 14:42:39 +01:00
2002-08-18 18:04:00 +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 .
2012-02-01 14:42:39 +01:00
2002-08-18 18:04:00 +00:00
You should have received a copy of the GNU General Public License
2007-07-10 00:52:41 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2002-08-18 18:04:00 +00:00
*/
# include "includes.h"
2011-03-22 22:34:22 +01:00
# include "smbd/smbd.h"
2011-02-25 17:14:22 +01:00
# include "system/passwd.h"
2011-02-25 23:20:06 +01:00
# include "system/filesys.h"
2002-08-18 18:04:00 +00:00
# include "vfstest.h"
2011-03-02 16:06:32 +01:00
# include "../lib/util/util_pw.h"
2012-08-16 13:44:48 +10:00
# include "libcli/security/security.h"
# include "passdb/machine_sid.h"
2002-08-18 18:04:00 +00:00
2003-05-11 23:34:18 +00:00
static const char * null_string = " " ;
2002-08-18 18:04:00 +00:00
2016-03-18 21:19:38 -07:00
static uint32_t ssf_flags ( void )
{
return lp_posix_pathnames ( ) ? SMB_FILENAME_POSIX_PATH : 0 ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_load_module ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2003-05-11 23:34:18 +00:00
int i ;
2012-02-01 14:42:39 +01:00
2003-05-11 23:34:18 +00:00
if ( argc < 2 ) {
printf ( " Usage: load <modules> \n " ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2002-08-21 02:34:49 +00:00
2003-05-11 23:34:18 +00:00
for ( i = argc - 1 ; i > 0 ; i - - ) {
if ( ! vfs_init_custom ( vfs - > conn , argv [ i ] ) ) {
DEBUG ( 0 , ( " load: (vfs_init_custom failed for %s) \n " , argv [ i ] ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2002-08-18 18:04:00 +00:00
}
printf ( " load: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_populate ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
char c ;
size_t size ;
if ( argc ! = 3 ) {
printf ( " Usage: populate <char> <size> \n " ) ;
return NT_STATUS_OK ;
}
c = argv [ 1 ] [ 0 ] ;
size = atoi ( argv [ 2 ] ) ;
2011-06-07 11:30:12 +10:00
vfs - > data = talloc_array ( mem_ctx , char , size ) ;
2002-08-18 18:04:00 +00:00
if ( vfs - > data = = NULL ) {
2002-08-18 19:22:10 +00:00
printf ( " populate: error=-1 (not enough memory) " ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_UNSUCCESSFUL ;
}
memset ( vfs - > data , c , size ) ;
vfs - > data_size = size ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_show_data ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
size_t offset ;
size_t len ;
if ( argc ! = 1 & & argc ! = 3 ) {
printf ( " Usage: showdata [<offset> <len>] \n " ) ;
return NT_STATUS_OK ;
}
if ( vfs - > data = = NULL | | vfs - > data_size = = 0 ) {
printf ( " show_data: error=-1 (buffer empty) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
if ( argc = = 3 ) {
offset = atoi ( argv [ 1 ] ) ;
len = atoi ( argv [ 2 ] ) ;
} else {
offset = 0 ;
len = vfs - > data_size ;
}
if ( ( offset + len ) > vfs - > data_size ) {
printf ( " show_data: error=-1 (not enough data in buffer) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2015-05-08 20:10:12 -07:00
dump_data ( 0 , ( uint8_t * ) ( vfs - > data ) + offset , len ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_connect ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2019-11-07 11:01:05 +01:00
const struct loadparm_substitution * lp_sub =
loadparm_s3_global_substitution ( ) ;
SMB_VFS_CONNECT ( vfs - > conn , lp_servicename ( talloc_tos ( ) , lp_sub , SNUM ( vfs - > conn ) ) , " vfstest " ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_disconnect ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2003-05-14 10:59:01 +00:00
SMB_VFS_DISCONNECT ( vfs - > conn ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_disk_free ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2017-05-23 10:40:47 -07:00
struct smb_filename * smb_fname = NULL ;
2008-10-14 01:59:36 +02:00
uint64_t diskfree , bsize , dfree , dsize ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: disk_free <path> \n " ) ;
return NT_STATUS_OK ;
}
2017-05-23 10:40:47 -07:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
NULL ,
ssf_flags ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
diskfree = SMB_VFS_DISK_FREE ( vfs - > conn , smb_fname ,
& bsize , & dfree , & dsize ) ;
2002-11-23 02:58:31 +00:00
printf ( " disk_free: %lu, bsize = %lu, dfree = %lu, dsize = %lu \n " ,
( unsigned long ) diskfree ,
( unsigned long ) bsize ,
( unsigned long ) dfree ,
( unsigned long ) dsize ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_opendir ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2016-02-26 14:53:12 -08:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: opendir <fname> \n " ) ;
return NT_STATUS_OK ;
}
2016-02-26 14:53:12 -08:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
2016-03-18 21:19:38 -07:00
NULL ,
ssf_flags ( ) ) ;
2016-02-26 14:53:12 -08:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2020-03-18 17:40:29 +01:00
vfs - > currentdir = OpenDir ( vfs - > conn , vfs - > conn , smb_fname , NULL , 0 ) ;
2002-08-18 18:04:00 +00:00
if ( vfs - > currentdir = = NULL ) {
printf ( " opendir error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2016-02-26 14:53:12 -08:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_UNSUCCESSFUL ;
}
2020-03-18 17:40:29 +01:00
vfs - > currentdir_offset = 0 ;
2016-02-26 14:53:12 -08:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
printf ( " opendir: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_readdir ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2009-01-22 20:14:38 -08:00
SMB_STRUCT_STAT st ;
2020-03-18 17:40:29 +01:00
const char * dname = NULL ;
char * talloced = NULL ;
2002-08-18 18:04:00 +00:00
if ( vfs - > currentdir = = NULL ) {
printf ( " readdir: error=-1 (no open directory) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2020-03-18 17:40:29 +01:00
dname = ReadDirName ( vfs - > currentdir ,
& vfs - > currentdir_offset ,
& st ,
& talloced ) ;
if ( dname = = NULL ) {
2002-08-18 18:04:00 +00:00
printf ( " readdir: NULL \n " ) ;
return NT_STATUS_OK ;
}
2020-03-18 17:40:29 +01:00
printf ( " readdir: %s \n " , dname ) ;
2009-01-22 20:14:38 -08:00
if ( VALID_STAT ( st ) ) {
2009-05-14 15:34:42 +02:00
time_t tmp_time ;
2009-01-22 20:14:38 -08:00
printf ( " stat available " ) ;
2009-05-14 15:34:42 +02:00
if ( S_ISREG ( st . st_ex_mode ) ) printf ( " Regular File \n " ) ;
else if ( S_ISDIR ( st . st_ex_mode ) ) printf ( " Directory \n " ) ;
else if ( S_ISCHR ( st . st_ex_mode ) ) printf ( " Character Device \n " ) ;
else if ( S_ISBLK ( st . st_ex_mode ) ) printf ( " Block Device \n " ) ;
else if ( S_ISFIFO ( st . st_ex_mode ) ) printf ( " Fifo \n " ) ;
else if ( S_ISLNK ( st . st_ex_mode ) ) printf ( " Symbolic Link \n " ) ;
else if ( S_ISSOCK ( st . st_ex_mode ) ) printf ( " Socket \n " ) ;
printf ( " Size: %10u " , ( unsigned int ) st . st_ex_size ) ;
2009-01-22 20:14:38 -08:00
# ifdef HAVE_STAT_ST_BLOCKS
2009-05-14 15:34:42 +02:00
printf ( " Blocks: %9u " , ( unsigned int ) st . st_ex_blocks ) ;
2009-01-22 20:14:38 -08:00
# endif
# ifdef HAVE_STAT_ST_BLKSIZE
2009-05-14 15:34:42 +02:00
printf ( " IO Block: %u \n " , ( unsigned int ) st . st_ex_blksize ) ;
2009-01-22 20:14:38 -08:00
# endif
2009-05-14 15:34:42 +02:00
printf ( " Device: 0x%10x " , ( unsigned int ) st . st_ex_dev ) ;
printf ( " Inode: %10u " , ( unsigned int ) st . st_ex_ino ) ;
printf ( " Links: %10u \n " , ( unsigned int ) st . st_ex_nlink ) ;
printf ( " Access: %05o " , ( int ) ( ( st . st_ex_mode ) & 007777 ) ) ;
2009-02-10 22:16:26 -08:00
printf ( " Uid: %5lu Gid: %5lu \n " ,
2009-05-14 15:34:42 +02:00
( unsigned long ) st . st_ex_uid ,
( unsigned long ) st . st_ex_gid ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_atime ) ;
printf ( " Access: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_mtime ) ;
printf ( " Modify: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_ctime ) ;
printf ( " Change: %s " , ctime ( & tmp_time ) ) ;
2009-01-22 20:14:38 -08:00
}
2020-03-18 17:40:29 +01:00
TALLOC_FREE ( talloced ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_mkdir ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2016-02-23 13:14:03 -08:00
struct smb_filename * smb_fname = NULL ;
2019-09-05 11:27:42 -07:00
int ret ;
2016-02-23 13:14:03 -08:00
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: mkdir <path> \n " ) ;
return NT_STATUS_OK ;
}
2016-02-23 13:14:03 -08:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
2016-03-18 21:19:38 -07:00
NULL ,
ssf_flags ( ) ) ;
2016-02-23 13:14:03 -08:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2019-09-05 11:27:42 -07:00
ret = SMB_VFS_MKDIRAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
smb_fname ,
00755 ) ;
if ( ret = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " mkdir error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2012-02-01 14:42:39 +01:00
2002-08-18 18:04:00 +00:00
printf ( " mkdir: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_closedir ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
if ( vfs - > currentdir = = NULL ) {
printf ( " closedir: failure (no directory open) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2020-03-18 17:40:29 +01:00
TALLOC_FREE ( vfs - > currentdir ) ;
vfs - > currentdir_offset = 0 ;
2002-08-18 18:04:00 +00:00
printf ( " closedir: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_open ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2006-07-11 18:01:26 +00:00
int flags ;
2002-08-21 02:34:49 +00:00
mode_t mode ;
2003-05-11 23:34:18 +00:00
const char * flagstr ;
2006-07-11 18:01:26 +00:00
files_struct * fsp ;
2009-06-16 12:01:13 -07:00
struct smb_filename * smb_fname = NULL ;
NTSTATUS status ;
2012-08-16 14:37:42 +10:00
int ret ;
2002-08-18 18:04:00 +00:00
mode = 00400 ;
2002-08-18 19:22:10 +00:00
if ( argc < 3 | | argc > 5 ) {
printf ( " Usage: open <filename> <flags> <mode> \n " ) ;
printf ( " flags: O = O_RDONLY \n " ) ;
printf ( " R = O_RDWR \n " ) ;
printf ( " W = O_WRONLY \n " ) ;
printf ( " C = O_CREAT \n " ) ;
printf ( " E = O_EXCL \n " ) ;
printf ( " T = O_TRUNC \n " ) ;
printf ( " A = O_APPEND \n " ) ;
printf ( " N = O_NONBLOCK/O_NDELAY \n " ) ;
2002-08-19 16:54:06 +00:00
# ifdef O_SYNC
2002-08-18 19:22:10 +00:00
printf ( " S = O_SYNC \n " ) ;
2002-08-19 16:54:06 +00:00
# endif
2002-08-18 20:28:16 +00:00
# ifdef O_NOFOLLOW
2002-08-18 19:22:10 +00:00
printf ( " F = O_NOFOLLOW \n " ) ;
2002-08-18 20:28:16 +00:00
# endif
2002-08-18 19:22:10 +00:00
printf ( " mode: see open.2 \n " ) ;
printf ( " mode is ignored if C flag not present \n " ) ;
printf ( " mode defaults to 00400 \n " ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2002-08-18 19:22:10 +00:00
flags = 0 ;
flagstr = argv [ 2 ] ;
while ( * flagstr ) {
switch ( * flagstr ) {
case ' O ' :
flags | = O_RDONLY ;
break ;
case ' R ' :
flags | = O_RDWR ;
break ;
case ' W ' :
flags | = O_WRONLY ;
break ;
case ' C ' :
flags | = O_CREAT ;
break ;
case ' E ' :
flags | = O_EXCL ;
break ;
case ' T ' :
flags | = O_TRUNC ;
break ;
case ' A ' :
flags | = O_APPEND ;
break ;
case ' N ' :
flags | = O_NONBLOCK ;
break ;
2002-08-19 16:54:06 +00:00
# ifdef O_SYNC
2002-08-18 19:22:10 +00:00
case ' S ' :
flags | = O_SYNC ;
break ;
2002-08-19 16:54:06 +00:00
# endif
2002-08-18 20:28:16 +00:00
# ifdef O_NOFOLLOW
2002-08-18 19:22:10 +00:00
case ' F ' :
flags | = O_NOFOLLOW ;
break ;
2002-08-18 20:28:16 +00:00
# endif
2002-08-18 19:22:10 +00:00
default :
printf ( " open: error=-1 (invalid flag!) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
flagstr + + ;
}
if ( ( flags & O_CREAT ) & & argc = = 4 ) {
2008-09-15 15:47:43 -07:00
if ( sscanf ( argv [ 3 ] , " %ho " , ( unsigned short * ) & mode ) = = 0 ) {
2002-08-18 19:22:10 +00:00
printf ( " open: error=-1 (invalid mode!) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
}
2002-08-18 18:04:00 +00:00
2012-08-16 15:16:01 +10:00
fsp = talloc_zero ( vfs , struct files_struct ) ;
2008-01-09 11:22:29 +01:00
if ( fsp = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2012-08-16 15:16:01 +10:00
fsp - > fh = talloc_zero ( fsp , struct fd_handle ) ;
2008-01-09 11:22:29 +01:00
if ( fsp - > fh = = NULL ) {
2012-08-16 15:16:01 +10:00
TALLOC_FREE ( fsp ) ;
2008-01-09 11:22:29 +01:00
return NT_STATUS_NO_MEMORY ;
}
2006-07-11 18:01:26 +00:00
fsp - > conn = vfs - > conn ;
2016-03-09 16:00:47 -08:00
smb_fname = synthetic_smb_fname_split ( NULL ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:43:38 +02:00
if ( smb_fname = = NULL ) {
2012-08-16 15:16:01 +10:00
TALLOC_FREE ( fsp ) ;
2013-04-15 11:43:38 +02:00
return NT_STATUS_NO_MEMORY ;
2009-06-16 12:01:13 -07:00
}
2009-07-10 18:11:32 -07:00
fsp - > fsp_name = smb_fname ;
2009-06-16 12:01:13 -07:00
fsp - > fh - > fd = SMB_VFS_OPEN ( vfs - > conn , smb_fname , fsp , flags , mode ) ;
2006-07-11 18:01:26 +00:00
if ( fsp - > fh - > fd = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " open: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2012-08-16 15:16:01 +10:00
TALLOC_FREE ( fsp ) ;
2009-07-10 18:11:32 -07:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_UNSUCCESSFUL ;
}
2013-11-08 13:56:23 +01:00
status = NT_STATUS_OK ;
2012-08-16 14:37:42 +10:00
ret = SMB_VFS_FSTAT ( fsp , & smb_fname - > st ) ;
if ( ret = = - 1 ) {
/* If we have an fd, this stat should succeed. */
DEBUG ( 0 , ( " Error doing fstat on open file %s "
" (%s) \n " ,
smb_fname_str_dbg ( smb_fname ) ,
strerror ( errno ) ) ) ;
status = map_nt_error_from_unix ( errno ) ;
} else if ( S_ISDIR ( smb_fname - > st . st_ex_mode ) ) {
errno = EISDIR ;
status = NT_STATUS_FILE_IS_A_DIRECTORY ;
}
2013-11-08 13:56:23 +01:00
2012-08-16 14:37:42 +10:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
SMB_VFS_CLOSE ( fsp ) ;
2012-08-16 15:16:01 +10:00
TALLOC_FREE ( fsp ) ;
2012-08-16 14:37:42 +10:00
TALLOC_FREE ( smb_fname ) ;
return status ;
}
fsp - > file_id = vfs_file_id_from_sbuf ( vfs - > conn , & smb_fname - > st ) ;
fsp - > vuid = UID_FIELD_INVALID ;
fsp - > file_pid = 0 ;
2020-04-02 17:09:36 +02:00
fsp - > fsp_flags . can_lock = true ;
2020-04-02 17:18:43 +02:00
fsp - > fsp_flags . can_read = true ;
2012-08-16 14:37:42 +10:00
fsp - > can_write =
CAN_WRITE ( vfs - > conn ) ;
fsp - > print_file = NULL ;
fsp - > modified = False ;
fsp - > sent_oplock_break = NO_BREAK_SENT ;
fsp - > is_directory = False ;
2006-07-11 18:01:26 +00:00
vfs - > files [ fsp - > fh - > fd ] = fsp ;
printf ( " open: fd=%d \n " , fsp - > fh - > fd ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_pathfunc ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2016-02-24 14:02:45 -08:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
int ret = - 1 ;
if ( argc ! = 2 ) {
printf ( " Usage: %s <path> \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
2016-02-24 14:02:45 -08:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
2016-03-18 21:19:38 -07:00
NULL ,
ssf_flags ( ) ) ;
2009-07-02 09:27:44 -07:00
2016-02-24 14:02:45 -08:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2009-07-02 09:27:44 -07:00
2016-02-24 14:02:45 -08:00
if ( strcmp ( " rmdir " , argv [ 0 ] ) = = 0 ) {
2019-10-04 12:51:06 -07:00
ret = SMB_VFS_UNLINKAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
smb_fname ,
AT_REMOVEDIR ) ;
2016-02-24 14:02:45 -08:00
TALLOC_FREE ( smb_fname ) ;
} else if ( strcmp ( " unlink " , argv [ 0 ] ) = = 0 ) {
2016-10-20 13:33:09 -07:00
TALLOC_FREE ( smb_fname ) ;
/* unlink can be a stream:name */
smb_fname = synthetic_smb_fname_split ( talloc_tos ( ) ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2019-09-13 10:56:30 -07:00
ret = SMB_VFS_UNLINKAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
smb_fname ,
0 ) ;
2009-07-02 09:27:44 -07:00
TALLOC_FREE ( smb_fname ) ;
2002-08-19 16:54:06 +00:00
} else if ( strcmp ( " chdir " , argv [ 0 ] ) = = 0 ) {
2017-06-29 11:29:33 -07:00
ret = SMB_VFS_CHDIR ( vfs - > conn , smb_fname ) ;
TALLOC_FREE ( smb_fname ) ;
2002-08-19 16:54:06 +00:00
} else {
printf ( " %s: error=%d (invalid function name!) \n " , argv [ 0 ] , errno ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2002-08-18 18:04:00 +00:00
if ( ret = = - 1 ) {
printf ( " %s: error=%d (%s) \n " , argv [ 0 ] , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " %s: ok \n " , argv [ 0 ] ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_close ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd , ret ;
if ( argc ! = 2 ) {
printf ( " Usage: close <fd> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " close: error=-1 (invalid file descriptor) \n " ) ;
return NT_STATUS_OK ;
}
2008-01-11 14:19:28 +01:00
ret = SMB_VFS_CLOSE ( vfs - > files [ fd ] ) ;
2002-08-18 18:04:00 +00:00
if ( ret = = - 1 )
printf ( " close: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
else
printf ( " close: ok \n " ) ;
2012-08-16 15:16:01 +10:00
TALLOC_FREE ( vfs - > files [ fd ] ) ;
2002-08-18 18:04:00 +00:00
vfs - > files [ fd ] = NULL ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_read ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd ;
size_t size , rsize ;
if ( argc ! = 3 ) {
printf ( " Usage: read <fd> <size> \n " ) ;
return NT_STATUS_OK ;
}
/* do some error checking on these */
fd = atoi ( argv [ 1 ] ) ;
size = atoi ( argv [ 2 ] ) ;
2011-06-07 11:30:12 +10:00
vfs - > data = talloc_array ( mem_ctx , char , size ) ;
2002-08-18 18:04:00 +00:00
if ( vfs - > data = = NULL ) {
printf ( " read: error=-1 (not enough memory) " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
vfs - > data_size = size ;
2012-02-01 14:42:39 +01:00
2018-05-01 11:53:10 -07:00
rsize = read_file ( vfs - > files [ fd ] , vfs - > data , 0 , size ) ;
2002-08-18 19:22:10 +00:00
if ( rsize = = - 1 ) {
printf ( " read: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
2002-08-18 18:04:00 +00:00
}
printf ( " read: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_write ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd , size , wsize ;
if ( argc ! = 3 ) {
printf ( " Usage: write <fd> <size> \n " ) ;
return NT_STATUS_OK ;
}
/* some error checking should go here */
fd = atoi ( argv [ 1 ] ) ;
size = atoi ( argv [ 2 ] ) ;
if ( vfs - > data = = NULL ) {
printf ( " write: error=-1 (buffer empty, please populate it before writing) " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
if ( vfs - > data_size < size ) {
printf ( " write: error=-1 (buffer too small, please put some more data in) " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2018-05-02 16:49:56 -07:00
wsize = write_file ( NULL , vfs - > files [ fd ] , vfs - > data , 0 , size ) ;
2002-08-18 18:04:00 +00:00
if ( wsize = = - 1 ) {
printf ( " write: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " write: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_lseek ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd , offset , whence ;
2012-04-05 14:53:08 +10:00
off_t pos ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 4 ) {
printf ( " Usage: lseek <fd> <offset> <whence> \n ...where whence is 1 => SEEK_SET, 2 => SEEK_CUR, 3 => SEEK_END \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
offset = atoi ( argv [ 2 ] ) ;
whence = atoi ( argv [ 3 ] ) ;
switch ( whence ) {
case 1 : whence = SEEK_SET ; break ;
case 2 : whence = SEEK_CUR ; break ;
default : whence = SEEK_END ;
}
2008-01-07 10:15:08 +01:00
pos = SMB_VFS_LSEEK ( vfs - > files [ fd ] , offset , whence ) ;
2012-04-05 14:53:08 +10:00
if ( pos = = ( off_t ) - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " lseek: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " lseek: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_rename ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int ret ;
2009-06-30 17:04:38 -07:00
struct smb_filename * smb_fname_src = NULL ;
struct smb_filename * smb_fname_dst = NULL ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 3 ) {
printf ( " Usage: rename <old> <new> \n " ) ;
return NT_STATUS_OK ;
}
2016-03-09 16:00:47 -08:00
smb_fname_src = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:46:24 +02:00
if ( smb_fname_src = = NULL ) {
return NT_STATUS_NO_MEMORY ;
2009-06-30 17:04:38 -07:00
}
2016-03-09 16:00:47 -08:00
smb_fname_dst = synthetic_smb_fname_split ( mem_ctx ,
argv [ 2 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:46:24 +02:00
if ( smb_fname_dst = = NULL ) {
2009-06-30 17:04:38 -07:00
TALLOC_FREE ( smb_fname_src ) ;
2013-04-15 11:46:24 +02:00
return NT_STATUS_NO_MEMORY ;
2009-06-30 17:04:38 -07:00
}
2019-08-09 15:40:47 -07:00
ret = SMB_VFS_RENAMEAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
smb_fname_src ,
vfs - > conn - > cwd_fsp ,
smb_fname_dst ) ;
2009-06-30 17:04:38 -07:00
TALLOC_FREE ( smb_fname_src ) ;
TALLOC_FREE ( smb_fname_dst ) ;
2002-08-18 18:04:00 +00:00
if ( ret = = - 1 ) {
printf ( " rename: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " rename: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_fsync ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int ret , fd ;
if ( argc ! = 2 ) {
printf ( " Usage: fsync <fd> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
2018-04-27 16:59:42 -07:00
ret = smb_vfs_fsync_sync ( vfs - > files [ fd ] ) ;
2002-08-18 18:04:00 +00:00
if ( ret = = - 1 ) {
printf ( " fsync: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " fsync: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_stat ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int ret ;
2003-05-11 23:34:18 +00:00
const char * user ;
const char * group ;
2003-08-27 20:04:23 +00:00
struct passwd * pwd = NULL ;
struct group * grp = NULL ;
2009-06-22 15:26:56 -07:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
SMB_STRUCT_STAT st ;
2009-05-14 15:34:42 +02:00
time_t tmp_time ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: stat <fname> \n " ) ;
return NT_STATUS_OK ;
}
2016-03-09 16:00:47 -08:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:47:17 +02:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
2009-06-22 15:26:56 -07:00
}
ret = SMB_VFS_STAT ( vfs - > conn , smb_fname ) ;
2002-08-18 18:04:00 +00:00
if ( ret = = - 1 ) {
printf ( " stat: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2009-06-22 15:26:56 -07:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_UNSUCCESSFUL ;
}
2009-06-22 15:26:56 -07:00
st = smb_fname - > st ;
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
2012-03-24 15:25:05 +01:00
pwd = getpwuid ( st . st_ex_uid ) ;
2003-05-11 23:34:18 +00:00
if ( pwd ! = NULL ) user = pwd - > pw_name ;
2002-08-18 18:04:00 +00:00
else user = null_string ;
2012-03-24 15:26:36 +01:00
grp = getgrgid ( st . st_ex_gid ) ;
2003-05-11 23:34:18 +00:00
if ( grp ! = NULL ) group = grp - > gr_name ;
2002-08-18 18:04:00 +00:00
else group = null_string ;
printf ( " stat: ok \n " ) ;
printf ( " File: %s " , argv [ 1 ] ) ;
2009-05-14 15:34:42 +02:00
if ( S_ISREG ( st . st_ex_mode ) ) printf ( " Regular File \n " ) ;
else if ( S_ISDIR ( st . st_ex_mode ) ) printf ( " Directory \n " ) ;
else if ( S_ISCHR ( st . st_ex_mode ) ) printf ( " Character Device \n " ) ;
else if ( S_ISBLK ( st . st_ex_mode ) ) printf ( " Block Device \n " ) ;
else if ( S_ISFIFO ( st . st_ex_mode ) ) printf ( " Fifo \n " ) ;
else if ( S_ISLNK ( st . st_ex_mode ) ) printf ( " Symbolic Link \n " ) ;
else if ( S_ISSOCK ( st . st_ex_mode ) ) printf ( " Socket \n " ) ;
printf ( " Size: %10u " , ( unsigned int ) st . st_ex_size ) ;
2003-10-14 03:56:42 +00:00
# ifdef HAVE_STAT_ST_BLOCKS
2009-05-14 15:34:42 +02:00
printf ( " Blocks: %9u " , ( unsigned int ) st . st_ex_blocks ) ;
2003-10-14 03:56:42 +00:00
# endif
# ifdef HAVE_STAT_ST_BLKSIZE
2009-05-14 15:34:42 +02:00
printf ( " IO Block: %u \n " , ( unsigned int ) st . st_ex_blksize ) ;
2003-10-14 03:56:42 +00:00
# endif
2009-05-14 15:34:42 +02:00
printf ( " Device: 0x%10x " , ( unsigned int ) st . st_ex_dev ) ;
printf ( " Inode: %10u " , ( unsigned int ) st . st_ex_ino ) ;
printf ( " Links: %10u \n " , ( unsigned int ) st . st_ex_nlink ) ;
printf ( " Access: %05o " , ( int ) ( ( st . st_ex_mode ) & 007777 ) ) ;
printf ( " Uid: %5lu/%.16s Gid: %5lu/%.16s \n " , ( unsigned long ) st . st_ex_uid , user ,
( unsigned long ) st . st_ex_gid , group ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_atime ) ;
printf ( " Access: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_mtime ) ;
printf ( " Modify: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_ctime ) ;
printf ( " Change: %s " , ctime ( & tmp_time ) ) ;
2003-08-27 20:04:23 +00:00
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_fstat ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd ;
2003-05-11 23:34:18 +00:00
const char * user ;
const char * group ;
2003-08-27 20:04:23 +00:00
struct passwd * pwd = NULL ;
struct group * grp = NULL ;
2002-08-18 18:04:00 +00:00
SMB_STRUCT_STAT st ;
2009-05-14 15:34:42 +02:00
time_t tmp_time ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: fstat <fd> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
2008-01-30 19:56:05 +01:00
if ( fd < 0 | | fd > = 1024 ) {
2002-08-18 18:04:00 +00:00
printf ( " fstat: error=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " fstat: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
2008-01-07 13:21:26 +01:00
if ( SMB_VFS_FSTAT ( vfs - > files [ fd ] , & st ) = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " fstat: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2012-03-24 15:25:05 +01:00
pwd = getpwuid ( st . st_ex_uid ) ;
2003-05-11 23:34:18 +00:00
if ( pwd ! = NULL ) user = pwd - > pw_name ;
2002-08-18 18:04:00 +00:00
else user = null_string ;
2012-03-24 15:26:36 +01:00
grp = getgrgid ( st . st_ex_gid ) ;
2003-05-11 23:34:18 +00:00
if ( grp ! = NULL ) group = grp - > gr_name ;
2002-08-18 18:04:00 +00:00
else group = null_string ;
printf ( " fstat: ok \n " ) ;
2009-05-14 15:34:42 +02:00
if ( S_ISREG ( st . st_ex_mode ) ) printf ( " Regular File \n " ) ;
else if ( S_ISDIR ( st . st_ex_mode ) ) printf ( " Directory \n " ) ;
else if ( S_ISCHR ( st . st_ex_mode ) ) printf ( " Character Device \n " ) ;
else if ( S_ISBLK ( st . st_ex_mode ) ) printf ( " Block Device \n " ) ;
else if ( S_ISFIFO ( st . st_ex_mode ) ) printf ( " Fifo \n " ) ;
else if ( S_ISLNK ( st . st_ex_mode ) ) printf ( " Symbolic Link \n " ) ;
else if ( S_ISSOCK ( st . st_ex_mode ) ) printf ( " Socket \n " ) ;
printf ( " Size: %10u " , ( unsigned int ) st . st_ex_size ) ;
2003-10-14 03:56:42 +00:00
# ifdef HAVE_STAT_ST_BLOCKS
2009-05-14 15:34:42 +02:00
printf ( " Blocks: %9u " , ( unsigned int ) st . st_ex_blocks ) ;
2003-10-14 03:56:42 +00:00
# endif
# ifdef HAVE_STAT_ST_BLKSIZE
2009-05-14 15:34:42 +02:00
printf ( " IO Block: %u \n " , ( unsigned int ) st . st_ex_blksize ) ;
2003-10-14 03:56:42 +00:00
# endif
2009-05-14 15:34:42 +02:00
printf ( " Device: 0x%10x " , ( unsigned int ) st . st_ex_dev ) ;
printf ( " Inode: %10u " , ( unsigned int ) st . st_ex_ino ) ;
printf ( " Links: %10u \n " , ( unsigned int ) st . st_ex_nlink ) ;
printf ( " Access: %05o " , ( int ) ( ( st . st_ex_mode ) & 007777 ) ) ;
printf ( " Uid: %5lu/%.16s Gid: %5lu/%.16s \n " , ( unsigned long ) st . st_ex_uid , user ,
( unsigned long ) st . st_ex_gid , group ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_atime ) ;
printf ( " Access: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_mtime ) ;
printf ( " Modify: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_ctime ) ;
printf ( " Change: %s " , ctime ( & tmp_time ) ) ;
2003-08-27 20:04:23 +00:00
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_lstat ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2003-05-11 23:34:18 +00:00
const char * user ;
const char * group ;
2003-08-27 20:04:23 +00:00
struct passwd * pwd = NULL ;
struct group * grp = NULL ;
2009-06-22 15:26:56 -07:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
SMB_STRUCT_STAT st ;
2009-05-14 15:34:42 +02:00
time_t tmp_time ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: lstat <path> \n " ) ;
return NT_STATUS_OK ;
}
2016-03-09 16:00:47 -08:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:48:05 +02:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
2009-06-22 15:26:56 -07:00
}
if ( SMB_VFS_LSTAT ( vfs - > conn , smb_fname ) = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " lstat: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2009-06-22 15:26:56 -07:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_UNSUCCESSFUL ;
}
2009-06-22 15:26:56 -07:00
st = smb_fname - > st ;
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
2012-03-24 15:25:05 +01:00
pwd = getpwuid ( st . st_ex_uid ) ;
2003-05-11 23:34:18 +00:00
if ( pwd ! = NULL ) user = pwd - > pw_name ;
2002-08-18 18:04:00 +00:00
else user = null_string ;
2012-03-24 15:26:36 +01:00
grp = getgrgid ( st . st_ex_gid ) ;
2003-05-11 23:34:18 +00:00
if ( grp ! = NULL ) group = grp - > gr_name ;
2002-08-18 18:04:00 +00:00
else group = null_string ;
printf ( " lstat: ok \n " ) ;
2009-05-14 15:34:42 +02:00
if ( S_ISREG ( st . st_ex_mode ) ) printf ( " Regular File \n " ) ;
else if ( S_ISDIR ( st . st_ex_mode ) ) printf ( " Directory \n " ) ;
else if ( S_ISCHR ( st . st_ex_mode ) ) printf ( " Character Device \n " ) ;
else if ( S_ISBLK ( st . st_ex_mode ) ) printf ( " Block Device \n " ) ;
else if ( S_ISFIFO ( st . st_ex_mode ) ) printf ( " Fifo \n " ) ;
else if ( S_ISLNK ( st . st_ex_mode ) ) printf ( " Symbolic Link \n " ) ;
else if ( S_ISSOCK ( st . st_ex_mode ) ) printf ( " Socket \n " ) ;
printf ( " Size: %10u " , ( unsigned int ) st . st_ex_size ) ;
2003-10-14 03:56:42 +00:00
# ifdef HAVE_STAT_ST_BLOCKS
2009-05-14 15:34:42 +02:00
printf ( " Blocks: %9u " , ( unsigned int ) st . st_ex_blocks ) ;
2003-10-14 03:56:42 +00:00
# endif
# ifdef HAVE_STAT_ST_BLKSIZE
2009-05-14 15:34:42 +02:00
printf ( " IO Block: %u \n " , ( unsigned int ) st . st_ex_blksize ) ;
2003-10-14 03:56:42 +00:00
# endif
2009-05-14 15:34:42 +02:00
printf ( " Device: 0x%10x " , ( unsigned int ) st . st_ex_dev ) ;
printf ( " Inode: %10u " , ( unsigned int ) st . st_ex_ino ) ;
printf ( " Links: %10u \n " , ( unsigned int ) st . st_ex_nlink ) ;
printf ( " Access: %05o " , ( int ) ( ( st . st_ex_mode ) & 007777 ) ) ;
printf ( " Uid: %5lu/%.16s Gid: %5lu/%.16s \n " , ( unsigned long ) st . st_ex_uid , user ,
( unsigned long ) st . st_ex_gid , group ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_atime ) ;
printf ( " Access: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_mtime ) ;
printf ( " Modify: %s " , ctime ( & tmp_time ) ) ;
tmp_time = convert_timespec_to_time_t ( st . st_ex_ctime ) ;
printf ( " Change: %s " , ctime ( & tmp_time ) ) ;
2012-02-01 14:42:39 +01:00
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_chmod ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2016-03-01 16:20:25 -08:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
mode_t mode ;
if ( argc ! = 3 ) {
printf ( " Usage: chmod <path> <mode> \n " ) ;
return NT_STATUS_OK ;
}
mode = atoi ( argv [ 2 ] ) ;
2016-03-01 16:20:25 -08:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
2016-03-18 21:19:38 -07:00
NULL ,
ssf_flags ( ) ) ;
2016-03-01 16:20:25 -08:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
if ( SMB_VFS_CHMOD ( vfs - > conn , smb_fname , mode ) = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " chmod: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " chmod: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_fchmod ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd ;
mode_t mode ;
if ( argc ! = 3 ) {
printf ( " Usage: fchmod <fd> <mode> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
mode = atoi ( argv [ 2 ] ) ;
2008-01-30 19:56:05 +01:00
if ( fd < 0 | | fd > = 1024 ) {
2002-08-18 18:04:00 +00:00
printf ( " fchmod: error=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " fchmod: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
2008-01-07 13:44:37 +01:00
if ( SMB_VFS_FCHMOD ( vfs - > files [ fd ] , mode ) = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " fchmod: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " fchmod: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_fchown ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
uid_t uid ;
gid_t gid ;
int fd ;
if ( argc ! = 4 ) {
printf ( " Usage: fchown <fd> <uid> <gid> \n " ) ;
return NT_STATUS_OK ;
}
uid = atoi ( argv [ 2 ] ) ;
gid = atoi ( argv [ 3 ] ) ;
fd = atoi ( argv [ 1 ] ) ;
2008-01-30 19:56:05 +01:00
if ( fd < 0 | | fd > = 1024 ) {
2002-08-18 18:04:00 +00:00
printf ( " fchown: faliure=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " fchown: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
2008-01-07 14:26:00 +01:00
if ( SMB_VFS_FCHOWN ( vfs - > files [ fd ] , uid , gid ) = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " fchown error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " fchown: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_getwd ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2017-06-29 14:32:47 -07:00
struct smb_filename * smb_fname = SMB_VFS_GETWD ( vfs - > conn , talloc_tos ( ) ) ;
if ( smb_fname = = NULL ) {
2002-08-18 18:04:00 +00:00
printf ( " getwd: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2017-06-29 14:32:47 -07:00
printf ( " getwd: %s \n " , smb_fname - > base_name ) ;
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_utime ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2009-01-23 14:40:19 -08:00
struct smb_file_time ft ;
2009-07-02 13:39:20 -07:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 4 ) {
printf ( " Usage: utime <path> <access> <modify> \n " ) ;
return NT_STATUS_OK ;
}
2009-01-23 14:40:19 -08:00
2019-12-02 16:30:50 +01:00
init_smb_file_time ( & ft ) ;
2009-01-23 14:40:19 -08:00
2019-12-02 16:30:50 +01:00
ft . atime = time_t_to_full_timespec ( atoi ( argv [ 2 ] ) ) ;
ft . mtime = time_t_to_full_timespec ( atoi ( argv [ 3 ] ) ) ;
2009-07-02 13:39:20 -07:00
2016-03-09 16:00:47 -08:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:49:09 +02:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
2009-07-02 13:39:20 -07:00
}
if ( SMB_VFS_NTIMES ( vfs - > conn , smb_fname , & ft ) ! = 0 ) {
2002-08-18 18:04:00 +00:00
printf ( " utime: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2009-07-02 13:39:20 -07:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_UNSUCCESSFUL ;
}
2009-07-02 13:39:20 -07:00
TALLOC_FREE ( smb_fname ) ;
2002-08-18 18:04:00 +00:00
printf ( " utime: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_ftruncate ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
int fd ;
2012-04-05 14:53:08 +10:00
off_t off ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 3 ) {
printf ( " Usage: ftruncate <fd> <length> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
off = atoi ( argv [ 2 ] ) ;
2008-01-30 19:56:05 +01:00
if ( fd < 0 | | fd > = 1024 ) {
2002-08-18 18:04:00 +00:00
printf ( " ftruncate: error=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " ftruncate: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
2008-01-07 15:55:09 +01:00
if ( SMB_VFS_FTRUNCATE ( vfs - > files [ fd ] , off ) = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " ftruncate: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " ftruncate: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_lock ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2002-08-21 02:34:49 +00:00
int fd ;
int op ;
long offset ;
long count ;
int type ;
2003-05-11 23:34:18 +00:00
const char * typestr ;
2012-02-01 14:42:39 +01:00
2002-08-21 02:34:49 +00:00
if ( argc ! = 6 ) {
printf ( " Usage: lock <fd> <op> <offset> <count> <type> \n " ) ;
printf ( " ops: G = F_GETLK \n " ) ;
printf ( " S = F_SETLK \n " ) ;
printf ( " W = F_SETLKW \n " ) ;
printf ( " type: R = F_RDLCK \n " ) ;
printf ( " W = F_WRLCK \n " ) ;
printf ( " U = F_UNLCK \n " ) ;
return NT_STATUS_OK ;
}
if ( sscanf ( argv [ 1 ] , " %d " , & fd ) = = 0 ) {
printf ( " lock: error=-1 (error parsing fd) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
op = 0 ;
switch ( * argv [ 2 ] ) {
case ' G ' :
op = F_GETLK ;
break ;
case ' S ' :
op = F_SETLK ;
break ;
case ' W ' :
op = F_SETLKW ;
break ;
default :
printf ( " lock: error=-1 (invalid op flag!) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
if ( sscanf ( argv [ 3 ] , " %ld " , & offset ) = = 0 ) {
printf ( " lock: error=-1 (error parsing fd) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
if ( sscanf ( argv [ 4 ] , " %ld " , & count ) = = 0 ) {
printf ( " lock: error=-1 (error parsing fd) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
type = 0 ;
typestr = argv [ 5 ] ;
while ( * typestr ) {
switch ( * typestr ) {
case ' R ' :
type | = F_RDLCK ;
break ;
case ' W ' :
type | = F_WRLCK ;
break ;
case ' U ' :
type | = F_UNLCK ;
break ;
default :
printf ( " lock: error=-1 (invalid type flag!) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
typestr + + ;
}
printf ( " lock: debug lock(fd=%d, op=%d, offset=%ld, count=%ld, type=%d)) \n " , fd , op , offset , count , type ) ;
2008-02-28 11:31:20 +01:00
if ( SMB_VFS_LOCK ( vfs - > files [ fd ] , op , offset , count , type ) = = False ) {
2002-08-21 02:34:49 +00:00
printf ( " lock: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " lock: ok \n " ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_symlink ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2019-08-30 14:10:47 -07:00
int ret ;
2017-06-08 16:25:58 -07:00
struct smb_filename * new_smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 3 ) {
printf ( " Usage: symlink <path> <link> \n " ) ;
return NT_STATUS_OK ;
}
2017-06-08 16:25:58 -07:00
new_smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 2 ] ,
lp_posix_pathnames ( ) ) ;
if ( new_smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2019-08-30 14:10:47 -07:00
ret = SMB_VFS_SYMLINKAT ( vfs - > conn ,
argv [ 1 ] ,
vfs - > conn - > cwd_fsp ,
new_smb_fname ) ;
if ( ret = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " symlink: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " symlink: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_readlink ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
char buffer [ PATH_MAX ] ;
2017-06-07 15:03:37 -07:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
int size ;
if ( argc ! = 2 ) {
printf ( " Usage: readlink <path> \n " ) ;
return NT_STATUS_OK ;
}
2017-06-07 15:03:37 -07:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2019-08-22 14:34:13 -07:00
size = SMB_VFS_READLINKAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
smb_fname ,
buffer ,
PATH_MAX ) ;
if ( size = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " readlink: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
buffer [ size ] = ' \0 ' ;
printf ( " readlink: %s \n " , buffer ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_link ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2017-06-02 14:21:54 -07:00
struct smb_filename * old_smb_fname = NULL ;
struct smb_filename * new_smb_fname = NULL ;
2019-08-16 16:14:03 -07:00
int ret ;
2017-06-02 14:21:54 -07:00
2002-08-18 18:04:00 +00:00
if ( argc ! = 3 ) {
printf ( " Usage: link <path> <link> \n " ) ;
return NT_STATUS_OK ;
}
2017-06-02 14:21:54 -07:00
old_smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( old_smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
new_smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 2 ] ,
lp_posix_pathnames ( ) ) ;
if ( new_smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2019-08-16 16:14:03 -07:00
ret = SMB_VFS_LINKAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
old_smb_fname ,
vfs - > conn - > cwd_fsp ,
new_smb_fname ,
0 ) ;
if ( ret = = - 1 ) {
2002-08-18 18:04:00 +00:00
printf ( " link: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " link: ok \n " ) ;
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_mknod ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2002-08-21 02:34:49 +00:00
mode_t mode ;
2002-11-23 02:58:31 +00:00
unsigned int dev_val ;
2002-08-21 02:34:49 +00:00
SMB_DEV_T dev ;
2017-05-19 15:01:52 -07:00
struct smb_filename * smb_fname = NULL ;
2019-08-21 12:11:44 -07:00
int ret ;
2012-02-01 14:42:39 +01:00
2002-08-21 02:34:49 +00:00
if ( argc ! = 4 ) {
printf ( " Usage: mknod <path> <mode> <dev> \n " ) ;
printf ( " mode is octal \n " ) ;
printf ( " dev is hex \n " ) ;
return NT_STATUS_OK ;
}
2008-09-15 15:47:43 -07:00
if ( sscanf ( argv [ 2 ] , " %ho " , ( unsigned short * ) & mode ) = = 0 ) {
2002-08-21 02:34:49 +00:00
printf ( " open: error=-1 (invalid mode!) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2002-11-23 02:58:31 +00:00
if ( sscanf ( argv [ 3 ] , " %x " , & dev_val ) = = 0 ) {
2002-08-21 02:34:49 +00:00
printf ( " open: error=-1 (invalid dev!) \n " ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2002-11-23 02:58:31 +00:00
dev = ( SMB_DEV_T ) dev_val ;
2002-08-21 02:34:49 +00:00
2017-05-19 15:01:52 -07:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2019-08-21 12:11:44 -07:00
ret = SMB_VFS_MKNODAT ( vfs - > conn ,
vfs - > conn - > cwd_fsp ,
smb_fname ,
mode ,
dev ) ;
if ( ret = = - 1 ) {
2002-08-21 02:34:49 +00:00
printf ( " mknod: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " mknod: ok \n " ) ;
2002-08-18 18:04:00 +00:00
return NT_STATUS_OK ;
}
2003-05-11 23:34:18 +00:00
static NTSTATUS cmd_realpath ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
2002-08-18 18:04:00 +00:00
{
2017-06-30 11:32:59 -07:00
struct smb_filename * smb_fname = NULL ;
2002-08-18 18:04:00 +00:00
if ( argc ! = 2 ) {
printf ( " Usage: realpath <path> \n " ) ;
return NT_STATUS_OK ;
}
2017-06-30 11:32:59 -07:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
if ( SMB_VFS_REALPATH ( vfs - > conn , mem_ctx , smb_fname ) = = NULL ) {
2002-08-18 18:04:00 +00:00
printf ( " realpath: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
printf ( " realpath: ok \n " ) ;
return NT_STATUS_OK ;
}
2012-02-02 16:36:18 +01:00
static NTSTATUS cmd_getxattr ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
uint8_t * buf ;
ssize_t ret ;
2017-05-25 16:42:04 -07:00
struct smb_filename * smb_fname = NULL ;
2012-02-02 16:36:18 +01:00
if ( argc ! = 3 ) {
printf ( " Usage: getxattr <path> <xattr> \n " ) ;
return NT_STATUS_OK ;
}
buf = NULL ;
2017-05-25 16:42:04 -07:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
ret = SMB_VFS_GETXATTR ( vfs - > conn , smb_fname , argv [ 2 ] , buf ,
2012-02-02 16:36:18 +01:00
talloc_get_size ( buf ) ) ;
if ( ret = = - 1 ) {
int err = errno ;
printf ( " getxattr returned (%s) \n " , strerror ( err ) ) ;
return map_nt_error_from_unix ( err ) ;
}
buf = talloc_array ( mem_ctx , uint8_t , ret ) ;
if ( buf = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2017-05-25 16:42:04 -07:00
ret = SMB_VFS_GETXATTR ( vfs - > conn , smb_fname , argv [ 2 ] , buf ,
2012-02-02 16:36:18 +01:00
talloc_get_size ( buf ) ) ;
if ( ret = = - 1 ) {
int err = errno ;
printf ( " getxattr returned (%s) \n " , strerror ( err ) ) ;
return map_nt_error_from_unix ( err ) ;
}
dump_data_file ( buf , talloc_get_size ( buf ) , false , stdout ) ;
return NT_STATUS_OK ;
}
2012-02-02 17:45:09 +01:00
static NTSTATUS cmd_listxattr ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
char * buf , * p ;
ssize_t ret ;
2017-05-23 13:12:29 -07:00
struct smb_filename * smb_fname = NULL ;
2012-02-02 17:45:09 +01:00
if ( argc ! = 2 ) {
printf ( " Usage: listxattr <path> \n " ) ;
return NT_STATUS_OK ;
}
buf = NULL ;
2017-05-23 13:12:29 -07:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
ret = SMB_VFS_LISTXATTR ( vfs - > conn , smb_fname ,
buf , talloc_get_size ( buf ) ) ;
2012-02-02 17:45:09 +01:00
if ( ret = = - 1 ) {
int err = errno ;
printf ( " listxattr returned (%s) \n " , strerror ( err ) ) ;
return map_nt_error_from_unix ( err ) ;
}
buf = talloc_array ( mem_ctx , char , ret ) ;
if ( buf = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2017-05-23 13:12:29 -07:00
ret = SMB_VFS_LISTXATTR ( vfs - > conn , smb_fname ,
buf , talloc_get_size ( buf ) ) ;
2012-02-02 17:45:09 +01:00
if ( ret = = - 1 ) {
int err = errno ;
printf ( " listxattr returned (%s) \n " , strerror ( err ) ) ;
return map_nt_error_from_unix ( err ) ;
}
if ( ret = = 0 ) {
return NT_STATUS_OK ;
}
if ( buf [ ret - 1 ] ! = ' \0 ' ) {
printf ( " listxattr returned non 0-terminated strings \n " ) ;
return NT_STATUS_INTERNAL_ERROR ;
}
p = buf ;
while ( p < buf + ret ) {
printf ( " %s \n " , p ) ;
p = strchr ( p , 0 ) ;
p + = 1 ;
}
return NT_STATUS_OK ;
}
2012-02-02 19:36:00 +01:00
static NTSTATUS cmd_setxattr ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
ssize_t ret ;
int flags = 0 ;
2017-05-25 12:41:31 -07:00
struct smb_filename * smb_fname = NULL ;
2012-02-02 19:36:00 +01:00
if ( ( argc < 4 ) | | ( argc > 5 ) ) {
printf ( " Usage: setxattr <path> <xattr> <value> [flags] \n " ) ;
return NT_STATUS_OK ;
}
if ( argc = = 5 ) {
flags = atoi ( argv [ 4 ] ) ;
}
2017-05-25 12:41:31 -07:00
smb_fname = synthetic_smb_fname_split ( mem_ctx ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
ret = SMB_VFS_SETXATTR ( vfs - > conn , smb_fname , argv [ 2 ] ,
2012-02-02 19:36:00 +01:00
argv [ 3 ] , strlen ( argv [ 3 ] ) , flags ) ;
if ( ret = = - 1 ) {
int err = errno ;
printf ( " setxattr returned (%s) \n " , strerror ( err ) ) ;
return map_nt_error_from_unix ( err ) ;
}
return NT_STATUS_OK ;
}
2012-02-02 19:41:56 +01:00
static NTSTATUS cmd_removexattr ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
ssize_t ret ;
2017-05-24 11:35:50 -07:00
struct smb_filename * smb_fname = NULL ;
2012-02-02 19:41:56 +01:00
if ( argc ! = 3 ) {
printf ( " Usage: removexattr <path> <xattr> \n " ) ;
return NT_STATUS_OK ;
}
2017-05-24 11:35:50 -07:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
NULL ,
ssf_flags ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
ret = SMB_VFS_REMOVEXATTR ( vfs - > conn , smb_fname , argv [ 2 ] ) ;
2012-02-02 19:41:56 +01:00
if ( ret = = - 1 ) {
int err = errno ;
printf ( " removexattr returned (%s) \n " , strerror ( err ) ) ;
return map_nt_error_from_unix ( err ) ;
}
return NT_STATUS_OK ;
}
2012-08-16 13:44:48 +10:00
static NTSTATUS cmd_fget_nt_acl ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
int fd ;
NTSTATUS status ;
struct security_descriptor * sd ;
if ( argc ! = 2 ) {
printf ( " Usage: fget_nt_acl <fd> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
if ( fd < 0 | | fd > = 1024 ) {
printf ( " fget_nt_acl: error=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " fget_nt_acl: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
2012-10-10 11:50:27 +11:00
status = SMB_VFS_FGET_NT_ACL ( vfs - > files [ fd ] ,
SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL ,
talloc_tos ( ) , & sd ) ;
2012-08-16 13:44:48 +10:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " fget_nt_acl returned (%s) \n " , nt_errstr ( status ) ) ;
return status ;
}
printf ( " %s \n " , sddl_encode ( talloc_tos ( ) , sd , get_global_sam_sid ( ) ) ) ;
TALLOC_FREE ( sd ) ;
return NT_STATUS_OK ;
}
static NTSTATUS cmd_get_nt_acl ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
NTSTATUS status ;
struct security_descriptor * sd ;
2016-02-12 10:30:10 -08:00
struct smb_filename * smb_fname = NULL ;
2012-08-16 13:44:48 +10:00
if ( argc ! = 2 ) {
printf ( " Usage: get_nt_acl <path> \n " ) ;
return NT_STATUS_OK ;
}
2016-02-12 10:30:10 -08:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
2016-03-18 21:19:38 -07:00
NULL ,
ssf_flags ( ) ) ;
2016-02-12 10:30:10 -08:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
status = SMB_VFS_GET_NT_ACL ( vfs - > conn , smb_fname ,
2012-10-10 11:50:27 +11:00
SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL ,
talloc_tos ( ) , & sd ) ;
2012-08-16 13:44:48 +10:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " get_nt_acl returned (%s) \n " , nt_errstr ( status ) ) ;
return status ;
}
printf ( " %s \n " , sddl_encode ( talloc_tos ( ) , sd , get_global_sam_sid ( ) ) ) ;
TALLOC_FREE ( sd ) ;
return NT_STATUS_OK ;
}
static NTSTATUS cmd_fset_nt_acl ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
int fd ;
NTSTATUS status ;
struct security_descriptor * sd ;
if ( argc ! = 3 ) {
printf ( " Usage: fset_nt_acl <fd> <sddl> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
if ( fd < 0 | | fd > = 1024 ) {
printf ( " fset_nt_acl: error=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " fset_nt_acl: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
sd = sddl_decode ( talloc_tos ( ) , argv [ 2 ] , get_global_sam_sid ( ) ) ;
if ( ! sd ) {
printf ( " sddl_decode failed to parse %s as SDDL \n " , argv [ 2 ] ) ;
return NT_STATUS_INVALID_PARAMETER ;
}
status = SMB_VFS_FSET_NT_ACL ( vfs - > files [ fd ] , SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL , sd ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " fset_nt_acl returned (%s) \n " , nt_errstr ( status ) ) ;
return status ;
}
TALLOC_FREE ( sd ) ;
return NT_STATUS_OK ;
}
static NTSTATUS cmd_set_nt_acl ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx , int argc , const char * * argv )
{
int flags ;
int ret ;
mode_t mode ;
files_struct * fsp ;
struct smb_filename * smb_fname = NULL ;
NTSTATUS status ;
struct security_descriptor * sd = NULL ;
if ( argc ! = 3 ) {
printf ( " Usage: set_nt_acl <file> <sddl> \n " ) ;
return NT_STATUS_OK ;
}
mode = 00400 ;
2012-08-16 13:46:02 +10:00
fsp = talloc_zero ( vfs , struct files_struct ) ;
2012-08-16 13:44:48 +10:00
if ( fsp = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2012-08-16 13:46:02 +10:00
fsp - > fh = talloc_zero ( fsp , struct fd_handle ) ;
2012-08-16 13:44:48 +10:00
if ( fsp - > fh = = NULL ) {
2012-08-16 13:46:02 +10:00
TALLOC_FREE ( fsp ) ;
2012-08-16 13:44:48 +10:00
return NT_STATUS_NO_MEMORY ;
}
fsp - > conn = vfs - > conn ;
2016-03-09 16:00:47 -08:00
smb_fname = synthetic_smb_fname_split ( NULL ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
2013-04-15 11:49:54 +02:00
if ( smb_fname = = NULL ) {
2012-08-16 13:46:02 +10:00
TALLOC_FREE ( fsp ) ;
2013-04-15 11:49:54 +02:00
return NT_STATUS_NO_MEMORY ;
2012-08-16 13:44:48 +10:00
}
fsp - > fsp_name = smb_fname ;
2012-08-16 16:50:47 +10:00
# ifdef O_DIRECTORY
flags = O_RDONLY | O_DIRECTORY ;
# else
/* POSIX allows us to open a directory with O_RDONLY. */
flags = O_RDONLY ;
# endif
fsp - > fh - > fd = SMB_VFS_OPEN ( vfs - > conn , smb_fname , fsp , O_RDWR , mode ) ;
if ( fsp - > fh - > fd = = - 1 & & errno = = EISDIR ) {
fsp - > fh - > fd = SMB_VFS_OPEN ( vfs - > conn , smb_fname , fsp , flags , mode ) ;
}
2012-08-16 13:44:48 +10:00
if ( fsp - > fh - > fd = = - 1 ) {
printf ( " open: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2012-08-16 13:46:02 +10:00
TALLOC_FREE ( fsp ) ;
2012-08-16 13:44:48 +10:00
TALLOC_FREE ( smb_fname ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2013-12-04 14:01:57 +01:00
status = NT_STATUS_OK ;
2012-08-16 13:46:02 +10:00
ret = SMB_VFS_FSTAT ( fsp , & smb_fname - > st ) ;
if ( ret = = - 1 ) {
/* If we have an fd, this stat should succeed. */
DEBUG ( 0 , ( " Error doing fstat on open file %s "
" (%s) \n " ,
smb_fname_str_dbg ( smb_fname ) ,
strerror ( errno ) ) ) ;
status = map_nt_error_from_unix ( errno ) ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto out ;
}
fsp - > file_id = vfs_file_id_from_sbuf ( vfs - > conn , & smb_fname - > st ) ;
fsp - > vuid = UID_FIELD_INVALID ;
fsp - > file_pid = 0 ;
2020-04-02 17:09:36 +02:00
fsp - > fsp_flags . can_lock = true ;
2020-04-02 17:18:43 +02:00
fsp - > fsp_flags . can_read = true ;
2012-08-16 13:46:02 +10:00
fsp - > can_write = True ;
fsp - > print_file = NULL ;
fsp - > modified = False ;
fsp - > sent_oplock_break = NO_BREAK_SENT ;
2012-11-13 12:21:45 -08:00
fsp - > is_directory = S_ISDIR ( smb_fname - > st . st_ex_mode ) ;
2012-08-16 13:46:02 +10:00
2012-08-16 13:44:48 +10:00
sd = sddl_decode ( talloc_tos ( ) , argv [ 2 ] , get_global_sam_sid ( ) ) ;
if ( ! sd ) {
printf ( " sddl_decode failed to parse %s as SDDL \n " , argv [ 2 ] ) ;
status = NT_STATUS_INVALID_PARAMETER ;
goto out ;
}
status = SMB_VFS_FSET_NT_ACL ( fsp , SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL , sd ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " fset_nt_acl returned (%s) \n " , nt_errstr ( status ) ) ;
goto out ;
}
out :
TALLOC_FREE ( sd ) ;
ret = SMB_VFS_CLOSE ( fsp ) ;
if ( ret = = - 1 )
printf ( " close: error=%d (%s) \n " , errno , strerror ( errno ) ) ;
2012-08-16 13:46:02 +10:00
TALLOC_FREE ( fsp ) ;
2012-08-16 13:44:48 +10:00
return status ;
}
static NTSTATUS cmd_sys_acl_get_fd ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
int fd ;
SMB_ACL_T acl ;
char * acl_text ;
if ( argc ! = 2 ) {
printf ( " Usage: sys_acl_get_fd <fd> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
if ( fd < 0 | | fd > = 1024 ) {
printf ( " sys_acl_get_fd: error=%d (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " sys_acl_get_fd: error=%d (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
2012-10-10 10:18:32 +11:00
acl = SMB_VFS_SYS_ACL_GET_FD ( vfs - > files [ fd ] , talloc_tos ( ) ) ;
2012-08-16 13:44:48 +10:00
if ( ! acl ) {
printf ( " sys_acl_get_fd failed (%s) \n " , strerror ( errno ) ) ;
2013-12-04 14:01:57 +01:00
return NT_STATUS_UNSUCCESSFUL ;
2012-08-16 13:44:48 +10:00
}
acl_text = sys_acl_to_text ( acl , NULL ) ;
printf ( " %s " , acl_text ) ;
TALLOC_FREE ( acl ) ;
SAFE_FREE ( acl_text ) ;
return NT_STATUS_OK ;
}
static NTSTATUS cmd_sys_acl_get_file ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
SMB_ACL_T acl ;
char * acl_text ;
int type ;
2017-05-23 17:11:18 -07:00
struct smb_filename * smb_fname = NULL ;
2012-08-16 13:44:48 +10:00
if ( argc ! = 3 ) {
printf ( " Usage: sys_acl_get_file <path> <type> \n " ) ;
return NT_STATUS_OK ;
}
2017-05-23 17:11:18 -07:00
smb_fname = synthetic_smb_fname_split ( talloc_tos ( ) ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2012-08-16 13:44:48 +10:00
type = atoi ( argv [ 2 ] ) ;
2017-05-23 17:11:18 -07:00
acl = SMB_VFS_SYS_ACL_GET_FILE ( vfs - > conn , smb_fname ,
type , talloc_tos ( ) ) ;
2012-08-16 13:44:48 +10:00
if ( ! acl ) {
printf ( " sys_acl_get_file failed (%s) \n " , strerror ( errno ) ) ;
2013-12-04 14:01:57 +01:00
return NT_STATUS_UNSUCCESSFUL ;
2012-08-16 13:44:48 +10:00
}
acl_text = sys_acl_to_text ( acl , NULL ) ;
printf ( " %s " , acl_text ) ;
TALLOC_FREE ( acl ) ;
SAFE_FREE ( acl_text ) ;
return NT_STATUS_OK ;
}
2012-11-15 15:19:07 +01:00
static NTSTATUS cmd_sys_acl_blob_get_file ( struct vfs_state * vfs ,
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
char * description ;
DATA_BLOB blob ;
int ret ;
size_t i ;
2017-05-23 17:35:59 -07:00
struct smb_filename * smb_fname = NULL ;
2012-11-15 15:19:07 +01:00
if ( argc ! = 2 ) {
printf ( " Usage: sys_acl_get_file <path> \n " ) ;
return NT_STATUS_OK ;
}
2017-05-23 17:35:59 -07:00
smb_fname = synthetic_smb_fname_split ( talloc_tos ( ) ,
argv [ 1 ] ,
lp_posix_pathnames ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
ret = SMB_VFS_SYS_ACL_BLOB_GET_FILE ( vfs - > conn , smb_fname , talloc_tos ( ) ,
2012-11-15 15:19:07 +01:00
& description , & blob ) ;
if ( ret ! = 0 ) {
printf ( " sys_acl_blob_get_file failed (%s) \n " , strerror ( errno ) ) ;
return map_nt_error_from_unix ( errno ) ;
}
printf ( " Description: %s \n " , description ) ;
for ( i = 0 ; i < blob . length ; i + + ) {
printf ( " %.2x " , blob . data [ i ] ) ;
}
printf ( " \n " ) ;
return NT_STATUS_OK ;
}
2012-11-15 15:25:52 +01:00
static NTSTATUS cmd_sys_acl_blob_get_fd ( struct vfs_state * vfs ,
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
int fd ;
char * description ;
DATA_BLOB blob ;
int ret ;
size_t i ;
if ( argc ! = 2 ) {
printf ( " Usage: sys_acl_blob_get_fd <fd> \n " ) ;
return NT_STATUS_OK ;
}
fd = atoi ( argv [ 1 ] ) ;
if ( fd < 0 | | fd > = 1024 ) {
printf ( " sys_acl_blob_get_fd: error=%d "
" (file descriptor out of range) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
if ( vfs - > files [ fd ] = = NULL ) {
printf ( " sys_acl_blob_get_fd: error=%d "
" (invalid file descriptor) \n " , EBADF ) ;
return NT_STATUS_OK ;
}
ret = SMB_VFS_SYS_ACL_BLOB_GET_FD ( vfs - > files [ fd ] , talloc_tos ( ) ,
& description , & blob ) ;
if ( ret ! = 0 ) {
printf ( " sys_acl_blob_get_fd failed (%s) \n " , strerror ( errno ) ) ;
return map_nt_error_from_unix ( errno ) ;
}
printf ( " Description: %s \n " , description ) ;
for ( i = 0 ; i < blob . length ; i + + ) {
printf ( " %.2x " , blob . data [ i ] ) ;
}
printf ( " \n " ) ;
return NT_STATUS_OK ;
}
2012-11-15 15:19:07 +01:00
2012-08-16 13:44:48 +10:00
static NTSTATUS cmd_sys_acl_delete_def_file ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
int ret ;
2017-05-23 15:33:31 -07:00
struct smb_filename * smb_fname = NULL ;
2012-08-16 13:44:48 +10:00
if ( argc ! = 2 ) {
printf ( " Usage: sys_acl_delete_def_file <path> \n " ) ;
return NT_STATUS_OK ;
}
2017-05-23 15:33:31 -07:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
argv [ 1 ] ,
NULL ,
NULL ,
ssf_flags ( ) ) ;
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
ret = SMB_VFS_SYS_ACL_DELETE_DEF_FILE ( vfs - > conn , smb_fname ) ;
2012-08-16 13:44:48 +10:00
if ( ret = = - 1 ) {
printf ( " sys_acl_delete_def_file failed (%s) \n " , strerror ( errno ) ) ;
2017-05-23 15:33:31 -07:00
TALLOC_FREE ( smb_fname ) ;
2012-08-16 13:44:48 +10:00
return NT_STATUS_UNSUCCESSFUL ;
}
2017-05-23 15:33:31 -07:00
TALLOC_FREE ( smb_fname ) ;
2012-08-16 13:44:48 +10:00
return NT_STATUS_OK ;
}
2013-03-10 05:43:24 +01:00
/* Afaik translate name was first introduced with vfs_catia, to be able
to translate unix file / dir - names , containing invalid windows characters ,
to valid windows names .
The used translation direction is always unix - - > windows
*/
static NTSTATUS cmd_translate_name ( struct vfs_state * vfs , TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
2020-03-18 17:40:29 +01:00
const char * dname = NULL ;
char * dname_talloced = NULL ;
2013-03-10 05:43:24 +01:00
SMB_STRUCT_STAT st ;
bool found = false ;
char * translated = NULL ;
2016-02-26 14:53:12 -08:00
struct smb_filename * smb_fname = NULL ;
2013-03-10 05:43:24 +01:00
NTSTATUS status ;
if ( argc ! = 2 ) {
DEBUG ( 0 , ( " Usage: translate_name unix_filename \n " ) ) ;
return NT_STATUS_UNSUCCESSFUL ;
}
2016-02-26 14:53:12 -08:00
smb_fname = synthetic_smb_fname ( talloc_tos ( ) ,
" . " ,
NULL ,
2016-03-18 21:19:38 -07:00
NULL ,
ssf_flags ( ) ) ;
2016-02-26 14:53:12 -08:00
if ( smb_fname = = NULL ) {
return NT_STATUS_NO_MEMORY ;
}
2020-03-18 17:40:29 +01:00
vfs - > currentdir = OpenDir ( talloc_tos ( ) ,
vfs - > conn ,
smb_fname ,
NULL ,
0 ) ;
2013-03-10 05:43:24 +01:00
if ( vfs - > currentdir = = NULL ) {
DEBUG ( 0 , ( " cmd_translate_name: opendir error=%d (%s) \n " ,
errno , strerror ( errno ) ) ) ;
2016-02-26 14:53:12 -08:00
TALLOC_FREE ( smb_fname ) ;
2013-03-10 05:43:24 +01:00
return NT_STATUS_UNSUCCESSFUL ;
}
2020-03-18 17:40:29 +01:00
vfs - > currentdir_offset = 0 ;
2013-03-10 05:43:24 +01:00
while ( true ) {
2020-03-18 17:40:29 +01:00
/* ReadDirName() returns Windows "encoding" */
dname = ReadDirName ( vfs - > currentdir ,
& vfs - > currentdir_offset ,
& st ,
& dname_talloced ) ;
if ( dname = = NULL ) {
2013-03-10 05:43:24 +01:00
break ;
}
2020-03-18 17:40:29 +01:00
/* Convert Windows "encoding" from ReadDirName() to UNIX */
status = SMB_VFS_TRANSLATE_NAME ( vfs - > conn ,
dname ,
vfs_translate_to_unix ,
talloc_tos ( ) ,
& translated ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
DBG_ERR ( " file '%s' cannot be translated \n " , argv [ 1 ] ) ;
goto cleanup ;
}
/*
* argv [ 1 ] uses UNIX " encoding " , so compare with translation
* result .
*/
if ( strcmp ( translated , argv [ 1 ] ) = = 0 ) {
2013-03-10 05:43:24 +01:00
found = true ;
break ;
}
2020-03-18 17:40:29 +01:00
TALLOC_FREE ( dname_talloced ) ;
TALLOC_FREE ( translated ) ;
2013-03-10 05:43:24 +01:00
} ;
if ( ! found ) {
DEBUG ( 0 , ( " cmd_translate_name: file '%s' not found. \n " ,
argv [ 1 ] ) ) ;
status = NT_STATUS_UNSUCCESSFUL ;
goto cleanup ;
}
2020-03-18 17:40:29 +01:00
2013-03-10 05:43:24 +01:00
/* translation success. But that could also mean
that translating " aaa " to " aaa " was successful : - (
*/
2020-03-18 17:40:29 +01:00
DBG_ERR ( " file '%s' --> '%s' \n " , argv [ 1 ] , dname ) ;
status = NT_STATUS_OK ;
2013-03-10 05:43:24 +01:00
cleanup :
2020-03-18 17:40:29 +01:00
TALLOC_FREE ( dname_talloced ) ;
TALLOC_FREE ( translated ) ;
2016-02-26 14:53:12 -08:00
TALLOC_FREE ( smb_fname ) ;
2020-03-18 17:40:29 +01:00
TALLOC_FREE ( vfs - > currentdir ) ;
vfs - > currentdir_offset = 0 ;
return status ;
2013-03-10 05:43:24 +01:00
}
2002-08-18 18:04:00 +00:00
struct cmd_set vfs_commands [ ] = {
2019-01-08 17:09:11 +01:00
{ . name = " VFS Commands " } ,
2002-08-18 18:04:00 +00:00
{ " load " , cmd_load_module , " Load a module " , " load <module.so> " } ,
{ " populate " , cmd_populate , " Populate a data buffer " , " populate <char> <size> " } ,
{ " showdata " , cmd_show_data , " Show data currently in data buffer " , " show_data [<offset> <len>] " } ,
{ " connect " , cmd_connect , " VFS connect() " , " connect " } ,
{ " disconnect " , cmd_disconnect , " VFS disconnect() " , " disconnect " } ,
{ " disk_free " , cmd_disk_free , " VFS disk_free() " , " disk_free <path> " } ,
{ " opendir " , cmd_opendir , " VFS opendir() " , " opendir <fname> " } ,
{ " readdir " , cmd_readdir , " VFS readdir() " , " readdir " } ,
{ " mkdir " , cmd_mkdir , " VFS mkdir() " , " mkdir <path> " } ,
{ " rmdir " , cmd_pathfunc , " VFS rmdir() " , " rmdir <path> " } ,
{ " closedir " , cmd_closedir , " VFS closedir() " , " closedir " } ,
2013-11-08 13:56:23 +01:00
{ " open " , cmd_open , " VFS open() " , " open <fname> <flags> <mode> " } ,
2002-08-18 18:04:00 +00:00
{ " close " , cmd_close , " VFS close() " , " close <fd> " } ,
{ " read " , cmd_read , " VFS read() " , " read <fd> <size> " } ,
{ " write " , cmd_write , " VFS write() " , " write <fd> <size> " } ,
{ " lseek " , cmd_lseek , " VFS lseek() " , " lseek <fd> <offset> <whence> " } ,
{ " rename " , cmd_rename , " VFS rename() " , " rename <old> <new> " } ,
{ " fsync " , cmd_fsync , " VFS fsync() " , " fsync <fd> " } ,
{ " stat " , cmd_stat , " VFS stat() " , " stat <fname> " } ,
{ " fstat " , cmd_fstat , " VFS fstat() " , " fstat <fd> " } ,
{ " lstat " , cmd_lstat , " VFS lstat() " , " lstat <fname> " } ,
{ " unlink " , cmd_pathfunc , " VFS unlink() " , " unlink <fname> " } ,
{ " chmod " , cmd_chmod , " VFS chmod() " , " chmod <path> <mode> " } ,
{ " fchmod " , cmd_fchmod , " VFS fchmod() " , " fchmod <fd> <mode> " } ,
{ " fchown " , cmd_fchown , " VFS fchown() " , " fchown <fd> <uid> <gid> " } ,
{ " chdir " , cmd_pathfunc , " VFS chdir() " , " chdir <path> " } ,
{ " getwd " , cmd_getwd , " VFS getwd() " , " getwd " } ,
{ " utime " , cmd_utime , " VFS utime() " , " utime <path> <access> <modify> " } ,
{ " ftruncate " , cmd_ftruncate , " VFS ftruncate() " , " ftruncate <fd> <length> " } ,
2002-08-21 02:34:49 +00:00
{ " lock " , cmd_lock , " VFS lock() " , " lock <f> <op> <offset> <count> <type> " } ,
2002-08-18 18:04:00 +00:00
{ " symlink " , cmd_symlink , " VFS symlink() " , " symlink <old> <new> " } ,
{ " readlink " , cmd_readlink , " VFS readlink() " , " readlink <path> " } ,
{ " link " , cmd_link , " VFS link() " , " link <oldpath> <newpath> " } ,
2002-08-21 02:34:49 +00:00
{ " mknod " , cmd_mknod , " VFS mknod() " , " mknod <path> <mode> <dev> " } ,
2002-08-18 18:04:00 +00:00
{ " realpath " , cmd_realpath , " VFS realpath() " , " realpath <path> " } ,
2012-02-02 16:36:18 +01:00
{ " getxattr " , cmd_getxattr , " VFS getxattr() " ,
" getxattr <path> <name> " } ,
2012-02-02 17:45:09 +01:00
{ " listxattr " , cmd_listxattr , " VFS listxattr() " ,
" listxattr <path> " } ,
2012-02-02 19:36:00 +01:00
{ " setxattr " , cmd_setxattr , " VFS setxattr() " ,
" setxattr <path> <name> <value> [<flags>] " } ,
2012-02-02 19:41:56 +01:00
{ " removexattr " , cmd_removexattr , " VFS removexattr() " ,
" removexattr <path> <name> \n " } ,
2012-08-16 13:44:48 +10:00
{ " fget_nt_acl " , cmd_fget_nt_acl , " VFS fget_nt_acl() " ,
" fget_nt_acl <fd> \n " } ,
{ " get_nt_acl " , cmd_get_nt_acl , " VFS get_nt_acl() " ,
" get_nt_acl <path> \n " } ,
{ " fset_nt_acl " , cmd_fset_nt_acl , " VFS fset_nt_acl() " ,
" fset_nt_acl <fd> \n " } ,
{ " set_nt_acl " , cmd_set_nt_acl , " VFS open() and fset_nt_acl() " ,
" set_nt_acl <file> \n " } ,
{ " sys_acl_get_file " , cmd_sys_acl_get_file , " VFS sys_acl_get_file() " , " sys_acl_get_file <path> " } ,
{ " sys_acl_get_fd " , cmd_sys_acl_get_fd , " VFS sys_acl_get_fd() " , " sys_acl_get_fd <fd> " } ,
2012-11-15 15:19:07 +01:00
{ " sys_acl_blob_get_file " , cmd_sys_acl_blob_get_file ,
" VFS sys_acl_blob_get_file() " , " sys_acl_blob_get_file <path> " } ,
2012-11-15 15:25:52 +01:00
{ " sys_acl_blob_get_fd " , cmd_sys_acl_blob_get_fd ,
" VFS sys_acl_blob_get_fd() " , " sys_acl_blob_get_fd <path> " } ,
2012-08-16 13:44:48 +10:00
{ " sys_acl_delete_def_file " , cmd_sys_acl_delete_def_file , " VFS sys_acl_delete_def_file() " , " sys_acl_delete_def_file <path> " } ,
2012-02-28 00:19:48 +01:00
{ " test_chain " , cmd_test_chain , " test chain code " ,
" test_chain " } ,
2013-03-10 05:43:24 +01:00
{ " translate_name " , cmd_translate_name , " VFS translate_name() " , " translate_name unix_filename " } ,
2002-08-18 18:04:00 +00:00
{ NULL }
} ;