svn commit: samba r15183 - in branches/SAMBA_4_0/source/ntvfs: .

jpeach at samba.org jpeach at samba.org
Sun Apr 23 23:40:55 GMT 2006


Author: jpeach
Date: 2006-04-23 23:40:53 +0000 (Sun, 23 Apr 2006)
New Revision: 15183

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15183

Log:
Hoist the critical sizes initialiser into a header so that modules
can have standard access to critical sizes. Add a convenience function
to determine whether two critical sizes differ.

Modified:
   branches/SAMBA_4_0/source/ntvfs/ntvfs.h
   branches/SAMBA_4_0/source/ntvfs/ntvfs_base.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/ntvfs.h
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/ntvfs.h	2006-04-23 22:45:54 UTC (rev 15182)
+++ branches/SAMBA_4_0/source/ntvfs/ntvfs.h	2006-04-23 23:40:53 UTC (rev 15183)
@@ -266,6 +266,17 @@
 	int sizeof_ntvfs_request;
 };
 
+#define NTVFS_CURRENT_CRITICAL_SIZES(c) \
+    struct ntvfs_critical_sizes c = { \
+	.interface_version		= NTVFS_INTERFACE_VERSION, \
+	.sizeof_ntvfs_critical_sizes	= sizeof(struct ntvfs_critical_sizes), \
+	.sizeof_ntvfs_context		= sizeof(struct ntvfs_context), \
+	.sizeof_ntvfs_module_context	= sizeof(struct ntvfs_module_context), \
+	.sizeof_ntvfs_ops		= sizeof(struct ntvfs_ops), \
+	.sizeof_ntvfs_async_state	= sizeof(struct ntvfs_async_state), \
+	.sizeof_ntvfs_request		= sizeof(struct ntvfs_request), \
+    }
+
 struct messaging_context;
 #include "librpc/gen_ndr/security.h"
 #include "librpc/gen_ndr/notify.h"

Modified: branches/SAMBA_4_0/source/ntvfs/ntvfs_base.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/ntvfs_base.c	2006-04-23 22:45:54 UTC (rev 15182)
+++ branches/SAMBA_4_0/source/ntvfs/ntvfs_base.c	2006-04-23 23:40:53 UTC (rev 15183)
@@ -98,22 +98,50 @@
   This can be used by backends to either detect compilation errors, or provide
   multiple implementations for different smbd compilation options in one module
 */
-static const struct ntvfs_critical_sizes critical_sizes = {
-	.interface_version		= NTVFS_INTERFACE_VERSION,
-	.sizeof_ntvfs_critical_sizes	= sizeof(struct ntvfs_critical_sizes),
-	.sizeof_ntvfs_context		= sizeof(struct ntvfs_context),
-	.sizeof_ntvfs_module_context	= sizeof(struct ntvfs_module_context),
-	.sizeof_ntvfs_ops		= sizeof(struct ntvfs_ops),
-	.sizeof_ntvfs_async_state	= sizeof(struct ntvfs_async_state),
-	.sizeof_ntvfs_request		= sizeof(struct ntvfs_request),
-};
 
+static const NTVFS_CURRENT_CRITICAL_SIZES(critical_sizes);
+
 _PUBLIC_ const struct ntvfs_critical_sizes *ntvfs_interface_version(void)
 {
 	return &critical_sizes;
 }
 
+_PUBLIC_ BOOL ntvfs_interface_differs(const struct ntvfs_critical_sizes *const iface)
+{
+	/* The comparison would be easier with memcmp, but compiler-interset
+	 * alignment padding is not guaranteed to be zeroed.
+	 */
 
+#define FIELD_DIFFERS(field) (iface->field != critical_sizes.field)
+
+	if (FIELD_DIFFERS(interface_version))
+		return True;
+
+	if (FIELD_DIFFERS(sizeof_ntvfs_critical_sizes))
+		return True;
+
+	if (FIELD_DIFFERS(sizeof_ntvfs_context))
+		return True;
+
+	if (FIELD_DIFFERS(sizeof_ntvfs_module_context))
+		return True;
+
+	if (FIELD_DIFFERS(sizeof_ntvfs_ops))
+		return True;
+
+	if (FIELD_DIFFERS(sizeof_ntvfs_async_state))
+		return True;
+
+	if (FIELD_DIFFERS(sizeof_ntvfs_request))
+		return True;
+
+	/* Versions match. */
+	return False;
+
+#undef FIELD_DIFFERS
+}
+
+
 /*
   initialise a connection structure to point at a NTVFS backend
 */



More information about the samba-cvs mailing list