r7709: - convert ldb to use popt, so that it can interact with the samba
authorAndrew Tridgell <tridge@samba.org>
Sat, 18 Jun 2005 07:42:21 +0000 (07:42 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:18:24 +0000 (13:18 -0500)
  cmdline credentials code (which will be done soon)

- added a ldb_init() call, and changed ldb_connect() to take a ldb
  context. This allows for much better error handling in
  ldb_connect(), and also made the popt conversion easier

- fixed up all the existing backends with the new syntax

- improved error handling in *_connect()

- fixed a crash bug in the new case_fold_required() code

- ensured that ltdb_rename() and all ltdb_search() paths get the read lock

- added a ldb_oom() macro to make it easier to report out of memory
  situations in ldb code

23 files changed:
source/lib/ldb/Makefile.in
source/lib/ldb/common/ldb.c
source/lib/ldb/common/ldb_utf8.c
source/lib/ldb/common/util.c
source/lib/ldb/config.mk
source/lib/ldb/configure.in
source/lib/ldb/include/ldb.h
source/lib/ldb/include/ldb_private.h
source/lib/ldb/ldb_ildap/ldb_ildap.c
source/lib/ldb/ldb_ldap/ldb_ldap.c
source/lib/ldb/ldb_sqlite3/ldb_sqlite3.c
source/lib/ldb/ldb_tdb/ldb_search.c
source/lib/ldb/ldb_tdb/ldb_tdb.c
source/lib/ldb/ldb_tdb/ldb_tdb.h
source/lib/ldb/tests/test-extended.sh
source/lib/ldb/tests/test-generic.sh
source/lib/ldb/tools/ldbadd.c
source/lib/ldb/tools/ldbdel.c
source/lib/ldb/tools/ldbedit.c
source/lib/ldb/tools/ldbmodify.c
source/lib/ldb/tools/ldbrename.c
source/lib/ldb/tools/ldbsearch.c
source/lib/ldb/tools/ldbtest.c

index 88935b6f3a6c5efccd0a168c89cbb07afab9e389..a633320d06210c661d2755b02a50900213b04c43 100644 (file)
@@ -39,7 +39,7 @@ endif
 
 CFLAGS = $(CFLAGS1) $(GCOV_FLAGS) @CFLAGS@
 
-LIB_FLAGS=-Llib -lldb $(LDAP_LIBS) $(SQLITE3_LIBS) $(GCOV_LIBS)
+LIB_FLAGS=-Llib -lldb $(LDAP_LIBS) $(SQLITE3_LIBS) $(GCOV_LIBS) @LIBS@
 
 TDB_OBJ=$(TDBDIR)/common/tdb.o $(TDBDIR)/common/spinlock.o
 TALLOC_OBJ=$(TALLOCDIR)/talloc.o
@@ -49,7 +49,7 @@ LDB_TDB_OBJ=ldb_tdb/ldb_match.o ldb_tdb/ldb_tdb.o \
        ldb_tdb/ldb_cache.o
 
 
-COMMON_OBJ=common/ldb.o common/ldb_ldif.o common/util.o \
+COMMON_OBJ=common/ldb.o common/ldb_ldif.o \
           common/ldb_parse.o common/ldb_msg.o common/ldb_utf8.o \
           common/ldb_debug.o common/ldb_modules.o \
           common/ldb_explode_dn.o
@@ -80,26 +80,26 @@ bin:
 
 lib/libldb.a: $(OBJS)
 
-bin/ldbadd: tools/ldbadd.o $(LIBS)
-       $(CC) -o bin/ldbadd tools/ldbadd.o $(LIB_FLAGS)
+bin/ldbadd: tools/ldbadd.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbadd tools/ldbadd.o tools/cmdline.o $(LIB_FLAGS)
 
-bin/ldbsearch: tools/ldbsearch.o $(LIBS)
-       $(CC) -o bin/ldbsearch tools/ldbsearch.o $(LIB_FLAGS)
+bin/ldbsearch: tools/ldbsearch.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbsearch tools/ldbsearch.o tools/cmdline.o $(LIB_FLAGS)
 
-bin/ldbdel: tools/ldbdel.o $(LIBS)
-       $(CC) -o bin/ldbdel tools/ldbdel.o $(LIB_FLAGS)
+bin/ldbdel: tools/ldbdel.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbdel tools/ldbdel.o tools/cmdline.o $(LIB_FLAGS)
 
-bin/ldbmodify: tools/ldbmodify.o $(LIBS)
-       $(CC) -o bin/ldbmodify tools/ldbmodify.o $(LIB_FLAGS)
+bin/ldbmodify: tools/ldbmodify.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbmodify tools/ldbmodify.o tools/cmdline.o $(LIB_FLAGS)
 
-bin/ldbedit: tools/ldbedit.o $(LIBS)
-       $(CC) -o bin/ldbedit tools/ldbedit.o $(LIB_FLAGS)
+bin/ldbedit: tools/ldbedit.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbedit tools/ldbedit.o tools/cmdline.o $(LIB_FLAGS)
 
-bin/ldbrename: tools/ldbrename.o $(LIBS)
-       $(CC) -o bin/ldbrename tools/ldbrename.o $(LIB_FLAGS)
+bin/ldbrename: tools/ldbrename.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbrename tools/ldbrename.o tools/cmdline.o $(LIB_FLAGS)
 
-bin/ldbtest: tools/ldbtest.o $(LIBS)
-       $(CC) -o bin/ldbtest tools/ldbtest.o $(LIB_FLAGS)
+bin/ldbtest: tools/ldbtest.o tools/cmdline.o $(LIBS)
+       $(CC) -o bin/ldbtest tools/ldbtest.o tools/cmdline.o $(LIB_FLAGS)
 
 .SUFFIXES: .1 .2 .3 .yo
 
@@ -126,7 +126,7 @@ distclean:  clean
 etags:
        etags */*.[ch]
 
-test-tdb:
+test-tdb: $(BINS)
        @echo "STARTING TDB BACKEND TEST"
        tests/test-tdb.sh
 
index 2d0d09de3ecfebb85c2710e4616436d3da6d396a..d2dbac95eaf7bdfc62cc15202352322f8ed2246a 100644 (file)
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
 
+/* 
+   initialise a ldb context
+   The mem_ctx is optional
+*/
+struct ldb_context *ldb_init(void *mem_ctx)
+{
+       struct ldb_context *ldb = talloc_zero(mem_ctx, struct ldb_context);
+       return ldb;
+}
+
 /* 
  connect to a database. The URL can either be one of the following forms
    ldb://path
    the options are passed uninterpreted to the backend, and are
    backend specific
 */
-struct ldb_context *ldb_connect(const char *url, unsigned int flags,
-                               const char *options[])
+int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[])
 {
-       struct ldb_context *ldb_ctx = NULL;
+       int ret;
 
        if (strncmp(url, "tdb:", 4) == 0 ||
            strchr(url, ':') == NULL) {
-               ldb_ctx = ltdb_connect(url, flags, options);
+               ret = ltdb_connect(ldb, url, flags, options);
        }
 
 #if HAVE_ILDAP
-       if (strncmp(url, "ldap", 4) == 0) {
-               ldb_ctx = ildb_connect(url, flags, options);
+       else if (strncmp(url, "ldap", 4) == 0) {
+               ret = ildb_connect(ldb, url, flags, options);
        }
 #elif HAVE_LDAP
-       if (strncmp(url, "ldap", 4) == 0) {
-               ldb_ctx = lldb_connect(url, flags, options);
+       else if (strncmp(url, "ldap", 4) == 0) {
+               ret = lldb_connect(ldb, url, flags, options);
        }
 #endif
-
 #if HAVE_SQLITE3
-       if (strncmp(url, "sqlite:", 7) == 0) {
+       else if (strncmp(url, "sqlite:", 7) == 0) {
                ldb_ctx = lsqlite3_connect(url, flags, options);
        }
 #endif
+       else {
+               ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to find backend for '%s'", url);
+               return -1;
+       }
 
-
-       if (!ldb_ctx) {
-               errno = EINVAL;
-               return NULL;
+       if (ret != 0) {
+               ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to connect to '%s'", url);
+               return ret;
        }
 
-       if (ldb_load_modules(ldb_ctx, options) != 0) {
-               talloc_free(ldb_ctx);
-               errno = EINVAL;
-               return NULL;
+       if (ldb_load_modules(ldb, options) != 0) {
+               ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to load modules for '%s'", url);
+               return -1;
        }
 
-       return ldb_ctx;
+       return 0;
 }
 
 /*
index 35249c4b70801c0221aba02080389c2a4a80a353..ae35ad81b62c43ed6a3707a6e07af480c054e754 100644 (file)
@@ -135,7 +135,7 @@ char *ldb_dn_fold(void * mem_ctx,
                }
                if (*value == 0) goto failed;
 
-               case_fold_required = (* case_fold_attr_fn)(user_data, attr);
+               case_fold_required = case_fold_attr_fn(user_data, attr);
 
                attr = ldb_casefold(tmp_ctx, attr);
                if (attr == NULL) goto failed;
index c2fd72acd1fdf14a40ce54f10108633c1e4072c7..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,57 +0,0 @@
-/* 
-   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: ldb utility functions
- *
- *  Description: miscellanous utility functions for ldb
- *
- *  Author: Andrew Tridgell
- */
-
-#include "includes.h"
-#include "ldb/include/ldb.h"
-#include "ldb/include/ldb_private.h"
-
-
-/*
-  common code for parsing -o options in ldb tools
-*/
-const char **ldb_options_parse(const char **options, int *ldbopts, const char *arg)
-{
-       if (*ldbopts == 0) {
-               options = malloc(sizeof(char *) * 2);
-       } else {
-               options = realloc(options, sizeof(char *)*((*ldbopts)+2));
-       }
-       if (options == NULL) {
-               fprintf(stderr, "Out of memory in options parsing!\n");
-               exit(-1);
-       }
-       options[(*ldbopts)++] = arg;
-       options[*ldbopts] = NULL;
-       return options;
-}
index 05255fdec573c47d13c34ab27eacb156b56a1b6f..4d4dc121e19e70c3c025fc9fd07ad4fd5bab6c32 100644 (file)
@@ -91,13 +91,22 @@ REQUIRED_SUBSYSTEMS = \
 # End LIBRARY LIBLDB
 ################################################
 
+################################################
+# Start SUBSYSTEM LIBLDB_CMDLINE
+[SUBSYSTEM::LIBLDB_CMDLINE]
+OBJ_FILES= \
+               lib/ldb/tools/cmdline.o
+REQUIRED_SUBSYSTEMS = LIBLDB LIBCMDLINE
+# End SUBSYSTEM LIBLDB_CMDLINE
+################################################
+
 ################################################
 # Start BINARY ldbadd
 [BINARY::ldbadd]
 OBJ_FILES= \
                lib/ldb/tools/ldbadd.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE
 # End BINARY ldbadd
 ################################################
 
@@ -107,7 +116,7 @@ REQUIRED_SUBSYSTEMS = \
 OBJ_FILES= \
                lib/ldb/tools/ldbdel.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE
 # End BINARY ldbdel
 ################################################
 
@@ -117,7 +126,7 @@ REQUIRED_SUBSYSTEMS = \
 OBJ_FILES= \
                lib/ldb/tools/ldbmodify.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE
 # End BINARY ldbmodify
 ################################################
 
@@ -127,7 +136,7 @@ REQUIRED_SUBSYSTEMS = \
 OBJ_FILES= \
                lib/ldb/tools/ldbsearch.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE 
 # End BINARY ldbsearch
 ################################################
 
@@ -137,7 +146,7 @@ REQUIRED_SUBSYSTEMS = \
 OBJ_FILES= \
                lib/ldb/tools/ldbedit.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE
 # End BINARY ldbedit
 ################################################
 
@@ -147,7 +156,7 @@ REQUIRED_SUBSYSTEMS = \
 OBJ_FILES= \
                lib/ldb/tools/ldbrename.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE
 # End BINARY ldbrename
 ################################################
 
@@ -157,6 +166,6 @@ REQUIRED_SUBSYSTEMS = \
 OBJ_FILES= \
                lib/ldb/tools/ldbtest.o
 REQUIRED_SUBSYSTEMS = \
-               LIBLDB
+               LIBLDB_CMDLINE
 # End BINARY ldbtest
 ################################################
index fcb87cdb3ae15d0174e228ffb99fcdda1117eec6..7ae339c1038564d733d4d423eb0b3a29e2dba0e3 100644 (file)
@@ -23,6 +23,9 @@ AC_PATH_PROG(XSLTPROC,xsltproc)
 AC_PATH_PROG(GCOV,gcov)
 AC_CHECK_HEADERS(stdint.h)
 AC_CONFIG_HEADER(include/config.h)
+
+AC_CHECK_LIB(popt, poptGetContext)
+
 sinclude(ldap.m4)
 WITH_LDAP=$with_ldap_support
 AC_SUBST(WITH_LDAP)
index fabaec5da22ddc71d36c4363259f9b883777c8fe..ecfa77f436cbcf0e67399769edff263b4586b22d 100644 (file)
@@ -184,6 +184,10 @@ struct ldb_parse_tree *ldb_parse_tree(void *mem_ctx, const char *s);
 char *ldb_filter_from_tree(void *mem_ctx, struct ldb_parse_tree *tree);
 char *ldb_binary_encode(void *ctx, struct ldb_val val);
 
+/*
+  initialise a ldb context
+*/
+struct ldb_context *ldb_init(void *mem_ctx);
 
 /* 
  connect to a database. The URL can either be one of the following forms
@@ -195,8 +199,7 @@ char *ldb_binary_encode(void *ctx, struct ldb_val val);
    the options are passed uninterpreted to the backend, and are
    backend specific
 */
-struct ldb_context *ldb_connect(const char *url, unsigned int flags,
-                               const char *options[]);
+int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]);
 
 /*
   search the database given a LDAP-like search expression
index 4acdd543f20b9381fb0353f4a0462da7425643ae..76a43cdbc228264531437474a62c08b5c07ecbea 100644 (file)
@@ -86,6 +86,11 @@ typedef struct ldb_module *(*ldb_module_init_function)(struct ldb_context *ldb,
 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
 #endif
 
+/*
+  simplify out of memory handling
+*/
+#define ldb_oom(ldb) ldb_debug(ldb, LDB_DEBUG_FATAL, "ldb out of memory at %s:%d\n", __FILE__, __LINE__)
+
 /* The following definitions come from lib/ldb/common/ldb_modules.c  */
 
 int ldb_load_modules(struct ldb_context *ldb, const char *options[]);
@@ -114,21 +119,21 @@ void ldb_debug(struct ldb_context *ldb, enum ldb_debug_level level, const char *
 char *ldb_base64_encode(struct ldb_context *ldb, const char *buf, int len);
 int ldb_should_b64_encode(const struct ldb_val *val);
 
-struct ldb_context *ltdb_connect(const char *url, 
-                                unsigned int flags, 
-                                const char *options[]);
-struct ldb_context *lldb_connect(const char *url, 
-                                unsigned int flags, 
-                                const char *options[]);
-struct ldb_context *ildb_connect(const char *url, 
-                                unsigned int flags, 
-                                const char *options[]);
-struct ldb_context *lsqlite3_connect(const char *url, 
-                                     unsigned int flags, 
-                                     const char *options[]);
+int ltdb_connect(struct ldb_context *ldb, const char *url, 
+                unsigned int flags, 
+                const char *options[]);
+int lldb_connect(struct ldb_context *ldb, const char *url, 
+                unsigned int flags, 
+                const char *options[]);
+int ildb_connect(struct ldb_context *ldb,
+                const char *url, 
+                unsigned int flags, 
+                const char *options[]);
+int lsqlite3_connect(struct ldb_context *ldb,
+                    const char *url, 
+                    unsigned int flags, 
+                    const char *options[]);
 struct ldb_module *timestamps_module_init(struct ldb_context *ldb, const char *options[]);
 struct ldb_module *schema_module_init(struct ldb_context *ldb, const char *options[]);
 
-const char **ldb_options_parse(const char **options, int *ldbopts, const char *arg);
-
 #endif
index c35d9de6b104d81a7a37614739ff4d1315bddbda..aa0efee481048d125b5360f2b54f9bbe8397db1e 100644 (file)
@@ -349,42 +349,34 @@ static const struct ldb_module_ops ildb_ops = {
 /*
   connect to the database
 */
-struct ldb_context *ildb_connect(const char *url, 
-                                unsigned int flags, 
-                                const char *options[])
+int ildb_connect(struct ldb_context *ldb, const char *url, 
+                unsigned int flags, const char *options[])
 {
-       struct ldb_context *ldb = NULL;
        struct ildb_private *ildb = NULL;
        NTSTATUS status;
 
-       ldb = talloc(NULL, struct ldb_context);
-       if (!ldb) {
-               errno = ENOMEM;
-               goto failed;
-       }
-
-       ldb->debug_ops.debug = NULL;
-
        ildb = talloc(ldb, struct ildb_private);
        if (!ildb) {
-               errno = ENOMEM;
+               ldb_oom(ldb);
                goto failed;
        }
 
        ildb->ldap = ldap_new_connection(ildb, NULL);
        if (!ildb->ldap) {
-               errno = ENOMEM;
+               ldb_oom(ldb);
                goto failed;
        }
 
        status = ldap_connect(ildb->ldap, url);
        if (!NT_STATUS_IS_OK(status)) {
+               ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to connect to ldap URL '%s' - %s\n",
+                         url, ldap_errstr(ildb->ldap, status));
                goto failed;
        }
 
        ldb->modules = talloc(ldb, struct ldb_module);
        if (!ldb->modules) {
-               errno = ENOMEM;
+               ldb_oom(ldb);
                goto failed;
        }
        ldb->modules->ldb = ldb;
@@ -392,10 +384,10 @@ struct ldb_context *ildb_connect(const char *url,
        ldb->modules->private_data = ildb;
        ldb->modules->ops = &ildb_ops;
 
-       return ldb;
+       return 0;
 
 failed:
-       talloc_free(ldb);
-       return NULL;
+       talloc_free(ildb);
+       return -1;
 }
 
index 16beed58f8bd3f971cce81db3064992dc2950f09..d7f589e2e5413137d6a37c6db65f431afee0408f 100644 (file)
 #include "ldb/include/ldb_private.h"
 #include "ldb/ldb_ldap/ldb_ldap.h"
 
-#if 0
-/*
-  we don't need this right now, but will once we add some backend 
-  options
-*/
-
-/*
-  find an option in an option list (a null terminated list of strings)
-
-  this assumes the list is short. If it ever gets long then we really
-  should do this in some smarter way
- */
-static const char *lldb_option_find(const struct lldb_private *lldb, const char *name)
-{
-       int i;
-       size_t len = strlen(name);
-
-       if (!lldb->options) return NULL;
-
-       for (i=0;lldb->options[i];i++) {                
-               if (strncmp(lldb->options[i], name, len) == 0 &&
-                   lldb->options[i][len] == '=') {
-                       return &lldb->options[i][len+1];
-               }
-       }
-
-       return NULL;
-}
-#endif
-
 /*
   rename a record
 */
@@ -494,25 +464,17 @@ static int lldb_destructor(void *p)
 /*
   connect to the database
 */
-struct ldb_context *lldb_connect(const char *url, 
-                                unsigned int flags, 
-                                const char *options[])
+int lldb_connect(struct ldb_context *ldb,
+                const char *url, 
+                unsigned int flags, 
+                const char *options[])
 {
-       struct ldb_context *ldb = NULL;
        struct lldb_private *lldb = NULL;
-       int i, version = 3;
-
-       ldb = talloc(NULL, struct ldb_context);
-       if (!ldb) {
-               errno = ENOMEM;
-               goto failed;
-       }
-
-       ldb->debug_ops.debug = NULL;
+       int version = 3;
 
        lldb = talloc(ldb, struct lldb_private);
        if (!lldb) {
-               errno = ENOMEM;
+               ldb_oom(ldb);
                goto failed;
        }
 
@@ -521,6 +483,8 @@ struct ldb_context *lldb_connect(const char *url,
 
        lldb->last_rc = ldap_initialize(&lldb->ldap, url);
        if (lldb->last_rc != LDAP_SUCCESS) {
+               ldb_debug(ldb, LDB_DEBUG_FATAL, "ldap_initialize failed for URL '%s' - %s\n",
+                         url, ldap_err2string(lldb->last_rc));
                goto failed;
        }
 
@@ -528,12 +492,13 @@ struct ldb_context *lldb_connect(const char *url,
 
        lldb->last_rc = ldap_set_option(lldb->ldap, LDAP_OPT_PROTOCOL_VERSION, &version);
        if (lldb->last_rc != LDAP_SUCCESS) {
-               goto failed;
+               ldb_debug(ldb, LDB_DEBUG_FATAL, "ldap_set_option failed - %s\n",
+                         ldap_err2string(lldb->last_rc));
        }
 
        ldb->modules = talloc(ldb, struct ldb_module);
        if (!ldb->modules) {
-               errno = ENOMEM;
+               ldb_oom(ldb);
                goto failed;
        }
        ldb->modules->ldb = ldb;
@@ -541,29 +506,10 @@ struct ldb_context *lldb_connect(const char *url,
        ldb->modules->private_data = lldb;
        ldb->modules->ops = &lldb_ops;
 
-       if (options) {
-               /* take a copy of the options array, so we don't have to rely
-                  on the caller keeping it around (it might be dynamic) */
-               for (i=0;options[i];i++) ;
-
-               lldb->options = talloc_array(lldb, char *, i+1);
-               if (!lldb->options) {
-                       goto failed;
-               }
-               
-               for (i=0;options[i];i++) {
-                       lldb->options[i+1] = NULL;
-                       lldb->options[i] = talloc_strdup(lldb->options, options[i]);
-                       if (!lldb->options[i]) {
-                               goto failed;
-                       }
-               }
-       }
-
-       return ldb;
+       return 0;
 
 failed:
-       talloc_free(ldb);
-       return NULL;
+       talloc_free(lldb);
+       return -1;
 }
 
index 51830db94cae4647f204cb13f7f50bd86905e281..3d3604304468c2a63af0451c3b34e4bdbb6ed37c 100644 (file)
@@ -216,21 +216,16 @@ static const struct ldb_module_ops lsqlite3_ops = {
 /*
  * connect to the database
  */
-struct ldb_context *
-lsqlite3_connect(const char *url, 
-                 unsigned int flags, 
-                 const char *options[])
+int lsqlite3_connect(struct ldb_context *ldb,
+                    const char *url, 
+                    unsigned int flags, 
+                    const char *options[])
 {
        int                         i;
         int                         ret;
        struct ldb_context *        ldb = NULL;
        struct lsqlite3_private *   lsqlite3 = NULL;
         
-       ldb = talloc(NULL, struct ldb_context);
-       if (!ldb) {
-               goto failed;
-       }
-        
        lsqlite3 = talloc(ldb, struct lsqlite3_private);
        if (!lsqlite3) {
                goto failed;
@@ -279,14 +274,14 @@ lsqlite3_connect(const char *url,
                }
        }
         
-       return ldb;
+       return 0;
         
 failed:
         if (lsqlite3->sqlite != NULL) {
                 (void) sqlite3_close(lsqlite3->sqlite);
         }
-       talloc_free(ldb);
-       return NULL;
+       talloc_free(lsqlite3);
+       return -1;
 }
 
 
@@ -1204,7 +1199,9 @@ destructor(void *p)
 {
        struct lsqlite3_private *   lsqlite3 = p;
         
-        (void) sqlite3_close(lsqlite3->sqlite);
+       if (lsqlite3->sqlite) {
+               sqlite3_close(lsqlite3->sqlite);
+       }
        return 0;
 }
 
index 3644d046e095c3df3253ba484d5f1b0d8b103598..d6e7d66f685e0ca17cd24020a5f6f750f094b2bc 100644 (file)
@@ -272,44 +272,63 @@ int ltdb_search_dn1(struct ldb_module *module, const char *dn, struct ldb_messag
 /*
   search the database for a single simple dn
 */
-int ltdb_search_dn(struct ldb_module *module, const char *dn,
-                  const char * const attrs[], struct ldb_message ***res)
+static int ltdb_search_dn(struct ldb_module *module, const char *dn,
+                         const char * const attrs[], struct ldb_message ***res)
 {
        struct ldb_context *ldb = module->ldb;
+       struct ltdb_private *ltdb = module->private_data;
        int ret;
        struct ldb_message *msg, *msg2;
 
+       *res = NULL;
+
+       if (ltdb_lock_read(module) != 0) {
+               return -1;
+       }
+
+       ltdb->last_err_string = NULL;
+
+       if (ltdb_cache_load(module) != 0) {
+               ltdb_unlock_read(module);
+               return -1;
+       }
+
        *res = talloc_array(ldb, struct ldb_message *, 2);
        if (! *res) {
-               return -1;              
+               goto failed;
        }
 
        msg = talloc(*res, struct ldb_message);
        if (msg == NULL) {
-               talloc_free(*res);
-               *res = NULL;
-               return -1;
+               goto failed;
        }
 
        ret = ltdb_search_dn1(module, dn, msg);
        if (ret != 1) {
                talloc_free(*res);
                *res = NULL;
-               return ret;
+               ltdb_unlock_read(module);
+               return 0;
        }
 
        msg2 = ltdb_pull_attrs(module, msg, attrs);
 
        talloc_free(msg);
-
        if (!msg2) {
-               return -1;              
+               goto failed;
        }
 
        (*res)[0] = talloc_steal(*res, msg2);
        (*res)[1] = NULL;
 
+       ltdb_unlock_read(module);
+
        return 1;
+
+failed:
+       talloc_free(*res);
+       ltdb_unlock_read(module);
+       return -1;
 }
 
 
@@ -508,7 +527,6 @@ int ltdb_search(struct ldb_module *module, const char *base,
        /* check if we are looking for a simple dn */
        if (scope == LDB_SCOPE_BASE && (expression == NULL || expression[0] == '\0')) {
                ret = ltdb_search_dn(module, base, attrs, res);
-               ltdb_unlock_read(module);
                return ret;
        }
 
index 6516787a5a41fb393e9e12e2c8cebcc5222505c7..596ede8a4e152a4bcf568d76deeecea28392469d 100644 (file)
@@ -49,9 +49,9 @@
 */
 static int ltdb_case_fold_attr_required(void * user_data, char *attr)
 {
-    struct ldb_module *module = user_data;
+       struct ldb_module *module = talloc_get_type(user_data, struct ldb_module);
 
-    return ltdb_attribute_flags(module, attr) & LTDB_FLAG_CASE_INSENSITIVE;
+       return ltdb_attribute_flags(module, attr) & LTDB_FLAG_CASE_INSENSITIVE;
 }
 
 /*
@@ -746,6 +746,11 @@ static int ltdb_rename(struct ldb_module *module, const char *olddn, const char
                return -1;
        }
 
+       if (ltdb_cache_load(module) != 0) {
+               ltdb_unlock(module, LDBLOCK);
+               return -1;
+       }
+
        msg = talloc(module, struct ldb_message);
        if (msg == NULL) {
                goto failed;
@@ -829,28 +834,19 @@ static int ltdb_destructor(void *p)
 /*
   connect to the database
 */
-struct ldb_context *ltdb_connect(const char *url, 
-                                unsigned int flags, 
-                                const char *options[])
+int ltdb_connect(struct ldb_context *ldb, const char *url, 
+                unsigned int flags, const char *options[])
 {
        const char *path;
        int tdb_flags, open_flags;
        struct ltdb_private *ltdb;
        TDB_CONTEXT *tdb;
-       struct ldb_context *ldb;
-
-       ldb = talloc_zero(NULL, struct ldb_context);
-       if (!ldb) {
-               errno = ENOMEM;
-               return NULL;
-       }
 
        /* parse the url */
        if (strchr(url, ':')) {
                if (strncmp(url, "tdb://", 6) != 0) {
-                       errno = EINVAL;
-                       talloc_free(ldb);
-                       return NULL;
+                       ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid tdb URL '%s'", url);
+                       return -1;
                }
                path = url+6;
        } else {
@@ -868,16 +864,15 @@ struct ldb_context *ltdb_connect(const char *url,
        /* note that we use quite a large default hash size */
        tdb = tdb_open(path, 10000, tdb_flags, open_flags, 0666);
        if (!tdb) {
-               talloc_free(ldb);
-               return NULL;
+               ldb_debug(ldb, LDB_DEBUG_ERROR, "Unable to open tdb '%s'", path);
+               return -1;
        }
 
        ltdb = talloc_zero(ldb, struct ltdb_private);
        if (!ltdb) {
                tdb_close(tdb);
-               talloc_free(ldb);
-               errno = ENOMEM;
-               return NULL;
+               ldb_oom(ldb);
+               return -1;
        }
 
        ltdb->tdb = tdb;
@@ -887,14 +882,14 @@ struct ldb_context *ltdb_connect(const char *url,
 
        ldb->modules = talloc(ldb, struct ldb_module);
        if (!ldb->modules) {
-               talloc_free(ldb);
-               errno = ENOMEM;
-               return NULL;
+               ldb_oom(ldb);
+               talloc_free(ltdb);
+               return -1;
        }
        ldb->modules->ldb = ldb;
        ldb->modules->prev = ldb->modules->next = NULL;
        ldb->modules->private_data = ltdb;
        ldb->modules->ops = &ltdb_ops;
 
-       return ldb;
+       return 0;
 }
index b77e02fba5a5ad714b606e405729e20e8229458a..6377092a214604793ade2d244f7ea80e37ff53eb 100644 (file)
@@ -91,8 +91,6 @@ int ltdb_has_wildcard(struct ldb_module *module, const char *attr_name,
                      const struct ldb_val *val);
 void ltdb_search_dn1_free(struct ldb_module *module, struct ldb_message *msg);
 int ltdb_search_dn1(struct ldb_module *module, const char *dn, struct ldb_message *msg);
-int ltdb_search_dn(struct ldb_module *module, const char *dn,
-                  const char * const attrs[], struct ldb_message ***res);
 int ltdb_add_attr_results(struct ldb_module *module, struct ldb_message *msg,
                          const char * const attrs[], 
                          int *count, 
index ede66ec56759dccb75097bb856957393ca55667a..93ac2db6bd0f8042ed5441c922b6b77b56be0e71 100755 (executable)
@@ -1,8 +1,10 @@
 #!/bin/sh
 
+echo "Running extended search tests"
+
 rm -f $LDB_URL
 
-cat <<EOF | bin/ldbadd || exit 1
+cat <<EOF | bin/ldbadd || exit 1
 dn: testrec1
 i1: 1
 i2: 0
index 7b82c672be5fe6972e30c34f2a0563d674c40b85..5e0cc9cec6e22d95675fc070b097250502d2b9a3 100755 (executable)
@@ -20,7 +20,7 @@ echo "Showing renamed record"
 $VALGRIND bin/ldbsearch '(uid=uham)' || exit 1
 
 echo "Starting ldbtest"
-time $VALGRIND bin/ldbtest -r 1000 -s 10  || exit 1
+time $VALGRIND bin/ldbtest --num-records 1000 --num-searches 10  || exit 1
 
 echo "Adding index"
 $VALGRIND bin/ldbadd tests/test-index.ldif  || exit 1
@@ -42,7 +42,7 @@ $VALGRIND bin/ldbsearch '(objectclass=)' uid || exit 1
 $VALGRIND bin/ldbsearch -b 'cn=Hampster Ursula,ou=Alumni Association,ou=People,o=University of Michigan,c=US' -s base "" sn || exit 1
 
 echo "Starting ldbtest indexed"
-time $VALGRIND bin/ldbtest -r 1000 -s 5000  || exit 1
+time $VALGRIND bin/ldbtest --num-records 1000 --num-searches 5000  || exit 1
 
 echo "Testing one level search"
 count=`$VALGRIND bin/ldbsearch -b 'ou=Groups,o=University of Michigan,c=US' -s one 'objectclass=*' none |grep ^dn | wc -l`
index 818c33a11dcde12aeec0619dca21bbde9618876a..35a41527bef328fd6685b48cc5de39c596539a0c 100644 (file)
@@ -35,6 +35,7 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
@@ -86,69 +87,36 @@ static int process_file(struct ldb_context *ldb, FILE *f)
 
 
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
        struct ldb_context *ldb;
-       int count=0;
-       const char *ldb_url;
-       const char **options = NULL;
-       int ldbopts;
-       int opt, i;
-
-       ldb_url = getenv("LDB_URL");
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "hH:o:")) != EOF) {
-               switch (opt) {
-               case 'H':
-                       ldb_url = optarg;
-                       break;
-
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
-
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
+       int i, ret, count=0;
+       struct ldb_cmdline *options;
 
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify an ldb URL\n\n");
-               usage();
-       }
+       ldb = ldb_init(NULL);
 
-       argc -= optind;
-       argv += optind;
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
 
-       ldb = ldb_connect(ldb_url, 0, options);
-
-       if (!ldb) {
-               perror("ldb_connect");
+       ret = ldb_connect(ldb, options->url, 0, options->options);
+       if (ret != 0) {
+               fprintf(stderr, "Failed to connect to %s - %s\n", 
+                       options->url, ldb_errstring(ldb));
+               talloc_free(ldb);
                exit(1);
        }
 
-       ldb_set_debug_stderr(ldb);
-
-       if (argc == 0) {
-               usage();
-       }
-
-       for (i=0;i<argc;i++) {
-               FILE *f;
-               if (strcmp(argv[i],"-") == 0) {
-                       f = stdin;
-               } else {
-                       f = fopen(argv[i], "r");
-               }
-               if (!f) {
-                       perror(argv[i]);
-                       exit(1);
-               }
-               count += process_file(ldb, f);
-               if (f != stdin) {
+       if (options->argc == 0) {
+               count += process_file(ldb, stdin);
+       } else {
+               for (i=0;i<options->argc;i++) {
+                       const char *fname = options->argv[i];
+                       FILE *f;
+                       f = fopen(fname, "r");
+                       if (!f) {
+                               perror(fname);
+                               exit(1);
+                       }
+                       count += process_file(ldb, f);
                        fclose(f);
                }
        }
index ec2e302b20036e165ef0aeb89c3fcd2f58a37aea..fcf1d26d5394c1430f3efd44309a5fee759f5551 100644 (file)
@@ -35,6 +35,7 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
@@ -77,72 +78,41 @@ static void usage(void)
        exit(1);
 }
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
        struct ldb_context *ldb;
-       const char **options = NULL;
-       int ldbopts;
        int ret, i;
-       const char *ldb_url;
-       int opt, recursive=0;
-
-       ldb_url = getenv("LDB_URL");
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "hH:ro:")) != EOF) {
-               switch (opt) {
-               case 'H':
-                       ldb_url = optarg;
-                       break;
-
-               case 'r':
-                       recursive=1;
-                       break;
-
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
-
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
+       struct ldb_cmdline *options;
 
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify a ldb URL\n\n");
-               usage();
-       }
+       ldb = ldb_init(NULL);
 
-       argc -= optind;
-       argv += optind;
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
 
-       if (argc < 1) {
+       if (options->argc < 1) {
                usage();
                exit(1);
        }
 
-       ldb = ldb_connect(ldb_url, 0, options);
-       if (!ldb) {
-               perror("ldb_connect");
+       ret = ldb_connect(ldb, options->url, 0, options->options);
+       if (ret != 0) {
+               fprintf(stderr, "Failed to connect to %s - %s\n", 
+                       options->url, ldb_errstring(ldb));
+               talloc_free(ldb);
                exit(1);
        }
 
-       ldb_set_debug_stderr(ldb);
-
-       for (i=0;i<argc;i++) {
-               if (recursive) {
-                       ret = ldb_delete_recursive(ldb, argv[i]);
+       for (i=0;i<options->argc;i++) {
+               const char *dn = options->argv[i];
+               if (options->recursive) {
+                       ret = ldb_delete_recursive(ldb, dn);
                } else {
-                       ret = ldb_delete(ldb, argv[i]);
+                       ret = ldb_delete(ldb, dn);
                        if (ret == 0) {
                                printf("Deleted 1 record\n");
                        }
                }
                if (ret != 0) {
-                       printf("delete of '%s' failed - %s\n", 
-                              argv[i], ldb_errstring(ldb));
+                       printf("delete of '%s' failed - %s\n", dn, ldb_errstring(ldb));
                }
        }
 
index 851eaeebdff90bb5570a051d2bbb47eec2f52ead..6c599ee2ec2f3fc684f80793d6d1528ec7b32d63 100644 (file)
@@ -35,6 +35,7 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
@@ -272,109 +273,45 @@ static void usage(void)
        exit(1);
 }
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
        struct ldb_context *ldb;
        struct ldb_message **msgs;
        int ret;
        const char *expression = NULL;
-       const char *ldb_url;
-       const char *basedn = NULL;
-       const char **options = NULL;
-       int ldbopts;
-       int opt;
-       enum ldb_scope scope = LDB_SCOPE_SUBTREE;
-       const char *editor;
        const char * const * attrs = NULL;
+       struct ldb_cmdline *options;
 
-       ldb_url = getenv("LDB_URL");
+       ldb = ldb_init(NULL);
 
-       /* build the editor command to run -
-          use the same editor priorities as vipw */
-       editor = getenv("VISUAL");
-       if (!editor) {
-               editor = getenv("EDITOR");
-       }
-       if (!editor) {
-               editor = "vi";
-       }
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "hab:e:H:s:vo:")) != EOF) {
-               switch (opt) {
-               case 'b':
-                       basedn = optarg;
-                       break;
-
-               case 'H':
-                       ldb_url = optarg;
-                       break;
-
-               case 's':
-                       if (strcmp(optarg, "base") == 0) {
-                               scope = LDB_SCOPE_BASE;
-                       } else if (strcmp(optarg, "sub") == 0) {
-                               scope = LDB_SCOPE_SUBTREE;
-                       } else if (strcmp(optarg, "one") == 0) {
-                               scope = LDB_SCOPE_ONELEVEL;
-                       }
-                       break;
-
-               case 'e':
-                       editor = optarg;
-                       break;
-
-               case 'a':
-                       expression = "(|(objectclass=*)(dn=*))";
-                       break;
-                       
-               case 'v':
-                       verbose++;
-                       break;
-
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
-
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
 
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify a ldb URL\n\n");
-               usage();
+       if (options->all_records) {
+               expression = "(|(objectclass=*)(dn=*))";
        }
 
-       argc -= optind;
-       argv += optind;
-
        if (!expression) {
-               if (argc == 0) {
+               if (options->argc == 0) {
                        usage();
                }
-               expression = argv[0];
-               argc--;
-               argv++;
+               expression = options->argv[0];
+               options->argc--;
+               options->argv++;
        }
 
-       if (argc > 0) {
-               attrs = (const char * const *)argv;
+       if (options->argc > 0) {
+               attrs = (const char * const *)options->argv;
        }
 
-       ldb = ldb_connect(ldb_url, 0, options);
-
-       if (!ldb) {
-               perror("ldb_connect");
+       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);
                exit(1);
        }
 
-       ldb_set_debug_stderr(ldb);
-
-       ret = ldb_search(ldb, basedn, scope, expression, attrs, &msgs);
-
+       ret = ldb_search(ldb, options->basedn, options->scope, expression, attrs, &msgs);
        if (ret == -1) {
                printf("search failed - %s\n", ldb_errstring(ldb));
                exit(1);
@@ -385,7 +322,7 @@ static void usage(void)
                return 0;
        }
 
-       do_edit(ldb, msgs, ret, editor);
+       do_edit(ldb, msgs, ret, options->editor);
 
        if (ret > 0) {
                ret = talloc_free(msgs);
index 78baa0e36ca88835759d607d8d3e47d5ff97f3c5..c54c573ab0efdebee79821f1f3d193d63c1a12f0 100644 (file)
@@ -35,6 +35,7 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
@@ -88,66 +89,40 @@ static int process_file(struct ldb_context *ldb, FILE *f)
        return count;
 }
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
        struct ldb_context *ldb;
        int count=0;
-       const char *ldb_url;
-       const char **options = NULL;
-       int ldbopts;
-       int opt, i;
-
-       ldb_url = getenv("LDB_URL");
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "hH:o:")) != EOF) {
-               switch (opt) {
-               case 'H':
-                       ldb_url = optarg;
-                       break;
+       int i, ret;
+       struct ldb_cmdline *options;
 
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
+       ldb = ldb_init(NULL);
 
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
 
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify a ldb URL\n\n");
-               usage();
-       }
-
-       argc -= optind;
-       argv += optind;
-
-       ldb = ldb_connect(ldb_url, 0, options);
-
-       if (!ldb) {
-               perror("ldb_connect");
+       ret = ldb_connect(ldb, options->url, 0, options->options);
+       if (ret != 0) {
+               fprintf(stderr, "Failed to connect to %s - %s\n", 
+                       options->url, ldb_errstring(ldb));
+               talloc_free(ldb);
                exit(1);
        }
 
-       ldb_set_debug_stderr(ldb);
-
-       if (argc == 0) {
+       if (options->argc == 0) {
                usage();
                exit(1);
        }
 
-       for (i=0;i<argc;i++) {
+       for (i=0;i<options->argc;i++) {
+               const char *fname = options->argv[i];
                FILE *f;
-               if (strcmp(argv[i],"-") == 0) {
+               if (strcmp(fname,"-") == 0) {
                        f = stdin;
                } else {
-                       f = fopen(argv[i], "r");
+                       f = fopen(fname, "r");
                }
                if (!f) {
-                       perror(argv[i]);
+                       perror(fname);
                        exit(1);
                }
                count += process_file(ldb, f);
index 273c792584ff98f54e6535cfc6291bc5a57444d6..5566c3d7d7f2d4b4e07e1ea3fbada7a18efde933 100644 (file)
@@ -37,6 +37,7 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
@@ -55,61 +56,38 @@ static void usage(void)
 }
 
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
        struct ldb_context *ldb;
-       const char *ldb_url;
-       const char **options = NULL;
-       int ldbopts;
-       int opt, ret;
-
-       ldb_url = getenv("LDB_URL");
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "hH:o:")) != EOF) {
-               switch (opt) {
-               case 'H':
-                       ldb_url = optarg;
-                       break;
-
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
-
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
-
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify a ldb URL\n\n");
-               usage();
-       }
+       int ret;
+       struct ldb_cmdline *options;
+       const char *dn1, *dn2;
 
-       argc -= optind;
-       argv += optind;
+       ldb = ldb_init(NULL);
 
-       ldb = ldb_connect(ldb_url, 0, options);
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
 
-       if (!ldb) {
-               perror("ldb_connect");
+       ret = ldb_connect(ldb, options->url, 0, options->options);
+       if (ret != 0) {
+               fprintf(stderr, "Failed to connect to %s - %s\n", 
+                       options->url, ldb_errstring(ldb));
+               talloc_free(ldb);
                exit(1);
        }
 
-       ldb_set_debug_stderr(ldb);
-
-       if (argc < 2) {
+       if (options->argc < 2) {
                usage();
        }
 
-       ret = ldb_rename(ldb, argv[0], argv[1]);
+       dn1 = options->argv[0];
+       dn2 = options->argv[1];
+
+       ret = ldb_rename(ldb, dn1, dn2);
        if (ret == 0) {
                printf("Renamed 1 record\n");
        } else  {
                printf("rename of '%s' to '%s' failed - %s\n", 
-                       argv[0], argv[1], ldb_errstring(ldb));
+                       dn1, dn2, ldb_errstring(ldb));
        }
 
        talloc_free(ldb);
index 4bf9db8d907ee94af91d1a187ea73b08053c2dba..04f83ca36685c945d44a23f59b9f4a10bab686c4 100644 (file)
@@ -35,6 +35,7 @@
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
@@ -113,93 +114,45 @@ static int do_search(struct ldb_context *ldb,
        return 0;
 }
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
        struct ldb_context *ldb;
        const char * const * attrs = NULL;
-       const char *ldb_url;
-       const char *basedn = NULL;
-       const char **options = NULL;
-       int opt, ldbopts;
-       enum ldb_scope scope = LDB_SCOPE_SUBTREE;
-       int interactive = 0, sort_attribs=0, ret=0;
-
-       ldb_url = getenv("LDB_URL");
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "b:H:s:o:hiS")) != EOF) {
-               switch (opt) {
-               case 'b':
-                       basedn = optarg;
-                       break;
-
-               case 'H':
-                       ldb_url = optarg;
-                       break;
-
-               case 's':
-                       if (strcmp(optarg, "base") == 0) {
-                               scope = LDB_SCOPE_BASE;
-                       } else if (strcmp(optarg, "sub") == 0) {
-                               scope = LDB_SCOPE_SUBTREE;
-                       } else if (strcmp(optarg, "one") == 0) {
-                               scope = LDB_SCOPE_ONELEVEL;
-                       }
-                       break;
-
-               case 'i':
-                       interactive = 1;
-                       break;
-
-                case 'S':
-                        sort_attribs = 1;
-                        break;
+       struct ldb_cmdline *options;
+       int ret;
 
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
-
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
+       ldb = ldb_init(NULL);
 
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify a ldb URL\n\n");
-               usage();
-       }
-
-       argc -= optind;
-       argv += optind;
-
-       if (argc < 1 && !interactive) {
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
+       
+       if (options->argc < 1 && !options->interactive) {
                usage();
                exit(1);
        }
 
-       if (argc > 1) {
-               attrs = (const char * const *)(argv+1);
+       if (options->argc > 1) {
+               attrs = (const char * const *)(options->argv+1);
        }
 
-       ldb = ldb_connect(ldb_url, LDB_FLG_RDONLY, options);
-       if (!ldb) {
-               perror("ldb_connect");
+       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);
                exit(1);
        }
 
-       ldb_set_debug_stderr(ldb);
-
-       if (interactive) {
+       if (options->interactive) {
                char line[1024];
                while (fgets(line, sizeof(line), stdin)) {
-                       if (do_search(ldb, basedn, scope, sort_attribs, line, attrs) == -1) {
+                       if (do_search(ldb, options->basedn, 
+                                     options->scope, options->sorted, line, attrs) == -1) {
                                ret = -1;
                        }
                }
        } else {
-               ret = do_search(ldb, basedn, scope, sort_attribs, argv[0], attrs);
+               ret = do_search(ldb, options->basedn, options->scope, options->sorted, 
+                               options->argv[0], attrs);
        }
 
        talloc_free(ldb);
index fc1f3e3098d6c5d28f762fdf33df64f29b8cd349..a7c9a3123ace67d83f9c957f2e83d09648b11f2a 100644 (file)
 #include "includes.h"
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_private.h"
+#include "ldb/tools/cmdline.h"
 
 #ifdef _SAMBA_BUILD_
 #include "system/filesys.h"
 #include "system/time.h"
 #endif
 
-static const char *ldb_url;
-static const char *base_dn = "ou=Ldb Test,ou=People,o=University of Michigan,c=US";
-
 static struct timeval tp1,tp2;
+static struct ldb_cmdline *options;
 
 static void _start_timer(void)
 {
@@ -69,51 +68,51 @@ static void add_records(struct ldb_context *ldb,
                struct ldb_message_element el[6];
                struct ldb_val vals[6][1];
                char *name;
-               int j;
+               TALLOC_CTX *tmp_ctx = talloc_new(ldb);
 
                asprintf(&name, "Test%d", i);
 
-               asprintf(&msg.dn, "cn=%s,%s", name, basedn);
+               msg.dn = talloc_asprintf(tmp_ctx, "cn=%s,%s", name, basedn);
                msg.num_elements = 6;
                msg.elements = el;
 
                el[0].flags = 0;
-               el[0].name = strdup("cn");
+               el[0].name = talloc_strdup(tmp_ctx, "cn");
                el[0].num_values = 1;
                el[0].values = vals[0];
                vals[0][0].data = name;
                vals[0][0].length = strlen(name);
 
                el[1].flags = 0;
-               el[1].name = strdup("title");
+               el[1].name = talloc_strdup(tmp_ctx, "title");
                el[1].num_values = 1;
                el[1].values = vals[1];
-               asprintf((char **)&vals[1][0].data, "The title of %s", name);
+               vals[1][0].data = talloc_asprintf(tmp_ctx, "The title of %s", name);
                vals[1][0].length = strlen(vals[1][0].data);
 
                el[2].flags = 0;
-               el[2].name = strdup("uid");
+               el[2].name = talloc_strdup(tmp_ctx, "uid");
                el[2].num_values = 1;
                el[2].values = vals[2];
-               vals[2][0].data = ldb_casefold(ldb, name);
+               vals[2][0].data = ldb_casefold(tmp_ctx, name);
                vals[2][0].length = strlen(vals[2][0].data);
 
                el[3].flags = 0;
-               el[3].name = strdup("mail");
+               el[3].name = talloc_strdup(tmp_ctx, "mail");
                el[3].num_values = 1;
                el[3].values = vals[3];
-               asprintf((char **)&vals[3][0].data, "%s@example.com", name);
+               vals[3][0].data = talloc_asprintf(tmp_ctx, "%s@example.com", name);
                vals[3][0].length = strlen(vals[3][0].data);
 
                el[4].flags = 0;
-               el[4].name = strdup("objectClass");
+               el[4].name = talloc_strdup(tmp_ctx, "objectClass");
                el[4].num_values = 1;
                el[4].values = vals[4];
-               vals[4][0].data = strdup("OpenLDAPperson");
+               vals[4][0].data = talloc_strdup(tmp_ctx, "OpenLDAPperson");
                vals[4][0].length = strlen(vals[4][0].data);
 
                el[5].flags = 0;
-               el[5].name = strdup("sn");
+               el[5].name = talloc_strdup(tmp_ctx, "sn");
                el[5].num_values = 1;
                el[5].values = vals[5];
                vals[5][0].data = name;
@@ -129,15 +128,7 @@ static void add_records(struct ldb_context *ldb,
                printf("adding uid %s\r", name);
                fflush(stdout);
 
-               for (j=0;j<msg.num_elements;j++) {
-                       free(el[j].name);
-               }
-               free(name);
-               free(msg.dn);
-               free(vals[1][0].data);
-               talloc_free(vals[2][0].data);
-               free(vals[3][0].data);
-               free(vals[4][0].data);
+               talloc_free(tmp_ctx);
        }
 
        printf("\n");
@@ -154,30 +145,30 @@ static void modify_records(struct ldb_context *ldb,
                struct ldb_message_element el[3];
                struct ldb_val vals[3];
                char *name;
-               int j;
+               TALLOC_CTX *tmp_ctx = talloc_new(ldb);
                
-               asprintf(&name, "Test%d", i);
-               asprintf(&msg.dn, "cn=%s,%s", name, basedn);
+               name = talloc_asprintf(tmp_ctx, "Test%d", i);
+               msg.dn = talloc_asprintf(tmp_ctx, "cn=%s,%s", name, basedn);
 
                msg.num_elements = 3;
                msg.elements = el;
 
                el[0].flags = LDB_FLAG_MOD_DELETE;
-               el[0].name = strdup("mail");
+               el[0].name = talloc_strdup(tmp_ctx, "mail");
                el[0].num_values = 0;
 
                el[1].flags = LDB_FLAG_MOD_ADD;
-               el[1].name = strdup("mail");
+               el[1].name = talloc_strdup(tmp_ctx, "mail");
                el[1].num_values = 1;
                el[1].values = &vals[1];
-               asprintf((char **)&vals[1].data, "%s@other.example.com", name);
+               vals[1].data = talloc_asprintf(tmp_ctx, "%s@other.example.com", name);
                vals[1].length = strlen(vals[1].data);
 
                el[2].flags = LDB_FLAG_MOD_REPLACE;
-               el[2].name = strdup("mail");
+               el[2].name = talloc_strdup(tmp_ctx, "mail");
                el[2].num_values = 1;
                el[2].values = &vals[2];
-               asprintf((char **)&vals[2].data, "%s@other2.example.com", name);
+               vals[2].data = talloc_asprintf(tmp_ctx, "%s@other2.example.com", name);
                vals[2].length = strlen(vals[2].data);
 
                if (ldb_modify(ldb, &msg) != 0) {
@@ -188,13 +179,7 @@ static void modify_records(struct ldb_context *ldb,
                printf("Modifying uid %s\r", name);
                fflush(stdout);
 
-               for (j=0;j<msg.num_elements;j++) {
-                       free(el[j].name);
-               }
-               free(name);
-               free(msg.dn);
-               free(vals[1].data);
-               free(vals[2].data);
+               talloc_free(tmp_ctx);
        }
 
        printf("\n");
@@ -235,7 +220,7 @@ static void search_uid(struct ldb_context *ldb, int nrecords, int nsearches)
                int ret;
 
                asprintf(&expr, "(uid=TEST%d)", uid);
-               ret = ldb_search(ldb, base_dn, LDB_SCOPE_SUBTREE, expr, NULL, &res);
+               ret = ldb_search(ldb, options->basedn, LDB_SCOPE_SUBTREE, expr, NULL, &res);
 
                if (uid < nrecords && ret != 1) {
                        printf("Failed to find %s - %s\n", expr, ldb_errstring(ldb));
@@ -263,7 +248,7 @@ static void search_uid(struct ldb_context *ldb, int nrecords, int nsearches)
 static void start_test(struct ldb_context *ldb, int nrecords, int nsearches)
 {
        printf("Adding %d records\n", nrecords);
-       add_records(ldb, base_dn, nrecords);
+       add_records(ldb, options->basedn, nrecords);
 
        printf("Starting search on uid\n");
        _start_timer();
@@ -271,10 +256,10 @@ static void start_test(struct ldb_context *ldb, int nrecords, int nsearches)
        printf("uid search took %.2f seconds\n", _end_timer());
 
        printf("Modifying records\n");
-       modify_records(ldb, base_dn, nrecords);
+       modify_records(ldb, options->basedn, nrecords);
 
        printf("Deleting records\n");
-       delete_records(ldb, base_dn, nrecords);
+       delete_records(ldb, options->basedn, nrecords);
 }
 
 
@@ -312,7 +297,7 @@ static void start_test_index(struct ldb_context **ldb)
        }
 
        memset(msg, 0, sizeof(*msg));
-       asprintf(&msg->dn, "cn=%s,%s", "test", base_dn);
+       asprintf(&msg->dn, "cn=%s,%s", "test", options->basedn);
        ldb_msg_add_string(*ldb, msg, "cn", strdup("test"));
        ldb_msg_add_string(*ldb, msg, "sn", strdup("test"));
        ldb_msg_add_string(*ldb, msg, "uid", strdup("test"));
@@ -328,14 +313,15 @@ static void start_test_index(struct ldb_context **ldb)
                exit(1);
        }
 
-       *ldb = ldb_connect(ldb_url, 0, NULL);
-
-       if (!*ldb) {
-               perror("ldb_connect");
+       (*ldb) = ldb_init(options);
+       
+       ret = ldb_connect(*ldb, options->url, 0, NULL);
+       if (ret != 0) {
+               printf("failed to connect to %s\n", options->url);
                exit(1);
        }
 
-       ret = ldb_search(*ldb, base_dn, LDB_SCOPE_SUBTREE, "uid=test", NULL, &res);
+       ret = ldb_search(*ldb, options->basedn, LDB_SCOPE_SUBTREE, "uid=test", NULL, &res);
        if (ret != 1) {
                printf("Should have found 1 record - found %d\n", ret);
                exit(1);
@@ -363,71 +349,37 @@ static void usage(void)
        exit(1);
 }
 
- int main(int argc, char * const argv[])
+ int main(int argc, const char **argv)
 {
+       TALLOC_CTX *mem_ctx = talloc_new(NULL);
        struct ldb_context *ldb;
-       const char **options = NULL;
-       int ldbopts;
-       int opt;
-       int nrecords = 5000;
-       int nsearches = 2000;
-
-       ldb_url = getenv("LDB_URL");
-
-       ldbopts = 0;
-       while ((opt = getopt(argc, argv, "hH:r:s:b:o:")) != EOF) {
-               switch (opt) {
-               case 'H':
-                       ldb_url = optarg;
-                       break;
-
-               case 'r':
-                       nrecords = atoi(optarg);
-                       break;
-
-               case 'b':
-                       base_dn = optarg;
-                       break;
-
-               case 's':
-                       nsearches = atoi(optarg);
-                       break;
-
-               case 'o':
-                       options = ldb_options_parse(options, &ldbopts, optarg);
-                       break;
-
-               case 'h':
-               default:
-                       usage();
-                       break;
-               }
-       }
+       int ret;
 
-       if (!ldb_url) {
-               fprintf(stderr, "You must specify a ldb URL\n\n");
-               usage();
-       }
+       ldb = ldb_init(mem_ctx);
 
-       argc -= optind;
-       argv += optind;
+       options = ldb_cmdline_process(ldb, argc, argv, usage);
 
-       ldb = ldb_connect(ldb_url, 0, options);
+       talloc_steal(mem_ctx, options);
 
-       if (!ldb) {
-               perror("ldb_connect");
-               exit(1);
+       if (options->basedn == NULL) {
+               options->basedn = "ou=Ldb Test,ou=People,o=University of Michigan,c=US";
        }
 
-       ldb_set_debug_stderr(ldb);
+       ret = ldb_connect(ldb, options->url, 0, options->options);
+       if (ret != 0) {
+               fprintf(stderr, "Failed to connect to %s - %s\n", 
+                       options->url, ldb_errstring(ldb));
+               talloc_free(ldb);
+               exit(1);
+       }
 
        srandom(1);
 
-       start_test(ldb, nrecords, nsearches);
+       start_test(ldb, options->num_records, options->num_searches);
 
        start_test_index(&ldb);
 
-       talloc_free(ldb);
+       talloc_free(mem_ctx);
 
        return 0;
 }