mirror of
https://github.com/samba-team/samba.git
synced 2025-02-23 09:57:40 +03:00
s3: VFS: Change SMB_VFS_LISTXATTR to use const struct smb_filename * instead of const char *.
We need to migrate all pathname based VFS calls to use a struct to finish modernising the VFS with extra timestamp and flags parameters. Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
parent
aada94885d
commit
892476b555
@ -812,8 +812,10 @@ static ssize_t skel_fgetxattr(vfs_handle_struct *handle,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static ssize_t skel_listxattr(vfs_handle_struct *handle, const char *path,
|
||||
char *list, size_t size)
|
||||
static ssize_t skel_listxattr(vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
|
@ -946,10 +946,12 @@ static ssize_t skel_fgetxattr(vfs_handle_struct *handle,
|
||||
return SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
|
||||
}
|
||||
|
||||
static ssize_t skel_listxattr(vfs_handle_struct *handle, const char *path,
|
||||
char *list, size_t size)
|
||||
static ssize_t skel_listxattr(vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
}
|
||||
|
||||
static ssize_t skel_flistxattr(vfs_handle_struct *handle,
|
||||
|
@ -205,6 +205,8 @@
|
||||
to const struct smb_filename * */
|
||||
/* Version 37 - Change sys_acl_set_file from const char *
|
||||
to const struct smb_filename * */
|
||||
/* Version 37 - Change listxattr from const char *
|
||||
to const struct smb_filename * */
|
||||
|
||||
#define SMB_VFS_INTERFACE_VERSION 37
|
||||
|
||||
@ -889,7 +891,10 @@ struct vfs_fn_pointers {
|
||||
/* EA operations. */
|
||||
ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
|
||||
ssize_t (*fgetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size);
|
||||
ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
|
||||
ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size);
|
||||
ssize_t (*flistxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size);
|
||||
int (*removexattr_fn)(struct vfs_handle_struct *handle, const char *path, const char *name);
|
||||
int (*fremovexattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name);
|
||||
@ -1354,7 +1359,9 @@ ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
|
||||
struct files_struct *fsp, const char *name,
|
||||
void *value, size_t size);
|
||||
ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size);
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size);
|
||||
ssize_t smb_vfs_call_llistxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size);
|
||||
ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
|
||||
|
@ -525,10 +525,10 @@
|
||||
#define SMB_VFS_NEXT_FGETXATTR(handle,fsp,name,value,size) \
|
||||
smb_vfs_call_fgetxattr((handle)->next,(fsp),(name),(value),(size))
|
||||
|
||||
#define SMB_VFS_LISTXATTR(conn,path,list,size) \
|
||||
smb_vfs_call_listxattr((conn)->vfs_handles,(path),(list),(size))
|
||||
#define SMB_VFS_NEXT_LISTXATTR(handle,path,list,size) \
|
||||
smb_vfs_call_listxattr((handle)->next,(path),(list),(size))
|
||||
#define SMB_VFS_LISTXATTR(conn,smb_fname,list,size) \
|
||||
smb_vfs_call_listxattr((conn)->vfs_handles,(smb_fname),(list),(size))
|
||||
#define SMB_VFS_NEXT_LISTXATTR(handle,smb_fname,list,size) \
|
||||
smb_vfs_call_listxattr((handle)->next,(smb_fname),(list),(size))
|
||||
|
||||
#define SMB_VFS_FLISTXATTR(fsp,list,size) \
|
||||
smb_vfs_call_flistxattr((fsp)->conn->vfs_handles, (fsp), (list),(size))
|
||||
|
@ -675,15 +675,40 @@ static ssize_t cap_fgetxattr(vfs_handle_struct *handle, struct files_struct *fsp
|
||||
return SMB_VFS_NEXT_FGETXATTR(handle, fsp, cappath, value, size);
|
||||
}
|
||||
|
||||
static ssize_t cap_listxattr(vfs_handle_struct *handle, const char *path, char *list, size_t size)
|
||||
static ssize_t cap_listxattr(vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
char *cappath = capencode(talloc_tos(), path);
|
||||
struct smb_filename *cap_smb_fname = NULL;
|
||||
char *cappath = capencode(talloc_tos(), smb_fname->base_name);
|
||||
ssize_t ret;
|
||||
int saved_errno = 0;
|
||||
|
||||
if (!cappath) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, cappath, list, size);
|
||||
cap_smb_fname = synthetic_smb_fname(talloc_tos(),
|
||||
cappath,
|
||||
NULL,
|
||||
NULL,
|
||||
smb_fname->flags);
|
||||
if (cap_smb_fname == NULL) {
|
||||
TALLOC_FREE(cappath);
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, cap_smb_fname, list, size);
|
||||
if (ret == -1) {
|
||||
saved_errno = errno;
|
||||
}
|
||||
TALLOC_FREE(cappath);
|
||||
TALLOC_FREE(cap_smb_fname);
|
||||
if (saved_errno) {
|
||||
errno = saved_errno;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cap_removexattr(vfs_handle_struct *handle, const char *path, const char *name)
|
||||
|
@ -1408,23 +1408,45 @@ catia_getxattr(vfs_handle_struct *handle, const char *path,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
catia_listxattr(vfs_handle_struct *handle, const char *path,
|
||||
catia_listxattr(vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list, size_t size)
|
||||
{
|
||||
struct smb_filename *mapped_smb_fname = NULL;
|
||||
char *mapped_name = NULL;
|
||||
NTSTATUS status;
|
||||
ssize_t ret;
|
||||
int saved_errno = 0;
|
||||
|
||||
status = catia_string_replace_allocate(handle->conn,
|
||||
path, &mapped_name, vfs_translate_to_unix);
|
||||
smb_fname->base_name,
|
||||
&mapped_name,
|
||||
vfs_translate_to_unix);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
errno = map_errno_from_nt_status(status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
mapped_smb_fname = synthetic_smb_fname(talloc_tos(),
|
||||
mapped_name,
|
||||
NULL,
|
||||
NULL,
|
||||
smb_fname->flags);
|
||||
if (mapped_smb_fname == NULL) {
|
||||
TALLOC_FREE(mapped_name);
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, mapped_name, list, size);
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, mapped_smb_fname, list, size);
|
||||
if (ret == -1) {
|
||||
saved_errno = errno;
|
||||
}
|
||||
TALLOC_FREE(mapped_name);
|
||||
TALLOC_FREE(mapped_smb_fname);
|
||||
if (saved_errno != 0) {
|
||||
errno = saved_errno;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1247,11 +1247,15 @@ static ssize_t cephwrap_fgetxattr(struct vfs_handle_struct *handle, struct files
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t cephwrap_listxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size)
|
||||
static ssize_t cephwrap_listxattr(struct vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
int ret;
|
||||
DBG_DEBUG("[CEPH] listxattr(%p, %s, %p, %llu)\n", handle, path, list, llu(size));
|
||||
ret = ceph_listxattr(handle->data, path, list, size);
|
||||
DBG_DEBUG("[CEPH] listxattr(%p, %s, %p, %llu)\n", handle,
|
||||
smb_fname->base_name, list, llu(size));
|
||||
ret = ceph_listxattr(handle->data, smb_fname->base_name, list, size);
|
||||
DBG_DEBUG("[CEPH] listxattr(...) = %d\n", ret);
|
||||
if (ret < 0) {
|
||||
WRAP_RETURN(ret);
|
||||
|
@ -2757,9 +2757,12 @@ static ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle, struct files_
|
||||
return fgetxattr(fsp->fh->fd, name, value, size);
|
||||
}
|
||||
|
||||
static ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size)
|
||||
static ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
return listxattr(path, list, size);
|
||||
return listxattr(smb_fname->base_name, list, size);
|
||||
}
|
||||
|
||||
static ssize_t vfswrap_flistxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size)
|
||||
|
@ -2284,13 +2284,16 @@ static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
static ssize_t smb_full_audit_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size)
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
ssize_t result;
|
||||
|
||||
result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
|
||||
result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
|
||||
do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s", path);
|
||||
do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s",
|
||||
smb_fname->base_name);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -1316,9 +1316,11 @@ static ssize_t vfs_gluster_fgetxattr(struct vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
static ssize_t vfs_gluster_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size)
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
return glfs_listxattr(handle->data, path, list, size);
|
||||
return glfs_listxattr(handle->data, smb_fname->base_name, list, size);
|
||||
}
|
||||
|
||||
static ssize_t vfs_gluster_flistxattr(struct vfs_handle_struct *handle,
|
||||
|
@ -2245,35 +2245,32 @@ out:
|
||||
* Failure: set errno, return -1
|
||||
*/
|
||||
static ssize_t mh_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
ssize_t ret;
|
||||
char *clientPath;
|
||||
TALLOC_CTX *ctx;
|
||||
struct smb_filename *clientFname = NULL;
|
||||
int status;
|
||||
|
||||
DEBUG(MH_INFO_DEBUG, ("Entering mh_listxattr\n"));
|
||||
if (!is_in_media_files(path))
|
||||
{
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
|
||||
if (!is_in_media_files(smb_fname->base_name)) {
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
clientPath = NULL;
|
||||
ctx = talloc_tos();
|
||||
|
||||
if (alloc_get_client_path(handle, ctx,
|
||||
path,
|
||||
&clientPath))
|
||||
{
|
||||
status = alloc_get_client_smb_fname(handle,
|
||||
talloc_tos(),
|
||||
smb_fname,
|
||||
&clientFname);
|
||||
if (status != 0) {
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, clientPath, list, size);
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, clientFname, list, size);
|
||||
err:
|
||||
TALLOC_FREE(clientPath);
|
||||
TALLOC_FREE(clientFname);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
@ -179,13 +179,15 @@ static ssize_t posix_eadb_listattr(struct tdb_wrap *db_ctx,
|
||||
}
|
||||
|
||||
static ssize_t posix_eadb_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size)
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
struct tdb_wrap *db;
|
||||
|
||||
SMB_VFS_HANDLE_GET_DATA(handle, db, struct tdb_wrap, return -1);
|
||||
|
||||
return posix_eadb_listattr(db, path, -1, list, size);
|
||||
return posix_eadb_listattr(db, smb_fname->base_name, -1, list, size);
|
||||
}
|
||||
|
||||
static ssize_t posix_eadb_flistxattr(struct vfs_handle_struct *handle,
|
||||
|
@ -2367,7 +2367,7 @@ static ssize_t shadow_copy2_getxattr(vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
static ssize_t shadow_copy2_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *fname,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list, size_t size)
|
||||
{
|
||||
time_t timestamp = 0;
|
||||
@ -2375,23 +2375,37 @@ static ssize_t shadow_copy2_listxattr(struct vfs_handle_struct *handle,
|
||||
ssize_t ret;
|
||||
int saved_errno = 0;
|
||||
char *conv;
|
||||
struct smb_filename *conv_smb_fname = NULL;
|
||||
|
||||
if (!shadow_copy2_strip_snapshot(talloc_tos(), handle, fname,
|
||||
×tamp, &stripped)) {
|
||||
if (!shadow_copy2_strip_snapshot(talloc_tos(),
|
||||
handle,
|
||||
smb_fname->base_name,
|
||||
×tamp,
|
||||
&stripped)) {
|
||||
return -1;
|
||||
}
|
||||
if (timestamp == 0) {
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, fname, list, size);
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
}
|
||||
conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp);
|
||||
TALLOC_FREE(stripped);
|
||||
if (conv == NULL) {
|
||||
return -1;
|
||||
}
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, conv, list, size);
|
||||
conv_smb_fname = synthetic_smb_fname(talloc_tos(),
|
||||
conv,
|
||||
NULL,
|
||||
NULL,
|
||||
smb_fname->flags);
|
||||
if (conv_smb_fname == NULL) {
|
||||
TALLOC_FREE(conv);
|
||||
return -1;
|
||||
}
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, conv_smb_fname, list, size);
|
||||
if (ret == -1) {
|
||||
saved_errno = errno;
|
||||
}
|
||||
TALLOC_FREE(conv_smb_fname);
|
||||
TALLOC_FREE(conv);
|
||||
if (saved_errno != 0) {
|
||||
errno = saved_errno;
|
||||
|
@ -2699,31 +2699,50 @@ static ssize_t snapper_gmt_getxattr(vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
static ssize_t snapper_gmt_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *fname,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list, size_t size)
|
||||
{
|
||||
time_t timestamp;
|
||||
char *stripped;
|
||||
time_t timestamp = 0;
|
||||
char *stripped = NULL;
|
||||
ssize_t ret;
|
||||
int saved_errno;
|
||||
char *conv;
|
||||
int saved_errno = 0;
|
||||
char *conv = NULL;
|
||||
struct smb_filename *conv_smb_fname = NULL;
|
||||
|
||||
if (!snapper_gmt_strip_snapshot(talloc_tos(), handle, fname,
|
||||
×tamp, &stripped)) {
|
||||
if (!snapper_gmt_strip_snapshot(talloc_tos(),
|
||||
handle,
|
||||
smb_fname->base_name,
|
||||
×tamp,
|
||||
&stripped)) {
|
||||
return -1;
|
||||
}
|
||||
if (timestamp == 0) {
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, fname, list, size);
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
}
|
||||
conv = snapper_gmt_convert(talloc_tos(), handle, stripped, timestamp);
|
||||
TALLOC_FREE(stripped);
|
||||
if (conv == NULL) {
|
||||
return -1;
|
||||
}
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, conv, list, size);
|
||||
saved_errno = errno;
|
||||
conv_smb_fname = synthetic_smb_fname(talloc_tos(),
|
||||
conv,
|
||||
NULL,
|
||||
NULL,
|
||||
smb_fname->flags);
|
||||
TALLOC_FREE(conv);
|
||||
errno = saved_errno;
|
||||
if (conv_smb_fname == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, conv_smb_fname, list, size);
|
||||
if (ret == -1) {
|
||||
saved_errno = errno;
|
||||
}
|
||||
TALLOC_FREE(conv_smb_fname);
|
||||
TALLOC_FREE(conv);
|
||||
if (saved_errno != 0) {
|
||||
errno = saved_errno;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2362,7 +2362,8 @@ static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
ssize_t result;
|
||||
@ -2370,12 +2371,13 @@ static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle,
|
||||
double timediff;
|
||||
|
||||
clock_gettime_mono(&ts1);
|
||||
result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
|
||||
result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
clock_gettime_mono(&ts2);
|
||||
timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
|
||||
|
||||
if (timediff > audit_timeout) {
|
||||
smb_time_audit_log_fname("listxattr", timediff, path);
|
||||
smb_time_audit_log_fname("listxattr", timediff,
|
||||
smb_fname->base_name);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -1750,31 +1750,33 @@ err:
|
||||
}
|
||||
|
||||
static ssize_t um_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
ssize_t ret;
|
||||
char *client_path = NULL;
|
||||
struct smb_filename *client_fname = NULL;
|
||||
int status;
|
||||
|
||||
DEBUG(10, ("Entering um_listxattr\n"));
|
||||
|
||||
if (!is_in_media_files(path)) {
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
|
||||
if (!is_in_media_files(smb_fname->base_name)) {
|
||||
return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
}
|
||||
|
||||
status = alloc_get_client_path(handle, talloc_tos(),
|
||||
path, &client_path);
|
||||
status = alloc_get_client_smb_fname(handle,
|
||||
talloc_tos(),
|
||||
smb_fname,
|
||||
&client_fname);
|
||||
if (status != 0) {
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, client_path, list, size);
|
||||
ret = SMB_VFS_NEXT_LISTXATTR(handle, client_fname, list, size);
|
||||
|
||||
err:
|
||||
TALLOC_FREE(client_path);
|
||||
TALLOC_FREE(client_fname);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -752,17 +752,19 @@ static size_t vxfs_filter_list(char *list, size_t size)
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t vxfs_listxattr(vfs_handle_struct *handle, const char *path,
|
||||
char *list, size_t size)
|
||||
static ssize_t vxfs_listxattr(vfs_handle_struct *handle,
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
ssize_t result;
|
||||
|
||||
result = vxfs_listxattr_path(path, list, size);
|
||||
result = vxfs_listxattr_path(smb_fname->base_name, list, size);
|
||||
if (result >= 0 || ((errno != ENOTSUP) && (errno != ENOSYS))) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
|
||||
result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size);
|
||||
|
||||
if (result <= 0) {
|
||||
return result;
|
||||
|
@ -204,7 +204,9 @@ static int xattr_tdb_fsetxattr(struct vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
static ssize_t xattr_tdb_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size)
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
struct file_id id;
|
||||
struct db_context *db;
|
||||
@ -217,7 +219,7 @@ static ssize_t xattr_tdb_listxattr(struct vfs_handle_struct *handle,
|
||||
TALLOC_FREE(frame); return -1;
|
||||
});
|
||||
|
||||
ret = xattr_tdb_get_file_id(handle, path, &id);
|
||||
ret = xattr_tdb_get_file_id(handle, smb_fname->base_name, &id);
|
||||
if (ret == -1) {
|
||||
TALLOC_FREE(frame);
|
||||
return -1;
|
||||
|
@ -289,7 +289,7 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx,
|
||||
ea_namelist_size);
|
||||
} else {
|
||||
sizeret = SMB_VFS_LISTXATTR(conn,
|
||||
smb_fname->base_name,
|
||||
smb_fname,
|
||||
ea_namelist,
|
||||
ea_namelist_size);
|
||||
}
|
||||
@ -307,7 +307,7 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx,
|
||||
ea_namelist_size);
|
||||
} else {
|
||||
sizeret = SMB_VFS_LISTXATTR(conn,
|
||||
smb_fname->base_name,
|
||||
smb_fname,
|
||||
ea_namelist,
|
||||
ea_namelist_size);
|
||||
}
|
||||
|
@ -2519,10 +2519,12 @@ ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
|
||||
}
|
||||
|
||||
ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
|
||||
const char *path, char *list, size_t size)
|
||||
const struct smb_filename *smb_fname,
|
||||
char *list,
|
||||
size_t size)
|
||||
{
|
||||
VFS_FIND(listxattr);
|
||||
return handle->fns->listxattr_fn(handle, path, list, size);
|
||||
return handle->fns->listxattr_fn(handle, smb_fname, list, size);
|
||||
}
|
||||
|
||||
ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
|
||||
|
@ -1344,6 +1344,7 @@ static NTSTATUS cmd_listxattr(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
|
||||
{
|
||||
char *buf, *p;
|
||||
ssize_t ret;
|
||||
struct smb_filename *smb_fname = NULL;
|
||||
|
||||
if (argc != 2) {
|
||||
printf("Usage: listxattr <path>\n");
|
||||
@ -1352,7 +1353,14 @@ static NTSTATUS cmd_listxattr(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
|
||||
|
||||
buf = NULL;
|
||||
|
||||
ret = SMB_VFS_LISTXATTR(vfs->conn, argv[1], buf, talloc_get_size(buf));
|
||||
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));
|
||||
if (ret == -1) {
|
||||
int err = errno;
|
||||
printf("listxattr returned (%s)\n", strerror(err));
|
||||
@ -1362,7 +1370,8 @@ static NTSTATUS cmd_listxattr(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
|
||||
if (buf == NULL) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
ret = SMB_VFS_LISTXATTR(vfs->conn, argv[1], buf, talloc_get_size(buf));
|
||||
ret = SMB_VFS_LISTXATTR(vfs->conn, smb_fname,
|
||||
buf, talloc_get_size(buf));
|
||||
if (ret == -1) {
|
||||
int err = errno;
|
||||
printf("listxattr returned (%s)\n", strerror(err));
|
||||
|
Loading…
x
Reference in New Issue
Block a user