* Change to Version 50 - will ship with 4.22
* Version 50 - Change SMB_VFS_RENAMEAT() add vfs_rename_how
* Version 50 - Add VFS_RENAME_HOW_NO_REPLACE to vfs_rename_how
+ * Version 50 - Remove FSP_POSIX_FLAGS_PATHNAMES, remove FSP_POSIX_FLAGS_RENAME
+ * and convert struct files_struct.posix_flags to
+ * struct files_struct.fsp_flags.posix_open
*/
#define SMB_VFS_INTERFACE_VERSION 50
bool lock_failure_seen : 1;
bool encryption_required : 1;
bool fstat_before_close : 1;
+ bool posix_open : 1;
} fsp_flags;
struct tevent_timer *update_write_time_event;
* In any other case use fsp_get_io_fd().
*/
-#define FSP_POSIX_FLAGS_OPEN 0x01
-
-#define FSP_POSIX_FLAGS_ALL \
- FSP_POSIX_FLAGS_OPEN
-
struct vuid_cache_entry {
struct auth_session_info *session_info;
struct name_compare_entry *hide_list;
struct fsp_smb_fname_link *fsp_link;
};
-/*
- * smb_filename flags. Define in terms of the FSP_POSIX_FLAGS_XX
- * to keep the numeric values consistent.
- */
-
-#define SMB_FILENAME_POSIX_PATH FSP_POSIX_FLAGS_OPEN
+#define SMB_FILENAME_POSIX_PATH 0x01
enum vfs_translate_direction {
vfs_translate_to_unix = 0,
.time.tv_usec = fsp->open_time.tv_usec,
.share_file_id = fh_get_gen_id(fsp->fh),
.uid = (uint32_t)uid,
- .flags = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
+ .flags = fsp->fsp_flags.posix_open ?
SHARE_MODE_FLAG_POSIX_OPEN : 0,
.name_hash = fsp->name_hash,
};
int fchmod_acl_module_common(struct vfs_handle_struct *handle,
struct files_struct *fsp, mode_t mode)
{
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN
+ if (fsp->fsp_flags.posix_open
|| fsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH) {
/* Only allow this on POSIX opens. */
return SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
if (posix_default_lock_was_set) {
return posix_cifsx_locktype;
} else {
- return (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
+ return fsp->fsp_flags.posix_open ?
POSIX_LOCK : WINDOWS_LOCK;
}
}
goto fail;
}
dir_hnd->fsp = fsp;
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+ if (fsp->fsp_flags.posix_open) {
dir_hnd->case_sensitive = true;
} else {
dir_hnd->case_sensitive = conn->case_sensitive;
return -1;
}
- if ((smb_fname->fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
+ if (smb_fname->fsp->fsp_flags.posix_open &&
!lp_store_dos_attributes(SNUM(conn)))
{
return 0;
{
int delay;
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+ if (fsp->fsp_flags.posix_open) {
/* Don't use delayed writes on POSIX files. */
return;
}
init_smb_file_time(&ft);
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+ if (fsp->fsp_flags.posix_open) {
/* Don't use delayed writes on POSIX files. */
return;
}
return false;
}
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+ if (fsp->fsp_flags.posix_open) {
/* Always use filesystem for UNIX mtime query. */
return false;
}
* client should be doing this.
*/
- if ((fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) || !lp_follow_symlinks(SNUM(conn))) {
+ if (fsp->fsp_flags.posix_open || !lp_follow_symlinks(SNUM(conn))) {
how.flags |= O_NOFOLLOW;
}
SEC_FLAG_SYSTEM_SECURITY;
bool creating = !file_existed && (how.flags & O_CREAT);
bool open_fd = false;
- bool posix_open = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
+ bool posix_open = fsp->fsp_flags.posix_open;
/*
* Catch early an attempt to open an existing
* requested access_mask after
* the open is done. */
if (posix_open) {
- fsp->posix_flags |= FSP_POSIX_FLAGS_ALL;
+ fsp->fsp_flags.posix_open = true;
}
if ((create_options & FILE_DELETE_ON_CLOSE) && (flags & O_CREAT) &&
fsp->sent_oplock_break = NO_BREAK_SENT;
fsp->fsp_flags.is_directory = true;
if (file_attributes & FILE_FLAG_POSIX_SEMANTICS) {
- fsp->posix_flags |= FSP_POSIX_FLAGS_ALL;
+ fsp->fsp_flags.posix_open = true;
}
/* Don't store old timestamps for directory
*/
if(!continue_bit && resume_name && *resume_name) {
- bool posix_open = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
+ bool posix_open = fsp->fsp_flags.posix_open;
char *last_name_sent = NULL;
bool sequential;
break;
case SMB2_FILE_POSIX_INFORMATION:
- if (!(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN)) {
+ if (!fsp->fsp_flags.posix_open) {
tevent_req_nterror(req, NT_STATUS_INVALID_LEVEL);
return tevent_req_post(req, ev);
}
for (i=0; i<in_lock_count; i++) {
bool invalid = false;
- bool posix_handle =(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
+ bool posix_handle = fsp->fsp_flags.posix_open;
switch (in_locks[i].flags) {
case SMB2_LOCK_FLAG_SHARED:
return false;
}
- if (!(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN)) {
+ if (!fsp->fsp_flags.posix_open) {
return false;
}
char *p;
bool stop = false;
bool ok;
- bool posix_dir_handle = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN);
+ bool posix_dir_handle = fsp->fsp_flags.posix_open;
req = tevent_req_create(mem_ctx, &state,
struct smbd_smb2_query_directory_state);
break;
case SMB2_FIND_POSIX_INFORMATION:
- if (!(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN)) {
+ if (!fsp->fsp_flags.posix_open) {
tevent_req_nterror(req, NT_STATUS_INVALID_LEVEL);
return tevent_req_post(req, ev);
}
uint32_t access_mask = SEC_DIR_ADD_FILE;
bool dst_exists, old_is_stream, new_is_stream;
int ret;
- bool case_sensitive = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
+ bool case_sensitive = fsp->fsp_flags.posix_open ?
true : conn->case_sensitive;
- bool case_preserve = (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) ?
+ bool case_preserve = fsp->fsp_flags.posix_open ?
true : conn->case_preserve;
struct vfs_rename_how rhow = { .flags = 0, };
* can check them separately.
*/
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+ if (fsp->fsp_flags.posix_open) {
/* POSIX - no stream component. */
orig_lcomp_path = talloc_strdup(ctx,
dst_original_lcomp);
uint16_t info_level)
{
if (conn_using_smb2(conn->sconn) &&
- (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) &&
+ fsp->fsp_flags.posix_open &&
info_level == SMB2_FS_POSIX_INFORMATION_INTERNAL)
{
return true;
}
if (conn_using_smb2(conn->sconn) &&
- (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN))
+ fsp->fsp_flags.posix_open)
{
DBG_DEBUG("SMB2 posix open\n");
ok = true;
if (fsp == NULL) {
return NT_STATUS_INVALID_HANDLE;
}
- if (!(fsp->posix_flags & FSP_POSIX_FLAGS_OPEN)) {
+ if (!fsp->fsp_flags.posix_open) {
return NT_STATUS_INVALID_LEVEL;
}
}
if (fsp_get_pathref_fd(fsp) == -1) {
- if (fsp->posix_flags & FSP_POSIX_FLAGS_OPEN) {
+ if (fsp->fsp_flags.posix_open) {
ret = SMB_VFS_LSTAT(fsp->conn, fsp->fsp_name);
} else {
ret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);