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;
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,
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
/* 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);
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,
#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))
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)
}
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;
}
}
}
-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);
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)
}
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;
}
}
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,
* 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;
}
}
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,
}
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;
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;
}
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;
}
}
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;
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;
}
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;
}
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;
}
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;
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;
ea_namelist_size);
} else {
sizeret = SMB_VFS_LISTXATTR(conn,
- smb_fname->base_name,
+ smb_fname,
ea_namelist,
ea_namelist_size);
}
ea_namelist_size);
} else {
sizeret = SMB_VFS_LISTXATTR(conn,
- smb_fname->base_name,
+ smb_fname,
ea_namelist,
ea_namelist_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)
{
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,
{
char *buf, *p;
ssize_t ret;
+ struct smb_filename *smb_fname = NULL;
if (argc != 2) {
printf("Usage: listxattr <path>\n");
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));
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));