diff options
Diffstat (limited to 'source4/ntvfs/ntvfs_base.c')
-rw-r--r-- | source4/ntvfs/ntvfs_base.c | 59 |
1 files changed, 12 insertions, 47 deletions
diff --git a/source4/ntvfs/ntvfs_base.c b/source4/ntvfs/ntvfs_base.c index 316a9e9c68..b1efb44ec7 100644 --- a/source4/ntvfs/ntvfs_base.c +++ b/source4/ntvfs/ntvfs_base.c @@ -44,18 +44,11 @@ static int num_backends; The 'type' is used to specify whether this is for a disk, printer or IPC$ share */ -_PUBLIC_ NTSTATUS ntvfs_register(const struct ntvfs_ops *ops, - const struct ntvfs_critical_sizes *const sizes) +_PUBLIC_ NTSTATUS ntvfs_register(const void *_ops) { + const struct ntvfs_ops *ops = _ops; struct ntvfs_ops *new_ops; - - if (ntvfs_interface_differs(sizes)) { - DEBUG(0, ("NTVFS backend '%s' for type %d " - "failed version check\n", - ops->name, (int)ops->type)); - return NT_STATUS_BAD_FUNCTION_TABLE; - } - + if (ntvfs_backend_byname(ops->name, ops->type) != NULL) { /* its already registered! */ DEBUG(0,("NTVFS backend '%s' for type %d already registered\n", @@ -105,49 +98,21 @@ _PUBLIC_ const struct ntvfs_ops *ntvfs_backend_byname(const char *name, enum ntv 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 NTVFS_CURRENT_CRITICAL_SIZES(critical_sizes); +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), +}; _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 |