2007-11-29 17:08:27 +03:00
/*
Unix SMB / CIFS implementation .
TDB wrap functions
Copyright ( C ) Andrew Tridgell 2004
Copyright ( C ) Jelmer Vernooij < jelmer @ samba . org > 2007
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 3 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 , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
2008-09-16 17:16:31 +04:00
# include "../tdb/include/tdb.h"
2008-10-11 23:31:42 +04:00
# include "../lib/util/dlinklist.h"
2007-11-29 17:08:27 +03:00
# include "tdb_wrap.h"
# include "tdb.h"
static struct tdb_wrap * tdb_list ;
/* destroy the last connection to a tdb */
static int tdb_wrap_destructor ( struct tdb_wrap * w )
{
tdb_close ( w - > tdb ) ;
DLIST_REMOVE ( tdb_list , w ) ;
return 0 ;
}
/*
Log tdb messages via DEBUG ( ) .
*/
static void tdb_wrap_log ( TDB_CONTEXT * tdb , enum tdb_debug_level level ,
const char * format , . . . ) PRINTF_ATTRIBUTE ( 3 , 4 ) ;
static void tdb_wrap_log ( TDB_CONTEXT * tdb , enum tdb_debug_level level ,
const char * format , . . . )
{
va_list ap ;
char * ptr = NULL ;
2008-10-11 22:44:19 +04:00
int dl ;
2007-11-29 17:08:27 +03:00
va_start ( ap , format ) ;
vasprintf ( & ptr , format , ap ) ;
va_end ( ap ) ;
switch ( level ) {
case TDB_DEBUG_FATAL :
2008-10-11 22:44:19 +04:00
dl = 0 ;
2007-11-29 17:08:27 +03:00
break ;
case TDB_DEBUG_ERROR :
2008-10-11 22:44:19 +04:00
dl = 1 ;
2007-11-29 17:08:27 +03:00
break ;
case TDB_DEBUG_WARNING :
2008-10-11 22:44:19 +04:00
dl = 2 ;
2007-11-29 17:08:27 +03:00
break ;
case TDB_DEBUG_TRACE :
2008-10-11 22:44:19 +04:00
dl = 5 ;
2007-11-29 17:08:27 +03:00
break ;
default :
2008-10-11 22:44:19 +04:00
dl = 0 ;
2007-11-29 17:08:27 +03:00
}
if ( ptr ! = NULL ) {
const char * name = tdb_name ( tdb ) ;
2008-10-11 22:44:19 +04:00
DEBUG ( dl , ( " tdb(%s): %s " , name ? name : " unnamed " , ptr ) ) ;
2007-11-29 17:08:27 +03:00
free ( ptr ) ;
}
}
/*
wrapped connection to a tdb database
to close just talloc_free ( ) the tdb_wrap pointer
*/
struct tdb_wrap * tdb_wrap_open ( TALLOC_CTX * mem_ctx ,
const char * name , int hash_size , int tdb_flags ,
int open_flags , mode_t mode )
{
struct tdb_wrap * w ;
struct tdb_logging_context log_ctx ;
log_ctx . log_fn = tdb_wrap_log ;
for ( w = tdb_list ; w ; w = w - > next ) {
if ( strcmp ( name , w - > name ) = = 0 ) {
return talloc_reference ( mem_ctx , w ) ;
}
}
w = talloc ( mem_ctx , struct tdb_wrap ) ;
if ( w = = NULL ) {
return NULL ;
}
w - > name = talloc_strdup ( w , name ) ;
w - > tdb = tdb_open_ex ( name , hash_size , tdb_flags ,
open_flags , mode , & log_ctx , NULL ) ;
if ( w - > tdb = = NULL ) {
talloc_free ( w ) ;
return NULL ;
}
talloc_set_destructor ( w , tdb_wrap_destructor ) ;
DLIST_ADD ( tdb_list , w ) ;
return w ;
}