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"
/* 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 */
static struct {
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
*/
2003-11-25 06:15:26 +03:00
static NTSTATUS ntvfs_register ( 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
}
backends = Realloc ( backends , sizeof ( backends [ 0 ] ) * ( num_backends + 1 ) ) ;
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 ,
sizeof ( struct ntvfs_ops ) ,
sizeof ( SMB_OFF_T ) ,
2004-06-28 12:27:36 +04:00
sizeof ( struct smbsrv_tcon ) ,
2003-12-02 12:16:53 +03:00
sizeof ( struct request_context ) ,
} ;
return & critical_sizes ;
2003-08-13 05:53:07 +04:00
}
/*
initialise the NTVFS subsystem
*/
BOOL ntvfs_init ( void )
{
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
NTSTATUS status ;
status = register_subsystem ( " ntvfs " , ntvfs_register ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2003-08-13 05:53:07 +04:00
2003-11-25 06:15:26 +03:00
/* FIXME: Perhaps panic if a basic backend, such as IPC, fails to initialise? */
static_init_ntvfs ;
2003-08-13 05:53:07 +04:00
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
DEBUG ( 3 , ( " NTVFS subsystem version %d initialised \n " , NTVFS_INTERFACE_VERSION ) ) ;
2003-08-13 05:53:07 +04:00
return True ;
}
/*
initialise a connection structure to point at a NTVFS backend
*/
NTSTATUS ntvfs_init_connection ( struct request_context * req )
{
2004-06-28 12:27:36 +04:00
const char * handler = lp_ntvfs_handler ( req - > tcon - > service ) ;
2003-08-13 05:53:07 +04:00
2004-06-28 12:27:36 +04:00
req - > tcon - > ntvfs_ops = ntvfs_backend_byname ( handler , req - > tcon - > type ) ;
2003-08-13 05:53:07 +04:00
2004-06-28 12:27:36 +04:00
if ( ! req - > tcon - > ntvfs_ops ) {
DEBUG ( 1 , ( " ntvfs_init_connection: failed to find backend=%s, type=%d \n " , handler , req - > tcon - > type ) ) ;
2003-08-13 05:53:07 +04:00
return NT_STATUS_UNSUCCESSFUL ;
}
return NT_STATUS_OK ;
}