r7643: This patch adds a new NTPTR subsystem:
- this is an abstraction layer for print services,
like out NTVFS subsystem for file services
- all protocol specific details are still in rpc_server/spoolss/
- like the stupid in and out Buffer handling
- checking of the r->in.server_name
- ...
- this subsystem can have multiple implementation
selected by the "ntptr providor" global-section parameter
- I currently added a "simple_ldb" backend,
that stores Printers, Forms, Ports, Monitors, ...
in the spoolss.db, and does no real printing
this backend is basicly for testing, how the spoolss protocol
works
- the interface is just a prototype and will be changed a bit
the next days or weeks, till the simple_ldb backend can
handle all calls that are used by normal w2k3/xp clients
- I'll also make the api async, as the ntvfs api
this will make things like the RemoteFindFirstPrinterChangeNotifyEx(),
that opens a connection back to the client, easier to implement,
as we should not block the whole smbd for that
- the idea is to later implement a "unix" backend
that works like the current samba3 code
- and maybe some embedded print server vendors can write there own
backend that can directly talk to a printer without having cups or something like this
- the default settings are (it currently makes no sense to change them :-):
ntptr providor = simple_ldb
spoolss database = $private_dir/spoolss.db
metze
(This used to be commit 455b5536d41bc31ebef8290812f45d4a38afa8e9)
2005-06-16 21:27:57 +04:00
/*
Unix SMB / CIFS implementation .
NTPTR base code
Copyright ( C ) Stefan ( metze ) Metzmacher 2005
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 NTPTR modules . Backends register themselves here .
*/
# include "includes.h"
# include "ntptr/ntptr.h"
2005-12-26 21:48:23 +03:00
# include "smb_build.h"
r7643: This patch adds a new NTPTR subsystem:
- this is an abstraction layer for print services,
like out NTVFS subsystem for file services
- all protocol specific details are still in rpc_server/spoolss/
- like the stupid in and out Buffer handling
- checking of the r->in.server_name
- ...
- this subsystem can have multiple implementation
selected by the "ntptr providor" global-section parameter
- I currently added a "simple_ldb" backend,
that stores Printers, Forms, Ports, Monitors, ...
in the spoolss.db, and does no real printing
this backend is basicly for testing, how the spoolss protocol
works
- the interface is just a prototype and will be changed a bit
the next days or weeks, till the simple_ldb backend can
handle all calls that are used by normal w2k3/xp clients
- I'll also make the api async, as the ntvfs api
this will make things like the RemoteFindFirstPrinterChangeNotifyEx(),
that opens a connection back to the client, easier to implement,
as we should not block the whole smbd for that
- the idea is to later implement a "unix" backend
that works like the current samba3 code
- and maybe some embedded print server vendors can write there own
backend that can directly talk to a printer without having cups or something like this
- the default settings are (it currently makes no sense to change them :-):
ntptr providor = simple_ldb
spoolss database = $private_dir/spoolss.db
metze
(This used to be commit 455b5536d41bc31ebef8290812f45d4a38afa8e9)
2005-06-16 21:27:57 +04:00
/* the list of currently registered NTPTR backends */
static struct ntptr_backend {
const struct ntptr_ops * ops ;
} * backends = NULL ;
static int num_backends ;
/*
register a NTPTR backend .
The ' name ' can be later used by other backends to find the operations
structure for this backend .
*/
NTSTATUS ntptr_register ( const void * _ops )
{
const struct ntptr_ops * ops = _ops ;
struct ntptr_ops * new_ops ;
if ( ntptr_backend_byname ( ops - > name ) ! = NULL ) {
/* its already registered! */
DEBUG ( 0 , ( " NTPTR backend '%s' already registered \n " ,
ops - > name ) ) ;
return NT_STATUS_OBJECT_NAME_COLLISION ;
}
backends = realloc_p ( backends , struct ntptr_backend , num_backends + 1 ) ;
if ( ! backends ) {
smb_panic ( " out of memory in ntptr_register " ) ;
}
new_ops = smb_xmemdup ( ops , sizeof ( * ops ) ) ;
new_ops - > name = smb_xstrdup ( ops - > name ) ;
backends [ num_backends ] . ops = new_ops ;
num_backends + + ;
DEBUG ( 3 , ( " NTPTR backend '%s' \n " ,
ops - > name ) ) ;
return NT_STATUS_OK ;
}
2005-12-26 19:46:55 +03:00
NTSTATUS ntptr_init ( void )
{
init_module_fn static_init [ ] = STATIC_NTPTR_MODULES ;
init_module_fn * shared_init = load_samba_modules ( NULL , " ntptr " ) ;
run_init_functions ( static_init ) ;
run_init_functions ( shared_init ) ;
talloc_free ( shared_init ) ;
return NT_STATUS_OK ;
}
r7643: This patch adds a new NTPTR subsystem:
- this is an abstraction layer for print services,
like out NTVFS subsystem for file services
- all protocol specific details are still in rpc_server/spoolss/
- like the stupid in and out Buffer handling
- checking of the r->in.server_name
- ...
- this subsystem can have multiple implementation
selected by the "ntptr providor" global-section parameter
- I currently added a "simple_ldb" backend,
that stores Printers, Forms, Ports, Monitors, ...
in the spoolss.db, and does no real printing
this backend is basicly for testing, how the spoolss protocol
works
- the interface is just a prototype and will be changed a bit
the next days or weeks, till the simple_ldb backend can
handle all calls that are used by normal w2k3/xp clients
- I'll also make the api async, as the ntvfs api
this will make things like the RemoteFindFirstPrinterChangeNotifyEx(),
that opens a connection back to the client, easier to implement,
as we should not block the whole smbd for that
- the idea is to later implement a "unix" backend
that works like the current samba3 code
- and maybe some embedded print server vendors can write there own
backend that can directly talk to a printer without having cups or something like this
- the default settings are (it currently makes no sense to change them :-):
ntptr providor = simple_ldb
spoolss database = $private_dir/spoolss.db
metze
(This used to be commit 455b5536d41bc31ebef8290812f45d4a38afa8e9)
2005-06-16 21:27:57 +04:00
/*
return the operations structure for a named backend
*/
const struct ntptr_ops * ntptr_backend_byname ( const char * name )
{
int i ;
for ( i = 0 ; i < num_backends ; i + + ) {
if ( strcmp ( backends [ i ] . ops - > name , name ) = = 0 ) {
return backends [ i ] . ops ;
}
}
return NULL ;
}
/*
return the NTPTR 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
*/
static const struct ntptr_critical_sizes critical_sizes = {
. interface_version = NTPTR_INTERFACE_VERSION ,
. sizeof_ntptr_critical_sizes = sizeof ( struct ntptr_critical_sizes ) ,
. sizeof_ntptr_context = sizeof ( struct ntptr_context ) ,
. sizeof_ntptr_ops = sizeof ( struct ntptr_ops ) ,
} ;
const struct ntptr_critical_sizes * ntptr_interface_version ( void )
{
return & critical_sizes ;
}
/*
create a ntptr_context with a specified NTPTR backend
*/
NTSTATUS ntptr_init_context ( TALLOC_CTX * mem_ctx , const char * providor , struct ntptr_context * * _ntptr )
{
NTSTATUS status ;
struct ntptr_context * ntptr ;
if ( ! providor ) {
return NT_STATUS_INTERNAL_ERROR ;
}
ntptr = talloc ( mem_ctx , struct ntptr_context ) ;
NT_STATUS_HAVE_NO_MEMORY ( ntptr ) ;
ntptr - > private_data = NULL ;
ntptr - > ops = ntptr_backend_byname ( providor ) ;
if ( ! ntptr - > ops ) {
DEBUG ( 1 , ( " ntptr_init_context: failed to find NTPTR providor='%s' \n " ,
providor ) ) ;
return NT_STATUS_INTERNAL_ERROR ;
}
status = ntptr - > ops - > init_context ( ntptr ) ;
NT_STATUS_NOT_OK_RETURN ( status ) ;
* _ntptr = ntptr ;
return NT_STATUS_OK ;
}