Use NTSTATUS as return value for smb_register_*() functions and init_module()
authorJelmer Vernooij <jelmer@samba.org>
Mon, 28 Apr 2003 18:33:25 +0000 (18:33 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 28 Apr 2003 18:33:25 +0000 (18:33 +0000)
function. Patch by metze with some minor modifications.

36 files changed:
examples/VFS/skel.c
source/auth/auth.c
source/auth/auth_builtin.c
source/auth/auth_domain.c
source/auth/auth_rhosts.c
source/auth/auth_sam.c
source/auth/auth_server.c
source/auth/auth_unix.c
source/auth/auth_winbind.c
source/include/rpc_misc.h
source/include/smb.h
source/lib/iconv.c
source/lib/module.c
source/modules/vfs_audit.c
source/modules/vfs_extd_audit.c
source/modules/vfs_fake_perms.c
source/modules/vfs_netatalk.c
source/modules/vfs_recycle.c
source/passdb/pdb_guest.c
source/passdb/pdb_interface.c
source/passdb/pdb_ldap.c
source/passdb/pdb_mysql.c
source/passdb/pdb_nisplus.c
source/passdb/pdb_unix.c
source/passdb/pdb_xml.c
source/rpc_server/srv_dfs.c
source/rpc_server/srv_echo.c
source/rpc_server/srv_lsa.c
source/rpc_server/srv_netlog.c
source/rpc_server/srv_pipe.c
source/rpc_server/srv_reg.c
source/rpc_server/srv_samr.c
source/rpc_server/srv_spoolss.c
source/rpc_server/srv_srvsvc.c
source/rpc_server/srv_wkssvc.c
source/smbd/vfs.c

index f19323480fc8cb182392e92abc8619cce4dd572e..fe6e0731efab8a870e813a167c3fd102b2abc7c8 100644 (file)
@@ -451,7 +451,7 @@ static vfs_op_tuple *skel_init(const struct vfs_ops *def_vfs_ops,
        return skel_ops;
 }
 
-int init_module(void)
+NTSTATUS init_module(void)
 {
        return smb_register_vfs("skel", skel_init, SMB_VFS_INTERFACE_VERSION);
 }
index 09e8f5e7225ba03b5fd61d7066888a58ea5b4f65..8f718e3d4d381cdf15a94d7c903b4c850d9520b5 100644 (file)
 
 static struct auth_init_function_entry *backends = NULL;
 
-BOOL smb_register_auth(const char *name, auth_init_function init, int version)
+static struct auth_init_function_entry *auth_find_backend_entry(const char *name);
+
+NTSTATUS smb_register_auth(uint16 version, const char *name, auth_init_function init)
 {
        struct auth_init_function_entry *entry = backends;
 
-       if(version != AUTH_INTERFACE_VERSION)
-               return False;
+       if (version != AUTH_INTERFACE_VERSION) {
+               DEBUG(0,("Can't register auth_method!\n"
+                        "You tried to register an auth module with AUTH_INTERFACE_VERSION %d, while this version of samba uses %d\n",
+                        version,AUTH_INTERFACE_VERSION));
+               return NT_STATUS_OBJECT_TYPE_MISMATCH;
+       }
+
+       if (!name || !init) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
 
        DEBUG(5,("Attempting to register auth backend %s\n", name));
 
-       while(entry) {
-               if (strequal(name, entry->name)) {
-                       DEBUG(0,("There already is an auth backend registered with the name %s!\n", name));
-                       return False;
-               }
-               entry = entry->next;
+       if (auth_find_backend_entry(name)) {
+               DEBUG(0,("There already is an auth method registered with the name %s!\n", name));
+               return NT_STATUS_OBJECT_NAME_COLLISION;
        }
        
        entry = smb_xmalloc(sizeof(struct auth_init_function_entry));
@@ -47,8 +54,8 @@ BOOL smb_register_auth(const char *name, auth_init_function init, int version)
        entry->init = init;
 
        DLIST_ADD(backends, entry);
-       DEBUG(5,("Successfully added auth backend '%s'\n", name));
-       return True;
+       DEBUG(5,("Successfully added auth method '%s'\n", name));
+       return NT_STATUS_OK;
 }
 
 static struct auth_init_function_entry *auth_find_backend_entry(const char *name)
@@ -365,7 +372,7 @@ BOOL load_auth_module(struct auth_context *auth_context,
        
        entry = auth_find_backend_entry(module_name);
        
-       if(!(entry = auth_find_backend_entry(module_name)) && !smb_probe_module("auth", module_name) && 
+       if(!(entry = auth_find_backend_entry(module_name)) && NT_STATUS_IS_ERR(smb_probe_module("auth", module_name)) && 
           !(entry = auth_find_backend_entry(module_name))) {
                DEBUG(0,("load_auth_module: can't find auth method %s!\n", module_name));
        } else if (!NT_STATUS_IS_OK(entry->init(auth_context, module_params, ret))) {
index 5d72898006cab334a602bcdfd65bb40508596378..5a9b5534ab61b4e80db115f7911d9445420f2149 100644 (file)
@@ -163,12 +163,12 @@ static NTSTATUS auth_init_fixed_challenge(struct auth_context *auth_context, con
 }
 #endif /* DEVELOPER */
 
-int auth_builtin_init(void)
+NTSTATUS auth_builtin_init(void)
 {
-       smb_register_auth("guest", auth_init_guest, AUTH_INTERFACE_VERSION);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "guest", auth_init_guest);
 #ifdef DEVELOPER
-       smb_register_auth("fixed_challenge", auth_init_fixed_challenge, AUTH_INTERFACE_VERSION);
-       smb_register_auth("name_to_ntstatus", auth_init_name_to_ntstatus, AUTH_INTERFACE_VERSION);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "fixed_challenge", auth_init_fixed_challenge);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "name_to_ntstatus", auth_init_name_to_ntstatus);
 #endif
-       return True;
+       return NT_STATUS_OK;
 }
index db5f7d82b085b05819301be15449fa3e6cc04842..bc03fecf749742cfd7a9cb4b6e7c25a1855f98fa 100644 (file)
@@ -557,9 +557,9 @@ NTSTATUS auth_init_trustdomain(struct auth_context *auth_context, const char* pa
        return NT_STATUS_OK;
 }
 
-int auth_domain_init(void) 
+NTSTATUS auth_domain_init(void) 
 {
-       smb_register_auth("trustdomain", auth_init_trustdomain, AUTH_INTERFACE_VERSION);
-       smb_register_auth("ntdomain", auth_init_ntdomain, AUTH_INTERFACE_VERSION);
-       return True;
+       smb_register_auth(AUTH_INTERFACE_VERSION, "trustdomain", auth_init_trustdomain);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "ntdomain", auth_init_ntdomain);
+       return NT_STATUS_OK;
 }
index db371935799d151318ed11f922bbccf0ea6419cd..0875c482804a324871e13aa80cb81fa0dfba91f2 100644 (file)
@@ -243,9 +243,9 @@ NTSTATUS auth_init_rhosts(struct auth_context *auth_context, const char *param,
        return NT_STATUS_OK;
 }
 
-int auth_rhosts_init(void)
+NTSTATUS auth_rhosts_init(void)
 {
-       smb_register_auth("rhosts", auth_init_rhosts, AUTH_INTERFACE_VERSION);
-       smb_register_auth("hostsequiv", auth_init_hostsequiv, AUTH_INTERFACE_VERSION);
-       return True;
+       smb_register_auth(AUTH_INTERFACE_VERSION, "rhosts", auth_init_rhosts);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "hostsequiv", auth_init_hostsequiv);
+       return NT_STATUS_OK;
 }
