}
static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
errno = ENOSYS;
return (SMB_ACL_T) NULL;
}
static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
- return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+ return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
}
static int skel_sys_acl_blob_get_file(vfs_handle_struct *handle,
TALLOC_CTX *mem_ctx);
SMB_ACL_T (*sys_acl_get_fd_fn)(struct vfs_handle_struct *handle,
struct files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx);
int (*sys_acl_blob_get_file_fn)(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx);
SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
struct files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx);
int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx);
SMB_ACL_T vfs_not_implemented_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx);
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx);
int vfs_not_implemented_sys_acl_blob_get_file(vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
#define SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, smb_fname, type, mem_ctx) \
smb_vfs_call_sys_acl_get_file((handle)->next, (smb_fname), (type), (mem_ctx))
-#define SMB_VFS_SYS_ACL_GET_FD(fsp, mem_ctx) \
- smb_vfs_call_sys_acl_get_fd((fsp)->conn->vfs_handles, (fsp), (mem_ctx))
-#define SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx) \
- smb_vfs_call_sys_acl_get_fd((handle)->next, (fsp), (mem_ctx))
+#define SMB_VFS_SYS_ACL_GET_FD(fsp, type, mem_ctx) \
+ smb_vfs_call_sys_acl_get_fd((fsp)->conn->vfs_handles, (fsp), (type), (mem_ctx))
+#define SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx) \
+ smb_vfs_call_sys_acl_get_fd((handle)->next, (fsp), (type), (mem_ctx))
#define SMB_VFS_SYS_ACL_BLOB_GET_FILE(conn, smb_fname, mem_ctx, blob_description, blob) \
smb_vfs_call_sys_acl_blob_get_file((conn)->vfs_handles, (smb_fname), (mem_ctx), (blob_description), (blob))
SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
- return posixacl_sys_acl_get_fd(handle, fsp, mem_ctx);
+ return posixacl_sys_acl_get_fd(handle, fsp, type, mem_ctx);
}
int sys_acl_set_file(vfs_handle_struct *handle,
SMB_ACL_T posixacl_xattr_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
int ret;
int size = ACL_EA_SIZE(20);
char *buf = alloca(size);
+ const char *name;
+
+ if (type == SMB_ACL_TYPE_ACCESS) {
+ name = ACL_EA_ACCESS;
+ } else if (type == SMB_ACL_TYPE_DEFAULT) {
+ name = ACL_EA_DEFAULT;
+ } else {
+ errno = EINVAL;
+ return NULL;
+ }
if (!buf) {
return NULL;
}
- ret = SMB_VFS_FGETXATTR(fsp, ACL_EA_ACCESS, buf, size);
+ ret = SMB_VFS_FGETXATTR(fsp, name, buf, size);
if (ret < 0 && errno == ERANGE) {
- size = SMB_VFS_FGETXATTR(fsp, ACL_EA_ACCESS, NULL, 0);
+ size = SMB_VFS_FGETXATTR(fsp, name, NULL, 0);
if (size > 0) {
buf = alloca(size);
if (!buf) {
return NULL;
}
- ret = SMB_VFS_FGETXATTR(fsp, ACL_EA_ACCESS, buf, size);
+ ret = SMB_VFS_FGETXATTR(fsp, name, buf, size);
}
}
SMB_ACL_T posixacl_xattr_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx);
int posixacl_xattr_acl_set_file(vfs_handle_struct *handle,
SMB_ACL_T aixacl_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
int rc = 0;
uid_t user_id;
+ /* AIX has no DEFAULT */
+ if ( type == SMB_ACL_TYPE_DEFAULT ) {
+ return NULL;
+ }
+
/* Get the acl using fstatacl */
DEBUG(10,("Entering AIX sys_acl_get_fd\n"));
}
SMB_ACL_T aixjfs2_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
acl_type_t aixjfs2_type;
- aixjfs2_type.u64 = ACL_AIXC;
+
+ switch(type) {
+ case SMB_ACL_TYPE_ACCESS:
+ aixjfs2_type.u64 = ACL_AIXC;
+ break;
+ case SMB_ACL_TYPE_DEFAULT:
+ DEBUG(0, ("Got AIX JFS2 unsupported type: %d\n", type));
+ return NULL;
+ default:
+ DEBUG(0, ("Got invalid type: %d\n", type));
+ smb_panic("exiting");
+ }
return aixjfs2_get_posix_acl(fsp->fsp_name->base_name,
aixjfs2_type, mem_ctx);
static SMB_ACL_T catia_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
struct catia_cache *cc = NULL;
return NULL;
}
- result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+ result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
CATIA_FETCH_FSP_POST_NEXT(&cc, fsp);
static SMB_ACL_T vfswrap_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
- return sys_acl_get_fd(handle, fsp, SMB_ACL_TYPE_ACCESS, mem_ctx);
+ return sys_acl_get_fd(handle, fsp, type, mem_ctx);
}
static int vfswrap_sys_acl_set_fd(vfs_handle_struct *handle,
static SMB_ACL_T fake_acls_sys_acl_get_fd(struct vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
DATA_BLOB blob = data_blob_null;
ssize_t length;
- const char *name = FAKE_ACL_ACCESS_XATTR;
+ const char *name = NULL;
struct smb_acl_t *acl = NULL;
TALLOC_CTX *frame = talloc_stackframe();
+ switch (type) {
+ case SMB_ACL_TYPE_ACCESS:
+ name = FAKE_ACL_ACCESS_XATTR;
+ break;
+ case SMB_ACL_TYPE_DEFAULT:
+ name = FAKE_ACL_DEFAULT_XATTR;
+ break;
+ default:
+ DBG_ERR("Illegal ACL type %d\n", (int)type);
+ break;
+ }
+
+ if (name == NULL) {
+ TALLOC_FREE(frame);
+ return NULL;
+ }
+
do {
blob.length += 1000;
blob.data = talloc_realloc(frame, blob.data, uint8_t, blob.length);
the_acl = fake_acls_sys_acl_get_fd(handle,
fsp,
+ SMB_ACL_TYPE_ACCESS,
talloc_tos());
if (the_acl == NULL) {
TALLOC_FREE(frame);
}
static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
SMB_ACL_T result;
- result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+ result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle,
+ fsp,
+ type,
+ mem_ctx);
do_log(SMB_VFS_OP_SYS_ACL_GET_FD, (result != NULL), handle,
"%s", fsp_str_do_log(fsp));
static SMB_ACL_T gpfsacl_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
+ gpfs_aclType_t gpfs_type;
struct gpfs_config_data *config;
SMB_VFS_HANDLE_GET_DATA(handle, config,
return NULL);
if (!config->acl) {
- return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+ return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
}
+ switch(type) {
+ case SMB_ACL_TYPE_ACCESS:
+ gpfs_type = GPFS_ACL_TYPE_ACCESS;
+ break;
+ case SMB_ACL_TYPE_DEFAULT:
+ gpfs_type = GPFS_ACL_TYPE_DEFAULT;
+ break;
+ default:
+ DEBUG(0, ("Got invalid type: %d\n", type));
+ smb_panic("exiting");
+ }
return gpfsacl_get_posix_acl(fsp->fsp_name->base_name,
- GPFS_ACL_TYPE_ACCESS, mem_ctx);
+ gpfs_type, mem_ctx);
}
static int gpfsacl_sys_acl_blob_get_file(vfs_handle_struct *handle,
*/
SMB_ACL_T hpuxacl_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
/*
return hpuxacl_sys_acl_get_file(handle,
fsp->fsp_name->base_name,
- SMB_ACL_TYPE_ACCESS,
+ type,
mem_ctx);
}
static SMB_ACL_T nfs4acl_xattr_fail__sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
return (SMB_ACL_T)NULL;
}
SMB_ACL_T vfs_not_implemented_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
errno = ENOSYS;
return (SMB_ACL_T) NULL;
}
SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
struct smb_acl_t *result;
acl_t acl = NULL;
+ acl_type_t acl_type;
- if (!fsp->fsp_flags.is_pathref) {
+ switch(type) {
+ case SMB_ACL_TYPE_ACCESS:
+ acl_type = ACL_TYPE_ACCESS;
+ break;
+ case SMB_ACL_TYPE_DEFAULT:
+ acl_type = ACL_TYPE_DEFAULT;
+ break;
+ default:
+ errno = EINVAL;
+ return NULL;
+ }
+ if (!fsp->fsp_flags.is_pathref && (acl_type == ACL_TYPE_ACCESS)) {
+ /* POSIX API only allows ACL_TYPE_ACCESS fetched on fd. */
acl = acl_get_fd(fsp_get_io_fd(fsp));
} else if (fsp->fsp_flags.have_proc_fds) {
int fd = fsp_get_pathref_fd(fsp);
return NULL;
}
- acl = acl_get_file(proc_fd_path, ACL_TYPE_ACCESS);
+ acl = acl_get_file(proc_fd_path, acl_type);
} else {
/*
* This is no longer a handle based call.
*/
- acl = acl_get_file(fsp->fsp_name->base_name, ACL_TYPE_ACCESS);
+ acl = acl_get_file(fsp->fsp_name->base_name, acl_type);
}
if (acl == NULL) {
return NULL;
SMB_ACL_T posixacl_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx);
int posixacl_sys_acl_set_file(vfs_handle_struct *handle,
* get the access ACL of a file referred to by a fd
*/
SMB_ACL_T solarisacl_sys_acl_get_fd(vfs_handle_struct *handle,
- files_struct *fsp, TALLOC_CTX *mem_ctx)
+ files_struct *fsp,
+ SMB_ACL_TYPE_T type,
+ TALLOC_CTX *mem_ctx)
{
SMB_ACL_T result = NULL;
int count;
if (!solaris_acl_get_fd(fsp_get_io_fd(fsp), &solaris_acl, &count)) {
goto done;
}
+
+ if (type != SMB_ACL_TYPE_ACCESS && type != SMB_ACL_TYPE_DEFAULT) {
+ DEBUG(10, ("invalid SMB_ACL_TYPE given (%d)\n", type));
+ errno = EINVAL;
+ goto done;
+ }
/*
* The facl call returns both ACCESS and DEFAULT acls (as present).
* The posix acl_get_fd function returns only the
* access acl. So we need to filter this out here.
*/
result = solaris_acl_to_smb_acl(solaris_acl, count,
- SMB_ACL_TYPE_ACCESS, mem_ctx);
+ type, mem_ctx);
if (result == NULL) {
DEBUG(10, ("conversion solaris_acl -> smb_acl failed (%s).\n",
strerror(errno)));
static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
SMB_ACL_T result;
double timediff;
clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+ result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
clock_gettime_mono(&ts2);
timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
static SMB_ACL_T zfsacl_fail__sys_acl_get_fd(vfs_handle_struct *handle,
files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
return (SMB_ACL_T)NULL;
}
/* Get the ACL from the fd. */
- posix_acl = SMB_VFS_SYS_ACL_GET_FD(fsp, frame);
+ posix_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+ SMB_ACL_TYPE_ACCESS,
+ frame);
/* If it's a directory get the default POSIX ACL. */
if(fsp->fsp_flags.is_directory) {
- def_acl = SMB_VFS_SYS_ACL_GET_FILE(fsp->conn,
- fsp->fsp_name,
- SMB_ACL_TYPE_DEFAULT,
- frame);
+ def_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+ SMB_ACL_TYPE_DEFAULT,
+ frame);
def_acl = free_empty_sys_acl(fsp->conn, def_acl);
}
}
/* Get the current file ACL. */
- file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp, talloc_tos());
+ file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+ SMB_ACL_TYPE_ACCESS,
+ talloc_tos());
if (file_acl == NULL) {
status = map_nt_error_from_unix(errno);
goto out;
}
- file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp,
+ file_acl = SMB_VFS_SYS_ACL_GET_FD(fsp, SMB_ACL_TYPE_ACCESS,
talloc_tos());
if (file_acl == NULL && no_acl_syscall_error(errno)) {
SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
struct files_struct *fsp,
+ SMB_ACL_TYPE_T type,
TALLOC_CTX *mem_ctx)
{
VFS_FIND(sys_acl_get_fd);
- return handle->fns->sys_acl_get_fd_fn(handle, fsp, mem_ctx);
+ return handle->fns->sys_acl_get_fd_fn(handle, fsp, type, mem_ctx);
}
int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
return NT_STATUS_OK;
}
- acl = SMB_VFS_SYS_ACL_GET_FD(vfs->files[fd], talloc_tos());
+ acl = SMB_VFS_SYS_ACL_GET_FD(vfs->files[fd],
+ SMB_ACL_TYPE_ACCESS,
+ talloc_tos());
if (!acl) {
printf("sys_acl_get_fd failed (%s)\n", strerror(errno));
return NT_STATUS_UNSUCCESSFUL;