2004-03-31 06:45:39 +00:00
/*
ldb database library
Copyright ( C ) Andrew Tridgell 2004
* * 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 2 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 , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
/*
* Name : ldb
*
* Component : ldbsearch
*
* Description : utility for ldb search - modelled on ldapsearch
*
* Author : Andrew Tridgell
*/
# include "includes.h"
2004-11-16 09:00:52 +00:00
# include "ldb/include/ldb.h"
2004-12-04 10:14:03 +00:00
# include "ldb/include/ldb_private.h"
2005-06-18 07:42:21 +00:00
# include "ldb/tools/cmdline.h"
2004-04-10 20:18:22 +00:00
2005-02-10 05:09:35 +00:00
# ifdef _SAMBA_BUILD_
# include "system/filesys.h"
# endif
2004-04-10 20:18:22 +00:00
static void usage ( void )
{
printf ( " Usage: ldbsearch <options> <expression> <attrs...> \n " ) ;
printf ( " Options: \n " ) ;
printf ( " -H ldb_url choose the database (or $LDB_URL) \n " ) ;
printf ( " -s base|sub|one choose search scope \n " ) ;
printf ( " -b basedn choose baseDN \n " ) ;
2004-05-03 14:51:26 +00:00
printf ( " -i read search expressions from stdin \n " ) ;
2005-06-04 17:13:43 +00:00
printf ( " -S sort returned attributes \n " ) ;
2004-11-15 14:16:10 +00:00
printf ( " -o options pass options like modules to activate \n " ) ;
printf ( " e.g: -o modules:timestamps \n " ) ;
2004-04-10 20:18:22 +00:00
exit ( 1 ) ;
}
2004-03-31 06:45:39 +00:00
2005-06-09 14:50:32 +00:00
static int do_compare_msg ( struct ldb_message * * el1 ,
struct ldb_message * * el2 )
{
return ldb_dn_cmp ( ( * el1 ) - > dn , ( * el2 ) - > dn ) ;
}
2004-05-06 04:40:15 +00:00
static int do_search ( struct ldb_context * ldb ,
const char * basedn ,
int scope ,
2005-06-04 17:13:43 +00:00
int sort_attribs ,
2004-05-06 04:40:15 +00:00
const char * expression ,
2004-05-07 23:54:41 +00:00
const char * const * attrs )
2004-05-03 14:51:26 +00:00
{
int ret , i ;
struct ldb_message * * msgs ;
ret = ldb_search ( ldb , basedn , scope , expression , attrs , & msgs ) ;
if ( ret = = - 1 ) {
printf ( " search failed - %s \n " , ldb_errstring ( ldb ) ) ;
2004-05-06 04:40:15 +00:00
return - 1 ;
2004-05-03 14:51:26 +00:00
}
printf ( " # returned %d records \n " , ret ) ;
2005-06-09 14:50:32 +00:00
if ( sort_attribs ) {
qsort ( msgs , ret , sizeof ( struct ldb_message * ) ,
( comparison_fn_t ) do_compare_msg ) ;
}
2004-05-03 14:51:26 +00:00
for ( i = 0 ; i < ret ; i + + ) {
struct ldb_ldif ldif ;
printf ( " # record %d \n " , i + 1 ) ;
ldif . changetype = LDB_CHANGETYPE_NONE ;
2005-01-02 07:49:29 +00:00
ldif . msg = msgs [ i ] ;
2004-05-03 14:51:26 +00:00
2005-06-04 17:13:43 +00:00
if ( sort_attribs ) {
/*
* Ensure attributes are always returned in the same
* order . For testing , this makes comparison of old
* vs . new much easier .
*/
ldb_msg_sort_elements ( ldif . msg ) ;
}
2004-05-20 13:25:06 +00:00
ldb_ldif_write_file ( ldb , stdout , & ldif ) ;
2004-05-03 14:51:26 +00:00
}
if ( ret > 0 ) {
2005-04-25 12:46:18 +00:00
ret = talloc_free ( msgs ) ;
2004-05-03 14:51:26 +00:00
if ( ret = = - 1 ) {
2005-04-25 12:46:18 +00:00
fprintf ( stderr , " talloc_free failed \n " ) ;
2004-05-03 14:51:26 +00:00
exit ( 1 ) ;
}
}
2004-05-06 04:40:15 +00:00
return 0 ;
2004-05-03 14:51:26 +00:00
}
2005-06-18 07:42:21 +00:00
int main ( int argc , const char * * argv )
2004-03-31 06:45:39 +00:00
{
2004-04-10 20:18:22 +00:00
struct ldb_context * ldb ;
2004-05-07 23:54:41 +00:00
const char * const * attrs = NULL ;
2005-06-18 07:42:21 +00:00
struct ldb_cmdline * options ;
int ret ;
2005-06-04 17:13:43 +00:00
2005-06-18 07:42:21 +00:00
ldb = ldb_init ( NULL ) ;
2004-03-31 06:45:39 +00:00
2005-06-18 07:42:21 +00:00
options = ldb_cmdline_process ( ldb , argc , argv , usage ) ;
if ( options - > argc < 1 & & ! options - > interactive ) {
2004-04-10 20:18:22 +00:00
usage ( ) ;
2004-03-31 06:45:39 +00:00
exit ( 1 ) ;
}
2005-06-18 07:42:21 +00:00
if ( options - > argc > 1 ) {
attrs = ( const char * const * ) ( options - > argv + 1 ) ;
2004-03-31 06:45:39 +00:00
}
2005-06-18 07:42:21 +00:00
ret = ldb_connect ( ldb , options - > url , LDB_FLG_RDONLY , options - > options ) ;
if ( ret ! = 0 ) {
fprintf ( stderr , " Failed to connect to %s - %s \n " ,
options - > url , ldb_errstring ( ldb ) ) ;
talloc_free ( ldb ) ;
2004-03-31 06:45:39 +00:00
exit ( 1 ) ;
}
2005-06-18 07:42:21 +00:00
if ( options - > interactive ) {
2004-05-03 14:51:26 +00:00
char line [ 1024 ] ;
while ( fgets ( line , sizeof ( line ) , stdin ) ) {
2005-06-18 07:42:21 +00:00
if ( do_search ( ldb , options - > basedn ,
options - > scope , options - > sorted , line , attrs ) = = - 1 ) {
2004-05-06 04:40:15 +00:00
ret = - 1 ;
}
2004-03-31 06:45:39 +00:00
}
2004-05-03 14:51:26 +00:00
} else {
2005-06-18 07:42:21 +00:00
ret = do_search ( ldb , options - > basedn , options - > scope , options - > sorted ,
options - > argv [ 0 ] , attrs ) ;
2004-03-31 06:45:39 +00:00
}
2005-02-27 11:35:47 +00:00
talloc_free ( ldb ) ;
2004-05-06 04:40:15 +00:00
return ret ;
2004-03-31 06:45:39 +00:00
}