index aa399f33e2e54d8dda75bf335f53d09f8058b2b0..33ea9bc73e5115614317525d44fd96a0f0041b36 100644 (file)
@@ -563,10 +563,10 @@ NTSTATUS auth_init_samstrict_dc(struct auth_context *auth_context, const char *p
        return NT_STATUS_OK;
 }
 
-int auth_sam_init(void)
+NTSTATUS auth_sam_init(void)
 {
-       smb_register_auth("samstrict_dc", auth_init_samstrict_dc, AUTH_INTERFACE_VERSION);
-       smb_register_auth("samstrict", auth_init_samstrict, AUTH_INTERFACE_VERSION);
-       smb_register_auth("sam", auth_init_sam, AUTH_INTERFACE_VERSION);
-       return True;
+       smb_register_auth(AUTH_INTERFACE_VERSION, "samstrict_dc", auth_init_samstrict_dc);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "samstrict", auth_init_samstrict);
+       smb_register_auth(AUTH_INTERFACE_VERSION, "sam", auth_init_sam);
+       return NT_STATUS_OK;
 }
index a311f01dc3f15293fdc978d4e7900cdc7bdad30e..73af290af2aaeca6840d8c92f42326358358ba6b 100644 (file)
@@ -401,7 +401,7 @@ NTSTATUS auth_init_smbserver(struct auth_context *auth_context, const char* para
        return NT_STATUS_OK;
 }
 
-int auth_server_init(void)
+NTSTATUS auth_server_init(void)
 {
-       return smb_register_auth("smbserver", auth_init_smbserver, AUTH_INTERFACE_VERSION);
+       return smb_register_auth(AUTH_INTERFACE_VERSION, "smbserver", auth_init_smbserver);
 }
index efab2046c3622a87d6064a75a93f76958583c9e1..392178f77c147e8ae2f8d7ba8392d435e3ff935e 100644 (file)
@@ -130,7 +130,7 @@ NTSTATUS auth_init_unix(struct auth_context *auth_context, const char* param, au
        return NT_STATUS_OK;
 }
 
-int auth_unix_init(void)
+NTSTATUS auth_unix_init(void)
 {
-       return smb_register_auth("unix", auth_init_unix, AUTH_INTERFACE_VERSION);
+       return smb_register_auth(AUTH_INTERFACE_VERSION, "unix", auth_init_unix);
 }
