struct vfs_statvfs_struct statbuf;
int ret;
- smb_fname_cpath = synthetic_smb_fname(talloc_tos(), conn->connectpath,
- NULL, NULL, 0);
+ smb_fname_cpath = synthetic_smb_fname(talloc_tos(),
+ conn->connectpath,
+ NULL,
+ NULL,
+ 0,
+ 0);
if (smb_fname_cpath == NULL) {
return caps;
}
/* Directory operations */
-static DIR *vfswrap_opendir(vfs_handle_struct *handle,
- const struct smb_filename *smb_fname,
- const char *mask,
- uint32_t attr)
-{
- DIR *result;
-
- START_PROFILE(syscall_opendir);
- result = opendir(smb_fname->base_name);
- END_PROFILE(syscall_opendir);
- return result;
-}
-
static DIR *vfswrap_fdopendir(vfs_handle_struct *handle,
files_struct *fsp,
const char *mask,
mode_t mode)
{
int result;
- const char *path = smb_fname->base_name;
- char *parent = NULL;
+ struct smb_filename *parent = NULL;
+ bool ok;
START_PROFILE(syscall_mkdirat);
SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
- if (lp_inherit_acls(SNUM(handle->conn))
- && parent_dirname(talloc_tos(), path, &parent, NULL)
- && directory_has_default_acl(handle->conn, parent)) {
- mode = (0777 & lp_directory_mask(SNUM(handle->conn)));
+ if (lp_inherit_acls(SNUM(handle->conn))) {
+ ok = parent_smb_fname(talloc_tos(), smb_fname, &parent, NULL);
+ if (ok && directory_has_default_acl(handle->conn,
+ dirfsp,
+ parent))
+ {
+ mode = (0777 & lp_directory_mask(SNUM(handle->conn)));
+ }
}
TALLOC_FREE(parent);
- result = mkdirat(dirfsp->fh->fd, path, mode);
+ result = mkdirat(dirfsp->fh->fd, smb_fname->base_name, mode);
END_PROFILE(syscall_mkdirat);
return result;
struct vfswrap_get_dos_attributes_state);
ssize_t xattr_size;
DATA_BLOB blob = {0};
+ char *path = NULL;
+ char *tofree = NULL;
+ char pathbuf[PATH_MAX+1];
+ ssize_t pathlen;
+ struct smb_filename smb_fname;
+ bool offline;
NTSTATUS status;
xattr_size = SMB_VFS_GETXATTRAT_RECV(subreq,
return;
}
+ pathlen = full_path_tos(state->dir_fsp->fsp_name->base_name,
+ state->smb_fname->base_name,
+ pathbuf,
+ sizeof(pathbuf),
+ &path,
+ &tofree);
+ if (pathlen == -1) {
+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+ return;
+ }
+
+ smb_fname = (struct smb_filename) {
+ .base_name = path,
+ .st = state->smb_fname->st,
+ .flags = state->smb_fname->flags,
+ };
+
+ offline = vfswrap_is_offline(state->conn, &smb_fname);
+ if (offline) {
+ state->dosmode |= FILE_ATTRIBUTE_OFFLINE;
+ }
+ TALLOC_FREE(tofree);
+
tevent_req_done(req);
return;
}
result,
NULL,
NULL,
+ 0,
0);
/*
* sys_getwd() *always* returns malloced memory.
START_PROFILE(syscall_ftruncate);
- if (lp_strict_allocate(SNUM(fsp->conn)) && !fsp->is_sparse) {
+ if (lp_strict_allocate(SNUM(fsp->conn)) && !fsp->fsp_flags.is_sparse) {
result = strict_allocate_ftruncate(handle, fsp, len);
END_PROFILE(syscall_ftruncate);
return result;
START_PROFILE(syscall_fcntl_lock);
- if (fsp->use_ofd_locks) {
+ if (fsp->fsp_flags.use_ofd_locks) {
op = map_process_lock_to_ofd_lock(op);
}
START_PROFILE(syscall_fcntl_getlock);
- if (fsp->use_ofd_locks) {
+ if (fsp->fsp_flags.use_ofd_locks) {
op = map_process_lock_to_ofd_lock(op);
}
result = sys_realpath(smb_fname->base_name);
END_PROFILE(syscall_realpath);
if (result) {
- result_fname = synthetic_smb_fname(ctx, result, NULL, NULL, 0);
+ result_fname = synthetic_smb_fname(ctx,
+ result,
+ NULL,
+ NULL,
+ 0,
+ 0);
SAFE_FREE(result);
}
return result_fname;
struct stream_struct *tmp_streams = NULL;
int ret;
- if ((fsp != NULL) && (fsp->is_directory)) {
+ if ((fsp != NULL) && (fsp->fsp_flags.is_directory)) {
/*
* No default streams on directories
*/
char *path = NULL;
char *tofree = NULL;
char pathbuf[PATH_MAX+1];
- size_t pathlen;
+ ssize_t pathlen;
int err;
pathlen = full_path_tos(state->dir_fsp->fsp_name->base_name,
/* Directory operations */
- .opendir_fn = vfswrap_opendir,
.fdopendir_fn = vfswrap_fdopendir,
.readdir_fn = vfswrap_readdir,
.readdir_attr_fn = vfswrap_readdir_attr,