vfs: Add helper to check for missing VFS functions
authorChristof Schmitt <cs@samba.org>
Fri, 1 Apr 2016 16:47:31 +0000 (09:47 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 5 Apr 2016 22:15:17 +0000 (00:15 +0200)
Some VFS modules want to ensure that they implement all VFS functions.
This helper can be used to detect missing functions in the developer
build.

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/include/vfs.h
source3/smbd/vfs.c

index 6ab9a7e36b2bb39b9c14be4a4ffca47352f054c9..9360802a535cd221615b2eb2b3a4f9c2cd8f3a6e 100644 (file)
@@ -1381,4 +1381,7 @@ void vfs_remove_all_fsp_extensions(struct files_struct *fsp);
 void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
 void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
 
+void smb_vfs_assert_all_fns(const struct vfs_fn_pointers* fns,
+                           const char *module);
+
 #endif /* _VFS_H */
index efed2683a6ab992e01212017a0361cc91a2809af..605f9ade70381f248c93e4a6eafe6f46728710f0 100644 (file)
@@ -316,6 +316,36 @@ void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp)
 
 #undef EXT_DATA_AREA
 
+/*
+ * Ensure this module catches all VFS functions.
+ */
+#ifdef DEVELOPER
+void smb_vfs_assert_all_fns(const struct vfs_fn_pointers* fns,
+                           const char *module)
+{
+       bool missing_fn = false;
+       unsigned int idx;
+       const uintptr_t *end = (const uintptr_t *)(fns + 1);
+
+       for (idx = 0; ((const uintptr_t *)fns + idx) < end; idx++) {
+               if (*((const uintptr_t *)fns + idx) == 0) {
+                       DBG_ERR("VFS function at index %d not implemented "
+                               "in module %s\n", idx, module);
+                       missing_fn = true;
+               }
+       }
+
+       if (missing_fn) {
+               smb_panic("Required VFS function not implemented in module.\n");
+       }
+}
+#else
+void smb_vfs_assert_all_fns(const struct vfs_fn_pointers* fns,
+                           const char *module)
+{
+}
+#endif
+
 /*****************************************************************
  Generic VFS init.
 ******************************************************************/