index 840898415be01cc95edaeb115d6db89f62168d45..76b5c3418369b5673e505e695e1989bd187a1767 100644 (file)
@@ -147,7 +147,7 @@ NTSTATUS auth_init_winbind(struct auth_context *auth_context, const char *param,
        return NT_STATUS_OK;
 }
 
-int auth_winbind_init(void)
+NTSTATUS auth_winbind_init(void)
 {
-       return smb_register_auth("winbind", auth_init_winbind, AUTH_INTERFACE_VERSION);
+       return smb_register_auth(AUTH_INTERFACE_VERSION, "winbind", auth_init_winbind);
 }
index 06ad760c58fee7d11be50c688b622cafef670cb2..a0572a0bfdcba0341e545471875d37796af1732c 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef _RPC_MISC_H /* _RPC_MISC_H */
 #define _RPC_MISC_H 
 
-
+#define SMB_RPC_INTERFACE_VERSION 1
 
 /* well-known RIDs - Relative IDs */
 
index 62cc95ecb08fd866d3504b19caed69c9849f25e2..5ee6b971721abce39cc8b43c619a04e8f8c0699f 100644 (file)
@@ -1736,6 +1736,6 @@ typedef struct {
 #include "popt_common.h"
 
 /* Module support */
-typedef int (init_module_function) (void);
+typedef NTSTATUS (init_module_function) (void);
 
 #endif /* _SMB_H */
index a5fcf32b5b6ca5809e52901f293b92a0943ae34d..d9160f0d01515b7bfd361eb6a3a60135043de647 100644 (file)
@@ -77,22 +77,23 @@ static struct charset_functions *find_charset_functions(const char *name)
        return NULL;
 }
 
-BOOL smb_register_charset(struct charset_functions *funcs) 
+NTSTATUS smb_register_charset(struct charset_functions *funcs) 
 {
-       struct charset_functions *c = charsets;
+       if (!funcs) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
 
        DEBUG(5, ("Attempting to register new charset %s\n", funcs->name));
        /* Check whether we already have this charset... */
-
        if (find_charset_functions(funcs->name)) {
                DEBUG(0, ("Duplicate charset %s, not registering\n", funcs->name));
-               return False;
+               return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
        funcs->next = funcs->prev = NULL;
        DEBUG(5, ("Registered charset %s\n", funcs->name));
        DLIST_ADD(charsets, funcs);
-       return True;
+       return NT_STATUS_OK;
 }
 
 void lazy_initialize_iconv(void)
@@ -219,14 +220,14 @@ smb_iconv_t smb_iconv_open(const char *tocode, const char *fromcode)
 #endif
        
        /* check if there is a module available that can do this conversion */
-       if (!ret->pull && smb_probe_module("charset", fromcode)) {
+       if (!ret->pull && NT_STATUS_IS_OK(smb_probe_module("charset", fromcode))) {
                if(!(from = find_charset_functions(fromcode)))
                        DEBUG(0, ("Module %s doesn't provide charset %s!\n", fromcode, fromcode));
                else 
                        ret->pull = from->pull;
        }
 
-       if (!ret->push && smb_probe_module("charset", tocode)) {
+       if (!ret->push && NT_STATUS_IS_OK(smb_probe_module("charset", tocode))) {
                if(!(to = find_charset_functions(tocode)))
                        DEBUG(0, ("Module %s doesn't provide charset %s!\n", tocode, tocode));
                else 
index 53223cfebe2fd5f9543adad9ff104cdb693a9850..087c964d3c7be57438c563be446411e5e2e3d789 100644 (file)
 #include "includes.h"
 
 #ifdef HAVE_DLOPEN
-int smb_load_module(const char *module_name)
+NTSTATUS smb_load_module(const char *module_name)
 {
        void *handle;
        init_module_function *init;
-       int status;
+       NTSTATUS status;
        const char *error;
 
        /* Always try to use LAZY symbol resolving; if the plugin has 
@@ -37,7 +37,7 @@ int smb_load_module(const char *module_name)
 
        if(!handle) {
                DEBUG(0, ("Error loading module '%s': %s\n", module_name, sys_dlerror()));
-               return False;
+               return NT_STATUS_UNSUCCESSFUL;
        }
 
        init = sys_dlsym(handle, "init_module");
@@ -47,7 +47,7 @@ int smb_load_module(const char *module_name)
        error = sys_dlerror();
        if (error) {
                DEBUG(0, ("Error trying to resolve symbol 'init_module' in %s: %s\n", module_name, error));
-               return False;
+               return NT_STATUS_UNSUCCESSFUL;
        }
 
        status = init();
@@ -65,7 +65,7 @@ int smb_load_modules(const char **modules)
        int success = 0;
 
        for(i = 0; modules[i]; i++){
-               if(smb_load_module(modules[i])) {
+               if(NT_STATUS_IS_OK(smb_load_module(modules[i]))) {
                        success++;
                }
        }
@@ -75,7 +75,7 @@ int smb_load_modules(const char **modules)
        return success;
 }
 
-int smb_probe_module(const char *subsystem, const char *module)
+NTSTATUS smb_probe_module(const char *subsystem, const char *module)
 {
        pstring full_path;
        
@@ -95,22 +95,22 @@ int smb_probe_module(const char *subsystem, const char *module)
 
 #else /* HAVE_DLOPEN */
 
-int smb_load_module(const char *module_name)
+NTSTATUS smb_load_module(const char *module_name)
 {
        DEBUG(0,("This samba executable has not been built with plugin support"));
-       return False;
+       return NT_STATUS_NOT_SUPPORTED;
 }
 
 int smb_load_modules(const char **modules)
 {
        DEBUG(0,("This samba executable has not been built with plugin support"));
-       return False;
+       return -1;
 }
 
-int smb_probe_module(const char *subsystem, const char *module)
+NTSTATUS smb_probe_module(const char *subsystem, const char *module)
 {
        DEBUG(0,("This samba executable has not been built with plugin support, not probing")); 
-       return False;
+       return NT_STATUS_NOT_SUPPORTED;
 }
 
 #endif /* HAVE_DLOPEN */
index fa9bf67a6720127e5a5f837991faca4cde2b3b99..4f9dc1b1e400fe7dde5b42e3e7ff23f314c04a66 100644 (file)
@@ -270,7 +270,7 @@ static int audit_fchmod_acl(struct files_struct *fsp, int fd, mode_t mode)
        return result;
 }
 
-int vfs_audit_init(void)
+NTSTATUS vfs_audit_init(void)
 {
-       return smb_register_vfs("audit", audit_init, SMB_VFS_INTERFACE_VERSION);
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "audit", audit_init);
 }
index f60acab36af71c8f0b1054215d9feca28cd39905..ef30ca70272502f358a7a97157ccc5a5419a4d25 100644 (file)
@@ -310,7 +310,7 @@ static int audit_fchmod_acl(struct files_struct *fsp, int fd, mode_t mode)
        return result;
 }
 
-int vfs_extd_audit_init(void)
+NTSTATUS vfs_extd_audit_init(void)
 {
-       return smb_register_vfs("extd_audit", audit_init, SMB_VFS_INTERFACE_VERSION);
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "extd_audit", audit_init);
 }
index 121a99a451927b611013c7d009439bed113c5417..3a18fbb730c00407c8cd5398769c2811bc73986d 100644 (file)
@@ -281,7 +281,7 @@ static vfs_op_tuple *fake_perms_init(const struct vfs_ops *def_vfs_ops,
        return fake_perms_ops;
 }
 
-int vfs_fake_perms_init(void)
+NTSTATUS vfs_fake_perms_init(void)
 {
-       return smb_register_vfs("fake_perms", fake_perms_init, SMB_VFS_INTERFACE_VERSION);
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "fake_perms", fake_perms_init);
 }
