summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUri Simchoni <uri@samba.org>2015-11-04 08:44:29 +0200
committerJeremy Allison <jra@samba.org>2015-11-04 22:15:24 +0100
commitb37ecbd06d7a625d6889a9e8eaa66c807bb2a839 (patch)
tree397e0a3b4525b194ea0e344580874d59062c6efd
parent89940f39c6d2db03b3a468942d686e762f126f9f (diff)
downloadsamba-b37ecbd06d7a625d6889a9e8eaa66c807bb2a839.tar.gz
vfs_offline: add vfs_offline module
This module marks all file in the share as offline. It can be useful for shares mounted on top of a remote file system (either through a samba VFS module or via FUSE). Offline files change the behavior of Windows explorer, and prevent it from peeking inside folders just for the sake of drawing a nice icon of them. This greatly reduces the number of requests Windows Explorer makes, and improves user experience when dealing with remote file systems. The offline bit also has an effect on the behavior of Windows redirector. Signed-off-by: Uri Simchoni <uri@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
-rw-r--r--source3/modules/vfs_offline.c47
-rw-r--r--source3/modules/wscript_build7
-rw-r--r--source3/wscript2
3 files changed, 55 insertions, 1 deletions
diff --git a/source3/modules/vfs_offline.c b/source3/modules/vfs_offline.c
new file mode 100644
index 00000000000..5921f4392fc
--- /dev/null
+++ b/source3/modules/vfs_offline.c
@@ -0,0 +1,47 @@
+/*
+ Unix SMB/CIFS implementation.
+ Samba VFS module for marking all files as offline.
+
+ (c) Uri Simchoni, 2015
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+
+static uint32_t offline_fs_capabilities(struct vfs_handle_struct *handle,
+ enum timestamp_set_resolution *p_ts_res)
+{
+ return SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res) |
+ FILE_SUPPORTS_REMOTE_STORAGE;
+}
+
+static bool offline_is_offline(struct vfs_handle_struct *handle,
+ const struct smb_filename *fname,
+ SMB_STRUCT_STAT *stbuf)
+{
+ return true;
+}
+
+static struct vfs_fn_pointers offline_fns = {
+ .fs_capabilities_fn = offline_fs_capabilities,
+ .is_offline_fn = offline_is_offline,
+};
+
+NTSTATUS vfs_offline_init(void);
+NTSTATUS vfs_offline_init(void)
+{
+ return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "offline",
+ &offline_fns);
+}
diff --git a/source3/modules/wscript_build b/source3/modules/wscript_build
index fef412a5f31..be1de50beca 100644
--- a/source3/modules/wscript_build
+++ b/source3/modules/wscript_build
@@ -499,3 +499,10 @@ bld.SAMBA3_MODULE('vfs_vxfs',
init_function='',
internal_module=bld.SAMBA3_IS_STATIC_MODULE('vfs_vxfs'),
enabled=bld.SAMBA3_IS_ENABLED_MODULE('vfs_vxfs'))
+
+bld.SAMBA3_MODULE('vfs_offline',
+ subsystem='vfs',
+ source='vfs_offline.c',
+ init_function='',
+ internal_module=bld.SAMBA3_IS_STATIC_MODULE('vfs_offline'),
+ enabled=bld.SAMBA3_IS_ENABLED_MODULE('vfs_offline'))
diff --git a/source3/wscript b/source3/wscript
index 3118f59d628..092d8fa5c70 100644
--- a/source3/wscript
+++ b/source3/wscript
@@ -1604,7 +1604,7 @@ main() {
vfs_smb_traffic_analyzer vfs_preopen vfs_catia
vfs_media_harmony vfs_unityed_media vfs_fruit vfs_shell_snap
vfs_commit vfs_worm vfs_crossrename vfs_linux_xfs_sgid
- vfs_time_audit
+ vfs_time_audit vfs_offline
'''))
default_shared_modules.extend(TO_LIST('auth_script idmap_tdb2 idmap_script'))
# these have broken dependencies