2010-11-01 10:43:46 +03:00
/*
ldb database library - samba extensions
Copyright ( C ) Andrew Tridgell 2010
* * NOTE ! The following LGPL license applies to the ldb
* * library . This does NOT imply that all of Samba is released
* * under the LGPL
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 3 of the License , or ( at your option ) any later version .
This library 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
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "ldb_module.h"
# include "lib/cmdline/popt_common.h"
# include "auth/gensec/gensec.h"
# include "auth/auth.h"
# include "param/param.h"
# include "dsdb/samdb/samdb.h"
# include "ldb_wrap.h"
# include "popt.h"
/*
work out the length of a popt array
*/
static unsigned calculate_popt_array_length ( struct poptOption * opts )
{
unsigned i ;
struct poptOption zero_opt = { NULL } ;
for ( i = 0 ; memcmp ( & zero_opt , & opts [ i ] , sizeof ( zero_opt ) ) ! = 0 ; i + + ) ;
return i ;
}
static struct poptOption cmdline_extensions [ ] = {
POPT_COMMON_SAMBA
POPT_COMMON_CREDENTIALS
POPT_COMMON_CONNECTION
POPT_COMMON_VERSION
{ NULL }
} ;
/*
called to register additional command line options
*/
static int extensions_hook ( struct ldb_context * ldb , enum ldb_module_hook_type t )
{
switch ( t ) {
case LDB_MODULE_HOOK_CMDLINE_OPTIONS : {
unsigned len1 , len2 ;
2010-11-02 02:41:28 +03:00
struct poptOption * * popt_options = ldb_module_popt_options ( ldb ) ;
2010-11-01 10:43:46 +03:00
struct poptOption * new_array ;
2010-11-02 02:41:28 +03:00
len1 = calculate_popt_array_length ( * popt_options ) ;
2010-11-01 10:43:46 +03:00
len2 = calculate_popt_array_length ( cmdline_extensions ) ;
new_array = talloc_array ( NULL , struct poptOption , len1 + len2 + 1 ) ;
if ( NULL = = new_array ) {
return ldb_oom ( ldb ) ;
}
2010-11-02 02:41:28 +03:00
memcpy ( new_array , * popt_options , len1 * sizeof ( struct poptOption ) ) ;
2010-11-01 10:43:46 +03:00
memcpy ( new_array + len1 , cmdline_extensions , ( 1 + len2 ) * sizeof ( struct poptOption ) ) ;
2010-11-02 02:41:28 +03:00
( * popt_options ) = new_array ;
2010-11-01 10:43:46 +03:00
return LDB_SUCCESS ;
}
case LDB_MODULE_HOOK_CMDLINE_PRECONNECT : {
int r = ldb_register_samba_handlers ( ldb ) ;
if ( r ! = LDB_SUCCESS ) {
return ldb_operr ( ldb ) ;
}
2011-06-06 08:58:28 +04:00
gensec_init ( ) ;
2010-11-01 10:43:46 +03:00
if ( ldb_set_opaque ( ldb , " sessionInfo " , system_session ( cmdline_lp_ctx ) ) ) {
return ldb_operr ( ldb ) ;
}
if ( ldb_set_opaque ( ldb , " credentials " , cmdline_credentials ) ) {
return ldb_operr ( ldb ) ;
}
if ( ldb_set_opaque ( ldb , " loadparm " , cmdline_lp_ctx ) ) {
return ldb_operr ( ldb ) ;
}
ldb_set_utf8_fns ( ldb , NULL , wrap_casefold ) ;
break ;
}
case LDB_MODULE_HOOK_CMDLINE_POSTCONNECT :
/* get the domain SID into the cache for SDDL processing */
samdb_domain_sid ( ldb ) ;
break ;
}
return LDB_SUCCESS ;
}
/*
initialise the module
*/
_PUBLIC_ int ldb_samba_extensions_init ( const char * ldb_version )
{
ldb_register_hook ( extensions_hook ) ;
return LDB_SUCCESS ;
}