index c9e3cde6210e689430b298d9106e37677a3acec6..718bc2a35caaa04b10f9215ad9253a94834f44f0 100644 (file)
@@ -421,7 +421,7 @@ static vfs_op_tuple *netatalk_init(const struct vfs_ops *def_vfs_ops,
        return atalk_ops;
 }
 
-int vfs_netatalk_init(void)
+NTSTATUS vfs_netatalk_init(void)
 {
-       return smb_register_vfs("netatalk", netatalk_init, SMB_VFS_INTERFACE_VERSION);
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "netatalk", netatalk_init);
 }
index 85ce257c026448e5bd15692e11efe75220ac8bd0..87dea944ac05440789429789c600a1c2c6183ba6 100644 (file)
@@ -603,7 +603,7 @@ done:
        return rc;
 }
 
-int vfs_recycle_init(void)
-{
-       return smb_register_vfs("recycle", recycle_init, SMB_VFS_INTERFACE_VERSION);
+NTSTATUS vfs_recycle_init(void)
+{  
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "recycle", recycle_init);
 }
index f5a15057e092c5e927ee294f822fa00592ac86ed..999779b0c6c297a1fd9e333920fe18923a3f4cd9 100644 (file)
@@ -122,8 +122,8 @@ NTSTATUS pdb_init_guestsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, c
        return NT_STATUS_OK;
 }
 
-int pdb_guest_init(void)
+NTSTATUS pdb_guest_init(void)
 {
-    return smb_register_passdb("guest", pdb_init_guestsam, PASSDB_INTERFACE_VERSION);
+       return smb_register_passdb(PASSDB_INTERFACE_VERSION, "guest", pdb_init_guestsam);
 }
 
index 57424bb2d8f2bd729636aa622731abd57f4cbb68..a8cc1f742af40215c60633ae3992228efeacb6c6 100644 (file)
@@ -36,18 +36,28 @@ static void lazy_initialize_passdb(void)
 
 static struct pdb_init_function_entry *pdb_find_backend_entry(const char *name);
 
