diff options
author | Andrew Bartlett <abartlet@samba.org> | 2012-10-24 22:39:59 +1100 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2013-02-04 12:19:30 +0100 |
commit | 2a2dbf825972bfa16ae5dbe93e458de348571684 (patch) | |
tree | d9eb3e5057bad11409f96149a041aa61bbda5a4b /source3 | |
parent | e650a5fd61d7925888e3abf0a561af5a9a23f00b (diff) | |
download | samba-2a2dbf825972bfa16ae5dbe93e458de348571684.tar.gz samba-2a2dbf825972bfa16ae5dbe93e458de348571684.tar.bz2 samba-2a2dbf825972bfa16ae5dbe93e458de348571684.zip |
vfs: Add helper function for non posix ACL modules
This handles the stat, and fills in the pre-supplied blob into a
wrapper sturcture that can then be returned to vfs_acl_common for
hashing.
Andrew Bartlett
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Christian Ambach <ambi@samba.org>
Diffstat (limited to 'source3')
-rw-r--r-- | source3/modules/non_posix_acls.c | 102 | ||||
-rw-r--r-- | source3/modules/non_posix_acls.h | 29 | ||||
-rw-r--r-- | source3/modules/wscript_build | 5 |
3 files changed, 136 insertions, 0 deletions
diff --git a/source3/modules/non_posix_acls.c b/source3/modules/non_posix_acls.c new file mode 100644 index 0000000000..245b5c8d21 --- /dev/null +++ b/source3/modules/non_posix_acls.c @@ -0,0 +1,102 @@ +/* + 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, + const char *path_p, + DATA_BLOB acl_as_blob, + TALLOC_CTX *mem_ctx, + DATA_BLOB *blob) +{ + int ret; + TALLOC_CTX *frame = talloc_stackframe(); + struct xattr_sys_acl_hash_wrapper acl_wrapper = {}; + struct smb_filename *smb_fname = NULL; + NTSTATUS status = create_synthetic_smb_fname_split(frame, path_p, + NULL, + &smb_fname); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + 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; + + ret = smb_vfs_call_fstat(handle, fsp, &sbuf); + if (ret == -1) { + TALLOC_FREE(frame); + return -1; + } + + 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; +} diff --git a/source3/modules/non_posix_acls.h b/source3/modules/non_posix_acls.h new file mode 100644 index 0000000000..6567a317ff --- /dev/null +++ b/source3/modules/non_posix_acls.h @@ -0,0 +1,29 @@ +/* + 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/>. +*/ + +int non_posix_sys_acl_blob_get_file_helper(vfs_handle_struct *handle, + const char *path_p, + DATA_BLOB acl_as_blob, + TALLOC_CTX *mem_ctx, + DATA_BLOB *blob); +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); diff --git a/source3/modules/wscript_build b/source3/modules/wscript_build index 380afbaf8b..df86115757 100644 --- a/source3/modules/wscript_build +++ b/source3/modules/wscript_build @@ -55,6 +55,11 @@ bld.SAMBA3_SUBSYSTEM('NFS4_ACLS', source='nfs4_acls.c', deps='samba-util tdb') +bld.SAMBA3_LIBRARY('non_posix_acls', + source='non_posix_acls.c', + deps='samba-util vfs', + private_library=True) + bld.SAMBA3_SUBSYSTEM('VFS_AIXACL_UTIL', source='vfs_aixacl_util.c', enabled=False) #fixme |