2012-10-24 15:39:59 +04:00
/*
Unix SMB / CIFS implementation .
Access Control List handling
Copyright ( C ) Andrew Bartlett 2012.
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "../librpc/gen_ndr/ndr_xattr.h"
# include "modules/non_posix_acls.h"
int non_posix_sys_acl_blob_get_file_helper ( vfs_handle_struct * handle ,
2017-05-24 03:35:59 +03:00
const struct smb_filename * smb_fname_in ,
DATA_BLOB acl_as_blob ,
TALLOC_CTX * mem_ctx ,
DATA_BLOB * blob )
2012-10-24 15:39:59 +04:00
{
int ret ;
TALLOC_CTX * frame = talloc_stackframe ( ) ;
struct xattr_sys_acl_hash_wrapper acl_wrapper = { } ;
2017-05-24 03:35:59 +03:00
struct smb_filename * smb_fname = cp_smb_filename_nostream ( frame ,
smb_fname_in ) ;
2013-04-12 13:39:46 +04:00
if ( smb_fname = = NULL ) {
2012-10-24 15:39:59 +04:00
TALLOC_FREE ( frame ) ;
return - 1 ;
}
acl_wrapper . acl_as_blob = acl_as_blob ;
ret = smb_vfs_call_stat ( handle , smb_fname ) ;
if ( ret = = - 1 ) {
TALLOC_FREE ( frame ) ;
return - 1 ;
}
acl_wrapper . owner = smb_fname - > st . st_ex_uid ;
acl_wrapper . group = smb_fname - > st . st_ex_gid ;
acl_wrapper . mode = smb_fname - > st . st_ex_mode ;
if ( ! NDR_ERR_CODE_IS_SUCCESS ( ndr_push_struct_blob ( blob , mem_ctx ,
& acl_wrapper ,
( ndr_push_flags_fn_t ) ndr_push_xattr_sys_acl_hash_wrapper ) ) ) {
errno = EINVAL ;
TALLOC_FREE ( frame ) ;
return - 1 ;
}
TALLOC_FREE ( frame ) ;
return 0 ;
}
int non_posix_sys_acl_blob_get_fd_helper ( vfs_handle_struct * handle ,
files_struct * fsp ,
DATA_BLOB acl_as_blob ,
TALLOC_CTX * mem_ctx ,
DATA_BLOB * blob )
{
SMB_STRUCT_STAT sbuf ;
TALLOC_CTX * frame ;
struct xattr_sys_acl_hash_wrapper acl_wrapper ;
int ret ;
frame = talloc_stackframe ( ) ;
acl_wrapper . acl_as_blob = acl_as_blob ;
2012-10-30 16:43:59 +04:00
if ( ! VALID_STAT ( fsp - > fsp_name - > st ) ) {
ret = smb_vfs_call_fstat ( handle , fsp , & sbuf ) ;
if ( ret = = - 1 ) {
TALLOC_FREE ( frame ) ;
return - 1 ;
}
} else {
sbuf = fsp - > fsp_name - > st ;
2012-10-24 15:39:59 +04:00
}
acl_wrapper . owner = sbuf . st_ex_uid ;
acl_wrapper . group = sbuf . st_ex_gid ;
acl_wrapper . mode = sbuf . st_ex_mode ;
if ( ! NDR_ERR_CODE_IS_SUCCESS ( ndr_push_struct_blob ( blob , mem_ctx ,
& acl_wrapper ,
( ndr_push_flags_fn_t ) ndr_push_xattr_sys_acl_hash_wrapper ) ) ) {
errno = EINVAL ;
TALLOC_FREE ( frame ) ;
return - 1 ;
}
TALLOC_FREE ( frame ) ;
return 0 ;
}