-BOOL smb_register_passdb(const char *name, pdb_init_function init, int version
+NTSTATUS smb_register_passdb(uint16 version, const char *name, pdb_init_function init
 {
        struct pdb_init_function_entry *entry = backends;
 
-       if(version != PASSDB_INTERFACE_VERSION)
-               return False;
+       if(version != PASSDB_INTERFACE_VERSION) {
+               DEBUG(0,("Can't register passdb backend!\n"
+                        "You tried to register a passdb module with PASSDB_INTERFACE_VERSION %d, "
+                        "while this version of samba uses version %d\n", 
+                        version,PASSDB_INTERFACE_VERSION));
+               return NT_STATUS_OBJECT_TYPE_MISMATCH;
+       }
+
+       if (!name || !init) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
 
        DEBUG(5,("Attempting to register passdb backend %s\n", name));
 
+       /* Check for duplicates */
        if (pdb_find_backend_entry(name)) {
                DEBUG(0,("There already is a passdb backend registered with the name %s!\n", name));
-               return False;
+               return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
        entry = smb_xmalloc(sizeof(struct pdb_init_function_entry));
@@ -56,7 +66,7 @@ BOOL smb_register_passdb(const char *name, pdb_init_function init, int version)
 
        DLIST_ADD(backends, entry);
        DEBUG(5,("Successfully added passdb backend '%s'\n", name));
-       return True;
+       return NT_STATUS_OK;
 }
 
 static struct pdb_init_function_entry *pdb_find_backend_entry(const char *name)
@@ -426,7 +436,7 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c
        /* Try to find a module that contains this module */
        if (!entry) { 
                DEBUG(2,("No builtin backend found, trying to load plugin\n"));
-               if(smb_probe_module("pdb", module_name) && !(entry = pdb_find_backend_entry(module_name))) {
+               if(NT_STATUS_IS_OK(smb_probe_module("pdb", module_name)) && !(entry = pdb_find_backend_entry(module_name))) {
                        DEBUG(0,("Plugin is available, but doesn't register passdb backend %s\n", module_name));
                        SAFE_FREE(module_name);
                        return NT_STATUS_UNSUCCESSFUL;
@@ -439,7 +449,7 @@ static NTSTATUS make_pdb_methods_name(struct pdb_methods **methods, struct pdb_c
                SAFE_FREE(module_name);
                return NT_STATUS_INVALID_PARAMETER;
        }
-       
+
        DEBUG(5,("Found pdb backend %s\n", module_name));
        nt_status = entry->init(context, methods, module_location);
        if (NT_STATUS_IS_OK(nt_status)) {
index 0ebbd446ec7be91e4c1bb510c814ab78fa51e288..ecca633d2f492dcdf8e1afa7ca30b9564d6c1f37 100644 (file)
@@ -2065,8 +2065,7 @@ NTSTATUS pdb_init_ldapsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, co
        return NT_STATUS_OK;
 }
 
-int pdb_ldap_init(void)
+NTSTATUS pdb_ldap_init(void)
 {
-       smb_register_passdb("ldapsam", pdb_init_ldapsam, PASSDB_INTERFACE_VERSION);
-       return True;
+       return smb_register_passdb("ldapsam", pdb_init_ldapsam, PASSDB_INTERFACE_VERSION);
 }
index ca1c239d73d5cd0a8a456e0d682fa484ede20031..d3eb7cb975e42dc2c5413f18c38ef252c344264d 100644 (file)
@@ -946,7 +946,7 @@ static NTSTATUS mysqlsam_init(struct pdb_context * pdb_context, struct pdb_metho
        return NT_STATUS_OK;
 }
 
-int pdb_mysql_init(void) 
+NTSTATUS pdb_mysql_init(void) 
 {
-       return smb_register_passdb("mysql", mysqlsam_init, PASSDB_INTERFACE_VERSION);
+       return smb_register_passdb(PASSDB_INTERFACE_VERSION, "mysql", mysqlsam_init);
 }
index 73d65af1c6fac2c875847a7b74bdade95c73994f..cd9288fed03772a3d77c39178098c563f8c09c5c 100644 (file)
@@ -1553,7 +1553,7 @@ NTSTATUS pdb_init_nisplussam (PDB_CONTEXT * pdb_context,
        return NT_STATUS_OK;
 }
 
-int pdb_nisplus_init(void)
+NTSTATUS pdb_nisplus_init(void)
 {
-       return smb_register_passdb("nisplussam", pdb_init_nisplussam, PASSDB_INTERFACE_VERSION);
+       return smb_register_passdb(PASSDB_INTERFACE_VERSION, "nisplussam", pdb_init_nisplussam);
 }
index ed830242489dfb91290f17eea56b4e9ef8e1094c..69356c45db0b96e33d8c84c3198cf0f58028baf8 100644 (file)
@@ -125,7 +125,7 @@ NTSTATUS pdb_init_unixsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, co
        return NT_STATUS_OK;
 }
 
-int pdb_unix_init(void)
+NTSTATUS pdb_unix_init(void)
 {
        return smb_register_passdb("unixsam", pdb_init_unixsam, PASSDB_INTERFACE_VERSION);
 }
index bde2d14a85f79a3d8ff10d5caeaf744831e8b220..7a5c0e2b53b280d744bfad420823e3de96b1a688 100644 (file)
@@ -553,7 +553,7 @@ static NTSTATUS xmlsam_init(PDB_CONTEXT * pdb_context, PDB_METHODS ** pdb_method
        return NT_STATUS_OK;
 }
 
-int pdb_xml_init(void) 
+NTSTATUS pdb_xml_init(void) 
 {
-       return smb_register_passdb("xml", xmlsam_init, PASSDB_INTERFACE_VERSION);
+       return smb_register_passdb(PASSDB_INTERFACE_VERSION, "xml", xmlsam_init);
 }
index 0807efd550c08b5fa5bac1753cd02ca1fa538225..75a24174ea3b82829544ce825810430a2ba3342c 100644 (file)
@@ -158,7 +158,7 @@ static BOOL api_dfs_enum(pipes_struct *p)
 \pipe\netdfs commands
 ********************************************************************/
 
-int rpc_dfs_init(void)
+NTSTATUS rpc_dfs_init(void)
 {
   struct api_struct api_netdfs_cmds[] =
     {
@@ -168,6 +168,6 @@ int rpc_dfs_init(void)
       {"DFS_GET_INFO",     DFS_GET_INFO,            api_dfs_get_info },
       {"DFS_ENUM",         DFS_ENUM,                api_dfs_enum     }
     };
-  return rpc_pipe_register_commands("netdfs", "netdfs", api_netdfs_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "netdfs", "netdfs", api_netdfs_cmds,
                                    sizeof(api_netdfs_cmds) / sizeof(struct api_struct));
 }
index dcd8dd0c53b36ff26496e3344df64d225ad5a698..166b6e939d2dea07468058ce1f2b1e17ce8eeb01 100644 (file)
@@ -120,7 +120,7 @@ static BOOL api_sink_data(pipes_struct *p)
 \pipe\rpcecho commands
 ********************************************************************/
 
-int rpc_echo_init(void)
+NTSTATUS rpc_echo_init(void)
 {
        struct api_struct api_echo_cmds[] = {
                {"ADD_ONE",       ECHO_ADD_ONE,     api_add_one },
@@ -129,7 +129,7 @@ int rpc_echo_init(void)
                {"SINK_DATA",     ECHO_SINK_DATA,   api_sink_data },
        };
 
-       return rpc_pipe_register_commands(
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
                "rpcecho", "rpcecho", api_echo_cmds,
                sizeof(api_echo_cmds) / sizeof(struct api_struct));
 }
index bfa706acf245a2575c0aeef9e67a102242a8e6c8..7bd300dc7c47067fdbf2a7bfa88d8c5735bdb0bf 100644 (file)
@@ -771,7 +771,7 @@ static BOOL api_lsa_remove_acct_rights(pipes_struct *p)
  \PIPE\ntlsa commands
  ***************************************************************************/
 
-int rpc_lsa_init(void)
+NTSTATUS rpc_lsa_init(void)
 {
   static const struct api_struct api_lsa_cmds[] =
     {
@@ -801,6 +801,6 @@ int rpc_lsa_init(void)
       { "LSA_REMOVEACCTRIGHTS", LSA_REMOVEACCTRIGHTS, api_lsa_remove_acct_rights},
     };
 
-  return rpc_pipe_register_commands("lsarpc", "lsass", api_lsa_cmds, 
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "lsarpc", "lsass", api_lsa_cmds, 
                                    sizeof(api_lsa_cmds) / sizeof(struct api_struct));
 }
index 7dc0f57f34f6ebf7486c971fa4fb53aa9b76edc6..0cd40731774675c1102b85d73fc89a7bf42cd85b 100644 (file)
@@ -321,7 +321,7 @@ static BOOL api_net_logon_ctrl(pipes_struct *p)
  array of \PIPE\NETLOGON operations
  ********************************************************************/
 
-int rpc_net_init(void)
+NTSTATUS rpc_net_init(void)
 {
   static struct api_struct api_net_cmds [] =
     {
@@ -336,6 +336,6 @@ int rpc_net_init(void)
       { "NET_LOGON_CTRL"    , NET_LOGON_CTRL    , api_net_logon_ctrl     }
     };
 
-  return rpc_pipe_register_commands("NETLOGON", "lsass", api_net_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "NETLOGON", "lsass", api_net_cmds,
                                    sizeof(api_net_cmds) / sizeof(struct api_struct));
 }
index b09058629af043b09a7e489936243f979e33c413..5b9d39ddc79bf5ee45bd29ac8959941a9c12c7f8 100644 (file)
@@ -781,10 +781,28 @@ BOOL check_bind_req(char* pipe_name, RPC_IFACE* abstract,
 /*******************************************************************
  Register commands to an RPC pipe
 *******************************************************************/
-int rpc_pipe_register_commands(const char *clnt, const char *srv, const struct api_struct *cmds, int size)
+NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size)
 {
         struct rpc_table *rpc_entry;
 
+       if (!clnt || !srv || !cmds) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       if (version != SMB_RPC_INTERFACE_VERSION) {
+               DEBUG(0,("Can't register rpc commands!\n"
+                        "You tried to register a rpc module with SMB_RPC_INTERFACE_VERSION %d"
+                        ", while this version of samba uses version %d!\n", 
+                        version,SMB_RPC_INTERFACE_VERSION));
+               return NT_STATUS_OBJECT_TYPE_MISMATCH;
+       }
+
+       /* TODO: 
+        *
+        * we still need to make sure that don't register the same commands twice!!!
+        * 
+        * --metze
+        */
 
         /* We use a temporary variable because this call can fail and 
            rpc_lookup will still be valid afterwards.  It could then succeed if
@@ -794,7 +812,7 @@ int rpc_pipe_register_commands(const char *clnt, const char *srv, const struct a
         if (NULL == rpc_entry) {
                 rpc_lookup_size--;
                 DEBUG(0, ("rpc_pipe_register_commands: memory allocation failed\n"));
-                return 0;
+                return NT_STATUS_NO_MEMORY;
         } else {
                 rpc_lookup = rpc_entry;
         }
@@ -810,7 +828,7 @@ int rpc_pipe_register_commands(const char *clnt, const char *srv, const struct a
                size * sizeof(struct api_struct));
         rpc_entry->n_cmds += size;
         
-        return size;
+        return NT_STATUS_OK;
 }
 
 /*******************************************************************
@@ -852,7 +870,7 @@ BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
        }
 
        if (i == rpc_lookup_size) {
-                               if (!smb_probe_module("rpc", p->name)) {
+                               if (NT_STATUS_IS_ERR(smb_probe_module("rpc", p->name))) {
                        DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n",
                                 p->name ));
                        if(!setup_bind_nak(p))
index f72d8e4f295354054d5bf4b536783e56b0a882d4..43bb1ad86a1d70ef46696b1a207715c8bc3bb4b0 100644 (file)
@@ -373,7 +373,7 @@ static BOOL api_reg_save_key(pipes_struct *p)
  array of \PIPE\reg operations
  ********************************************************************/
 
-int rpc_reg_init(void)
+NTSTATUS rpc_reg_init(void)
 {
   static struct api_struct api_reg_cmds[] =
     {
@@ -391,6 +391,6 @@ int rpc_reg_init(void)
       { "REG_UNKNOWN_1A"         , REG_UNKNOWN_1A         , api_reg_unknown_1a       },
       { "REG_SAVE_KEY"           , REG_SAVE_KEY           , api_reg_save_key         }
     };
-  return rpc_pipe_register_commands("winreg", "winreg", api_reg_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "winreg", "winreg", api_reg_cmds,
                                    sizeof(api_reg_cmds) / sizeof(struct api_struct));
 }
index 67c092775b974a39c405f8a93db8e0cc65b04f3a..9250b023d3b8cf98ff0fc95755c29bb478f0452e 100644 (file)
@@ -1443,7 +1443,7 @@ static BOOL api_samr_set_dom_info(pipes_struct *p)
  array of \PIPE\samr operations
  ********************************************************************/
 
-int rpc_samr_init(void)
+NTSTATUS rpc_samr_init(void)
 {
   static struct api_struct api_samr_cmds [] =
     {
@@ -1501,6 +1501,6 @@ int rpc_samr_init(void)
       {"SAMR_SET_DOMAIN_INFO"   , SAMR_SET_DOMAIN_INFO  , api_samr_set_dom_info     },
       {"SAMR_CONNECT4"          , SAMR_CONNECT4         , api_samr_connect4         }
     };
-  return rpc_pipe_register_commands("samr", "lsass", api_samr_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "samr", "lsass", api_samr_cmds,
                                    sizeof(api_samr_cmds) / sizeof(struct api_struct));
 }
index a7dd7a6cef5a0f2e2ce7874377359492f9033e92..3e9ed9e39f9a6a91d72d6b22e6d79afd7195ffac 100755 (executable)
@@ -1580,7 +1580,7 @@ static BOOL api_spoolss_replycloseprinter(pipes_struct *p)
 \pipe\spoolss commands
 ********************************************************************/
 
-int rpc_spoolss_init(void)
+NTSTATUS rpc_spoolss_init(void)
 {
   struct api_struct api_spoolss_cmds[] = 
     {
@@ -1640,6 +1640,6 @@ int rpc_spoolss_init(void)
  {"SPOOLSS_REPLYCLOSEPRINTER",         SPOOLSS_REPLYCLOSEPRINTER,         api_spoolss_replycloseprinter         }
 #endif
     };
-  return rpc_pipe_register_commands("spoolss", "spoolss", api_spoolss_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "spoolss", "spoolss", api_spoolss_cmds,
                                    sizeof(api_spoolss_cmds) / sizeof(struct api_struct));
 }
index 96820ae74bc3b1b6d6791f02f3f7815bc35d8e3c..deba1224210687e0067f241232b0e24a0ffc16b8 100644 (file)
@@ -526,7 +526,7 @@ static BOOL api_srv_net_file_set_secdesc(pipes_struct *p)
 \PIPE\srvsvc commands
 ********************************************************************/
 
-int rpc_srv_init(void)
+NTSTATUS rpc_srv_init(void)
 {
   static const struct api_struct api_srv_cmds[] =
     {
@@ -548,6 +548,6 @@ int rpc_srv_init(void)
       { "SRV_NET_FILE_QUERY_SECDESC", SRV_NET_FILE_QUERY_SECDESC, api_srv_net_file_query_secdesc },
       { "SRV_NET_FILE_SET_SECDESC"  , SRV_NET_FILE_SET_SECDESC  , api_srv_net_file_set_secdesc   }
     };
-  return rpc_pipe_register_commands("srvsvc", "ntsvcs", api_srv_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "srvsvc", "ntsvcs", api_srv_cmds,
                                    sizeof(api_srv_cmds) / sizeof(struct api_struct));
 }
index ddcbadd1d44dad780f90830e8cd7c0daf10dac4e..8efa29fd0bc98850bcd8322a52ee3c466fb4be9c 100644 (file)
@@ -60,12 +60,12 @@ static BOOL api_wks_query_info(pipes_struct *p)
  \PIPE\wkssvc commands
  ********************************************************************/
 
-int rpc_wks_init(void)
+NTSTATUS rpc_wks_init(void)
 {
   static struct api_struct api_wks_cmds[] =
     {
       { "WKS_Q_QUERY_INFO", WKS_QUERY_INFO, api_wks_query_info }
     };
-  return rpc_pipe_register_commands("wkssvc", "ntsvcs", api_wks_cmds,
+  return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, "wkssvc", "ntsvcs", api_wks_cmds,
                                    sizeof(api_wks_cmds) / sizeof(struct api_struct));
 }
index 75bcb09917316fe99026e726fbdde8413359c4f2..e33a8ccbe73cbb739e1c981c7100b562bc54605e 100644 (file)
@@ -153,29 +153,30 @@ static struct vfs_init_function_entry *vfs_find_backend_entry(const char *name)
    return NULL;
 }
 
-BOOL smb_register_vfs(const char *name, vfs_op_tuple *(*init)(const struct vfs_ops *, struct smb_vfs_handle_struct *), int version)
+NTSTATUS smb_register_vfs(uint16 version, const char *name, vfs_op_tuple *(*init)(const struct vfs_ops *, struct smb_vfs_handle_struct *))
 {
    struct vfs_init_function_entry *entry = backends;
-   
+
    if ((version < SMB_VFS_INTERFACE_CASCADED)) {
        DEBUG(0, ("vfs_init() returned wrong interface version info (was %d, should be no less than %d)\n",
            version, SMB_VFS_INTERFACE_VERSION ));
-       return False;
+       return NT_STATUS_OBJECT_TYPE_MISMATCH;
    }
   
    if ((version < SMB_VFS_INTERFACE_VERSION)) {
        DEBUG(0, ("Warning: vfs_init() states that module confirms interface version #%d, current interface version is #%d.\n\
                Proceeding in compatibility mode, new operations (since version #%d) will fallback to default ones.\n",
                version, SMB_VFS_INTERFACE_VERSION, version ));
-          return False;
+          return NT_STATUS_OBJECT_TYPE_MISMATCH;
+   }
+
+   if (!name || !init) {
+       return NT_STATUS_INVALID_PARAMETER;
    }
    
-   while(entry) {
-       if (strequal(entry->name, name)) {
+   if (vfs_find_backend_entry(name)) {
            DEBUG(0,("VFS module %s already loaded!\n", name));
-           return False;
-       }
-       entry = entry->next;
+           return NT_STATUS_OBJECT_NAME_COLLISION;
    }
 
    entry = smb_xmalloc(sizeof(struct vfs_init_function_entry));
@@ -184,7 +185,7 @@ BOOL smb_register_vfs(const char *name, vfs_op_tuple *(*init)(const struct vfs_o
 
    DLIST_ADD(backends, entry);
    DEBUG(5, ("Successfully added vfs backend '%s'\n", name));
-   return True;
+   return NT_STATUS_OK;
 }
 
 /****************************************************************************
@@ -267,7 +268,7 @@ BOOL vfs_init_custom(connection_struct *conn, const char *vfs_object)
 
        /* First, try to load the module with the new module system */
        if((entry = vfs_find_backend_entry(vfs_object)) || 
-          (smb_probe_module("vfs", vfs_object) && 
+          (NT_STATUS_IS_OK(smb_probe_module("vfs", vfs_object)) && 
                (entry = vfs_find_backend_entry(vfs_object)))) {
 
                DEBUG(3,("Successfully loaded %s with the new modules system\n", vfs_object));