2003-08-13 05:53:07 +04:00
/*
Unix SMB / CIFS implementation .
NTVFS base code
This patch adds a better dcerpc server infastructure.
1.) We now register endpoint servers add startup via register_backend()
and later use the smb.conf 'dcerpc endpoint servers' parameter to setup the dcesrv_context
2.) each endpoint server can register at context creation time as much interfaces as it wants
(multiple interfaces on one endpoint are supported!)
(NOTE: there's a difference between 'endpoint server' and 'endpoint'!
for details look at rpc_server/dcesrv_server.h)
3.) one endpoint can have a security descriptor registered to it self
this will be checked in the future when a client wants to connect
to an smb pipe endpoint.
4.) we now have a 'remote' endpoint server, which works like the ntvfs_cifs module
it takes this options in the [globals] section:
dcerpc remote:interfaces = srvsvc, winreg, w32time, epmapper
dcerpc remote:binding = ...
dcerpc remote:user = ...
dcerpc remote:password = ...
5.) we currently have tree endpoint servers: epmapper, rpcecho and remote
the default for the 'dcerpc endpiont servers = epmapper, rpcecho'
for testing you can also do
dcerpc endpoint servers = rpcecho, remote, epmapper
dcerpc remote:interfaces = srvsvc, samr, netlogon
6,) please notice the the epmapper now only returns NO_ENTRIES
(but I think we'll find a solution for this too:-)
7.) also there're some other stuff left, but step by step :-)
This patch also includes updates for the
register_subsystem() , ntvfs_init(), and some other funtions
to check for duplicate subsystem registration
metze
(hmmm, my first large commit...I hope it works as supposed :-)
(This used to be commit 917e45dafd5be4c2cd90ff425b8d6f8403122349)
2004-01-09 01:55:27 +03:00
2003-08-13 05:53:07 +04:00
Copyright ( C ) Andrew Tridgell 2003
This patch adds a better dcerpc server infastructure.
1.) We now register endpoint servers add startup via register_backend()
and later use the smb.conf 'dcerpc endpoint servers' parameter to setup the dcesrv_context
2.) each endpoint server can register at context creation time as much interfaces as it wants
(multiple interfaces on one endpoint are supported!)
(NOTE: there's a difference between 'endpoint server' and 'endpoint'!
for details look at rpc_server/dcesrv_server.h)
3.) one endpoint can have a security descriptor registered to it self
this will be checked in the future when a client wants to connect
to an smb pipe endpoint.
4.) we now have a 'remote' endpoint server, which works like the ntvfs_cifs module
it takes this options in the [globals] section:
dcerpc remote:interfaces = srvsvc, winreg, w32time, epmapper
dcerpc remote:binding = ...
dcerpc remote:user = ...
dcerpc remote:password = ...
5.) we currently have tree endpoint servers: epmapper, rpcecho and remote
the default for the 'dcerpc endpiont servers = epmapper, rpcecho'
for testing you can also do
dcerpc endpoint servers = rpcecho, remote, epmapper
dcerpc remote:interfaces = srvsvc, samr, netlogon
6,) please notice the the epmapper now only returns NO_ENTRIES
(but I think we'll find a solution for this too:-)
7.) also there're some other stuff left, but step by step :-)
This patch also includes updates for the
register_subsystem() , ntvfs_init(), and some other funtions
to check for duplicate subsystem registration
metze
(hmmm, my first large commit...I hope it works as supposed :-)
(This used to be commit 917e45dafd5be4c2cd90ff425b8d6f8403122349)
2004-01-09 01:55:27 +03:00
Copyright ( C ) Stefan ( metze ) Metzmacher 2004
2003-08-13 05:53:07 +04:00
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 2 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 , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/*
this implements the core code for all NTVFS modules . Backends register themselves here .
*/
# include "includes.h"
2004-11-02 09:42:15 +03:00
# include "dlinklist.h"
2004-11-02 10:18:24 +03:00
# include "smb_server/smb_server.h"
2005-12-26 21:48:23 +03:00
# include "smb_build.h"
2003-08-13 05:53:07 +04:00
/* the list of currently registered NTVFS backends, note that there
* can be more than one backend with the same name , as long as they
* have different typesx */
2004-12-03 09:24:38 +03:00
static struct ntvfs_backend {
2004-02-03 14:10:56 +03:00
const struct ntvfs_ops * ops ;
2003-08-13 05:53:07 +04:00
} * backends = NULL ;
static int num_backends ;
/*
register a NTVFS backend .
The ' name ' can be later used by other backends to find the operations
structure for this backend .
The ' type ' is used to specify whether this is for a disk , printer or IPC $ share
*/
2004-11-15 01:23:23 +03:00
NTSTATUS ntvfs_register ( const void * _ops )
2003-08-13 05:53:07 +04:00
{
2004-02-03 14:10:56 +03:00
const struct ntvfs_ops * ops = _ops ;
struct ntvfs_ops * new_ops ;
2003-11-25 06:15:26 +03:00
if ( ntvfs_backend_byname ( ops - > name , ops - > type ) ! = NULL ) {
2003-08-13 05:53:07 +04:00
/* its already registered! */
2004-02-02 16:28:29 +03:00
DEBUG ( 0 , ( " NTVFS backend '%s' for type %d already registered \n " ,
2003-11-25 06:15:26 +03:00
ops - > name , ( int ) ops - > type ) ) ;
return NT_STATUS_OBJECT_NAME_COLLISION ;
2003-08-13 05:53:07 +04:00
}
2004-12-03 09:24:38 +03:00
backends = realloc_p ( backends , struct ntvfs_backend , num_backends + 1 ) ;
2003-08-13 05:53:07 +04:00
if ( ! backends ) {
smb_panic ( " out of memory in ntvfs_register " ) ;
}
2004-02-03 14:10:56 +03:00
new_ops = smb_xmemdup ( ops , sizeof ( * ops ) ) ;
new_ops - > name = smb_xstrdup ( ops - > name ) ;
backends [ num_backends ] . ops = new_ops ;
2003-08-13 05:53:07 +04:00
num_backends + + ;
2004-02-02 16:28:29 +03:00
DEBUG ( 3 , ( " NTVFS backend '%s' for type %d registered \n " ,
ops - > name , ops - > type ) ) ;
2003-11-25 06:15:26 +03:00
return NT_STATUS_OK ;
2003-08-13 05:53:07 +04:00
}
/*
return the operations structure for a named backend of the specified type
*/
2004-02-03 14:10:56 +03:00
const struct ntvfs_ops * ntvfs_backend_byname ( const char * name , enum ntvfs_type type )
2003-08-13 05:53:07 +04:00
{
int i ;
for ( i = 0 ; i < num_backends ; i + + ) {
2003-11-25 06:15:26 +03:00
if ( backends [ i ] . ops - > type = = type & &
strcmp ( backends [ i ] . ops - > name , name ) = = 0 ) {
2003-08-13 05:53:07 +04:00
return backends [ i ] . ops ;
}
}
return NULL ;
}
/*
return the NTVFS interface version , and the size of some critical types
This can be used by backends to either detect compilation errors , or provide
multiple implementations for different smbd compilation options in one module
*/
2003-12-02 12:16:53 +03:00
const struct ntvfs_critical_sizes * ntvfs_interface_version ( void )
2003-08-13 05:53:07 +04:00
{
2003-12-02 12:16:53 +03:00
static const struct ntvfs_critical_sizes critical_sizes = {
NTVFS_INTERFACE_VERSION ,
2004-10-29 01:48:53 +04:00
sizeof ( struct ntvfs_critical_sizes ) ,
2004-09-29 17:17:09 +04:00
sizeof ( struct ntvfs_context ) ,
sizeof ( struct ntvfs_module_context ) ,
2003-12-02 12:16:53 +03:00
sizeof ( struct ntvfs_ops ) ,
2004-10-29 01:48:53 +04:00
sizeof ( struct ntvfs_async_state ) ,
2004-06-28 12:27:36 +04:00
sizeof ( struct smbsrv_tcon ) ,
2004-06-28 12:39:00 +04:00
sizeof ( struct smbsrv_request ) ,
2003-12-02 12:16:53 +03:00
} ;
return & critical_sizes ;
2003-08-13 05:53:07 +04:00
}
/*
initialise a connection structure to point at a NTVFS backend
*/
2004-09-29 17:17:09 +04:00
NTSTATUS ntvfs_init_connection ( struct smbsrv_request * req , enum ntvfs_type type )
2003-08-13 05:53:07 +04:00
{
2004-09-23 11:44:42 +04:00
const char * * handlers = lp_ntvfs_handler ( req - > tcon - > service ) ;
2004-09-29 17:17:09 +04:00
int i ;
struct ntvfs_context * ctx ;
2003-08-13 05:53:07 +04:00
2004-09-29 17:17:09 +04:00
if ( ! handlers ) {
2005-01-09 05:33:16 +03:00
return NT_STATUS_INTERNAL_ERROR ;
2004-09-29 17:17:09 +04:00
}
2003-08-13 05:53:07 +04:00
2005-01-09 05:33:16 +03:00
ctx = talloc ( req - > tcon , struct ntvfs_context ) ;
NT_STATUS_HAVE_NO_MEMORY ( ctx ) ;
2004-09-29 17:17:09 +04:00
ctx - > type = type ;
ctx - > modules = NULL ;
2003-08-13 05:53:07 +04:00
2004-09-29 17:17:09 +04:00
for ( i = 0 ; handlers [ i ] ; i + + ) {
struct ntvfs_module_context * ntvfs ;
2004-09-23 11:44:42 +04:00
2005-01-09 05:33:16 +03:00
ntvfs = talloc ( ctx , struct ntvfs_module_context ) ;
NT_STATUS_HAVE_NO_MEMORY ( ntvfs ) ;
2004-09-23 11:44:42 +04:00
2004-09-29 17:17:09 +04:00
ntvfs - > ops = ntvfs_backend_byname ( handlers [ i ] , ctx - > type ) ;
if ( ! ntvfs - > ops ) {
DEBUG ( 1 , ( " ntvfs_init_connection: failed to find backend=%s, type=%d \n " ,
handlers [ i ] , ctx - > type ) ) ;
2005-01-09 05:33:16 +03:00
return NT_STATUS_INTERNAL_ERROR ;
2004-09-29 17:17:09 +04:00
}
ntvfs - > depth = i ;
DLIST_ADD_END ( ctx - > modules , ntvfs , struct ntvfs_module_context * ) ;
}
if ( ! ctx - > modules ) {
2005-01-09 05:33:16 +03:00
return NT_STATUS_INTERNAL_ERROR ;
2004-09-29 17:17:09 +04:00
}
req - > tcon - > ntvfs_ctx = ctx ;
return NT_STATUS_OK ;
2004-09-23 11:44:42 +04:00
}
2005-12-26 19:46:55 +03:00
NTSTATUS ntvfs_init ( void )
{
init_module_fn static_init [ ] = STATIC_NTVFS_MODULES ;
init_module_fn * shared_init = load_samba_modules ( NULL , " ntvfs " ) ;
run_init_functions ( static_init ) ;
run_init_functions ( shared_init ) ;
talloc_free ( shared_init ) ;
return NT_STATUS_OK ;
}