return NT_STATUS_NOT_IMPLEMENTED;
}
-static const char *skel_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+static const char *skel_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
errno = ENOSYS;
return NULL;
handle, dirfsp, name, mem_ctx, found_name);
}
-static const char *skel_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+static const char *skel_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
- return SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname);
+ return SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname);
}
static NTSTATUS skel_brl_lock_windows(struct vfs_handle_struct *handle,
* Version 47 - Add VFS_OPEN_HOW_RESOLVE_NO_SYMLINKS for SMB_VFS_OPENAT()
* Change to Version 48 - will ship with 4.18
* Version 48 - Add cached_dos_attributes to struct stat_ex
+ * Version 48 - Add dirfsp to connectpath_fn()
*/
#define SMB_VFS_INTERFACE_VERSION 48
char **found_name);
const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
const struct smb_filename *smb_fname);
NTSTATUS (*brl_lock_windows_fn)(struct vfs_handle_struct *handle,
TALLOC_CTX *mem_ctx,
char **found_name);
const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname);
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname);
NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
struct byte_range_lock *br_lck,
struct lock_struct *plock);
const char *name,
TALLOC_CTX *mem_ctx,
char **found_name);
-const char *vfs_not_implemented_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname);
+const char *vfs_not_implemented_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname);
NTSTATUS vfs_not_implemented_brl_lock_windows(struct vfs_handle_struct *handle,
struct byte_range_lock *br_lck,
struct lock_struct *plock);
(mem_ctx), \
(found_name))
-#define SMB_VFS_CONNECTPATH(conn, smb_fname) \
- smb_vfs_call_connectpath((conn)->vfs_handles, (smb_fname))
-#define SMB_VFS_NEXT_CONNECTPATH(conn, smb_fname) \
- smb_vfs_call_connectpath((conn)->next, (smb_fname))
+#define SMB_VFS_CONNECTPATH(conn, dirfsp, smb_fname) \
+ smb_vfs_call_connectpath((conn)->vfs_handles, (dirfsp), (smb_fname))
+#define SMB_VFS_NEXT_CONNECTPATH(conn, dirfsp, smb_fname) \
+ smb_vfs_call_connectpath((conn)->next, (dirfsp), (smb_fname))
#define SMB_VFS_BRL_LOCK_WINDOWS(conn, br_lck, plock) \
smb_vfs_call_brl_lock_windows((conn)->vfs_handles, (br_lck), (plock))
return NT_STATUS_NOT_SUPPORTED;
}
-static const char *cephwrap_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+static const char *cephwrap_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
return handle->conn->connectpath;
}
}
static const char *vfswrap_connectpath(struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
const struct smb_filename *smb_fname)
{
return handle->conn->connectpath;
return result;
}
-static const char *smb_full_audit_connectpath(vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+static const char *smb_full_audit_connectpath(
+ vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
const char *result;
- result = SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname);
+ result = SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname);
do_log(SMB_VFS_OP_CONNECTPATH,
result != NULL,
return NT_STATUS_OK;
}
-static const char *vfs_gluster_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+static const char *vfs_gluster_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
return handle->conn->connectpath;
}
}
_PUBLIC_
-const char *vfs_not_implemented_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+const char *vfs_not_implemented_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
errno = ENOSYS;
return NULL;
return NT_STATUS_OK;
}
-static const char *shadow_copy2_connectpath(struct vfs_handle_struct *handle,
- const struct smb_filename *smb_fname_in)
+static const char *shadow_copy2_connectpath(
+ struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname_in)
{
time_t timestamp = 0;
char *stripped = NULL;
goto done;
}
if (timestamp == 0) {
- return SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname_in);
+ return SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname_in);
}
tmp = shadow_copy2_do_convert(talloc_tos(), handle, stripped, timestamp,
return result;
}
-static const char *smb_time_audit_connectpath(vfs_handle_struct *handle,
- const struct smb_filename *smb_fname)
+static const char *smb_time_audit_connectpath(
+ vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
const char *result;
struct timespec ts1,ts2;
double timediff;
clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname);
+ result = SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname);
clock_gettime_mono(&ts2);
timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
struct smb_filename *full_fname = NULL;
NTSTATUS status;
- conn_rootdir = SMB_VFS_CONNECTPATH(conn, smb_fname);
+ conn_rootdir = SMB_VFS_CONNECTPATH(conn, NULL, smb_fname);
if (conn_rootdir == NULL) {
return NT_STATUS_NO_MEMORY;
}
SMB_ASSERT(!fsp_is_alternate_stream(fsp));
if (smb_fname->base_name[0] == '/') {
- const char *connpath = SMB_VFS_CONNECTPATH(conn, smb_fname);
+ const char *connpath = SMB_VFS_CONNECTPATH(
+ conn, NULL, smb_fname);
int cmp = strcmp(connpath, smb_fname->base_name);
if (cmp == 0) {
}
/* Common widelinks and symlinks checks. */
- conn_rootdir = SMB_VFS_CONNECTPATH(conn, smb_fname);
+ conn_rootdir = SMB_VFS_CONNECTPATH(conn, NULL, smb_fname);
if (conn_rootdir == NULL) {
DBG_NOTICE("Could not get conn_rootdir\n");
TALLOC_FREE(resolved_fname);
}
const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
+ const struct files_struct *dirfsp,
const struct smb_filename *smb_fname)
{
VFS_FIND(connectpath);
- return handle->fns->connectpath_fn(handle, smb_fname);
+ return handle->fns->connectpath_fn(handle, dirfsp, smb_fname);
}
bool smb_vfs_call_strict_lock_check(struct vfs_handle_struct *handle,