root/source4/lib/ldb/common/ldb_modules.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ldb_set_modules_dir
  2. ldb_modules_strdup_no_spaces
  3. ldb_modules_list_from_string
  4. ldb_find_backend
  5. ldb_register_backend
  6. ldb_connect_backend
  7. ldb_find_module_ops
  8. ldb_register_module
  9. ldb_dso_load_symbol
  10. ldb_load_modules_list
  11. ldb_init_module_chain
  12. ldb_load_modules
  13. ldb_module_new
  14. ldb_module_get_name
  15. ldb_module_get_ctx
  16. ldb_module_get_private
  17. ldb_module_set_private
  18. ldb_next_request
  19. ldb_next_init
  20. ldb_next_start_trans
  21. ldb_next_end_trans
  22. ldb_next_del_trans
  23. ldb_handle_new
  24. ldb_module_send_entry
  25. ldb_module_send_referral
  26. ldb_module_done
  27. ldb_mod_register_control

   1 /* 
   2    ldb database library
   3 
   4    Copyright (C) Simo Sorce  2004-2008
   5 
   6      ** NOTE! The following LGPL license applies to the ldb
   7      ** library. This does NOT imply that all of Samba is released
   8      ** under the LGPL
   9    
  10    This library is free software; you can redistribute it and/or
  11    modify it under the terms of the GNU Lesser General Public
  12    License as published by the Free Software Foundation; either
  13    version 3 of the License, or (at your option) any later version.
  14 
  15    This library is distributed in the hope that it will be useful,
  16    but WITHOUT ANY WARRANTY; without even the implied warranty of
  17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18    Lesser General Public License for more details.
  19 
  20    You should have received a copy of the GNU Lesser General Public
  21    License along with this library; if not, see <http://www.gnu.org/licenses/>.
  22 */
  23 
  24 /*
  25  *  Name: ldb
  26  *
  27  *  Component: ldb modules core
  28  *
  29  *  Description: core modules routines
  30  *
  31  *  Author: Simo Sorce
  32  */
  33 
  34 #include "ldb_private.h"
  35 #include "dlinklist.h"
  36 
  37 #define LDB_MODULE_PREFIX       "modules:"
  38 #define LDB_MODULE_PREFIX_LEN   8
  39 
  40 static void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
  41                                  const char *symbol);
  42 
  43 void ldb_set_modules_dir(struct ldb_context *ldb, const char *path)
     /* [<][>][^][v][top][bottom][index][help] */
  44 {
  45         talloc_free(ldb->modules_dir);
  46         ldb->modules_dir = talloc_strdup(ldb, path);
  47 }
  48 
  49 static char *ldb_modules_strdup_no_spaces(TALLOC_CTX *mem_ctx, const char *string)
     /* [<][>][^][v][top][bottom][index][help] */
  50 {
  51         int i, len;
  52         char *trimmed;
  53 
  54         trimmed = talloc_strdup(mem_ctx, string);
  55         if (!trimmed) {
  56                 return NULL;
  57         }
  58 
  59         len = strlen(trimmed);
  60         for (i = 0; trimmed[i] != '\0'; i++) {
  61                 switch (trimmed[i]) {
  62                 case ' ':
  63                 case '\t':
  64                 case '\n':
  65                         memmove(&trimmed[i], &trimmed[i + 1], len -i -1);
  66                         break;
  67                 }
  68         }
  69 
  70         return trimmed;
  71 }
  72 
  73 
  74 /* modules are called in inverse order on the stack.
  75    Lets place them as an admin would think the right order is.
  76    Modules order is important */
  77 const char **ldb_modules_list_from_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *string)
     /* [<][>][^][v][top][bottom][index][help] */
  78 {
  79         char **modules = NULL;
  80         const char **m;
  81         char *modstr, *p;
  82         int i;
  83 
  84         /* spaces not admitted */
  85         modstr = ldb_modules_strdup_no_spaces(mem_ctx, string);
  86         if ( ! modstr) {
  87                 ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in ldb_modules_strdup_no_spaces()\n");
  88                 return NULL;
  89         }
  90 
  91         modules = talloc_realloc(mem_ctx, modules, char *, 2);
  92         if ( ! modules ) {
  93                 ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in ldb_modules_list_from_string()\n");
  94                 talloc_free(modstr);
  95                 return NULL;
  96         }
  97         talloc_steal(modules, modstr);
  98 
  99         i = 0;
 100         /* The str*r*chr walks backwards:  This is how we get the inverse order mentioned above */
 101         while ((p = strrchr(modstr, ',')) != NULL) {
 102                 *p = '\0';
 103                 p++;
 104                 modules[i] = p;
 105 
 106                 i++;
 107                 modules = talloc_realloc(mem_ctx, modules, char *, i + 2);
 108                 if ( ! modules ) {
 109                         ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in ldb_modules_list_from_string()\n");
 110                         return NULL;
 111                 }
 112 
 113         }
 114         modules[i] = modstr;
 115 
 116         modules[i + 1] = NULL;
 117 
 118         m = (const char **)modules;
 119 
 120         return m;
 121 }
 122 
 123 static struct backends_list_entry {
 124         struct ldb_backend_ops *ops;
 125         struct backends_list_entry *prev, *next;
 126 } *ldb_backends = NULL;
 127 
 128 static struct ops_list_entry {
 129         const struct ldb_module_ops *ops;
 130         struct ops_list_entry *next;    
 131 } *registered_modules = NULL;
 132 
 133 static const struct ldb_builtins {
 134         const struct ldb_backend_ops *backend_ops;
 135         const struct ldb_module_ops *module_ops;
 136 } builtins[];
 137 
 138 static ldb_connect_fn ldb_find_backend(const char *url)
     /* [<][>][^][v][top][bottom][index][help] */
 139 {
 140         struct backends_list_entry *backend;
 141         int i;
 142 
 143         for (i = 0; builtins[i].backend_ops || builtins[i].module_ops; i++) {
 144                 if (builtins[i].backend_ops == NULL) continue;
 145 
 146                 if (strncmp(builtins[i].backend_ops->name, url,
 147                             strlen(builtins[i].backend_ops->name)) == 0) {
 148                         return builtins[i].backend_ops->connect_fn;
 149                 }
 150         }
 151 
 152         for (backend = ldb_backends; backend; backend = backend->next) {
 153                 if (strncmp(backend->ops->name, url,
 154                             strlen(backend->ops->name)) == 0) {
 155                         return backend->ops->connect_fn;
 156                 }
 157         }
 158 
 159         return NULL;
 160 }
 161 
 162 /*
 163  register a new ldb backend
 164 */
 165 int ldb_register_backend(const char *url_prefix, ldb_connect_fn connectfn)
     /* [<][>][^][v][top][bottom][index][help] */
 166 {
 167         struct ldb_backend_ops *backend;
 168         struct backends_list_entry *entry;
 169 
 170         backend = talloc(talloc_autofree_context(), struct ldb_backend_ops);
 171         if (!backend) return LDB_ERR_OPERATIONS_ERROR;
 172 
 173         entry = talloc(talloc_autofree_context(), struct backends_list_entry);
 174         if (!entry) {
 175                 talloc_free(backend);
 176                 return LDB_ERR_OPERATIONS_ERROR;
 177         }
 178 
 179         if (ldb_find_backend(url_prefix)) {
 180                 return LDB_SUCCESS;
 181         }
 182 
 183         /* Maybe check for duplicity here later on? */
 184 
 185         backend->name = talloc_strdup(backend, url_prefix);
 186         backend->connect_fn = connectfn;
 187         entry->ops = backend;
 188         DLIST_ADD(ldb_backends, entry);
 189 
 190         return LDB_SUCCESS;
 191 }
 192 
 193 /*
 194    Return the ldb module form of a database.
 195    The URL can either be one of the following forms
 196    ldb://path
 197    ldapi://path
 198 
 199    flags is made up of LDB_FLG_*
 200 
 201    the options are passed uninterpreted to the backend, and are
 202    backend specific.
 203 
 204    This allows modules to get at only the backend module, for example where a
 205    module may wish to direct certain requests at a particular backend.
 206 */
 207 int ldb_connect_backend(struct ldb_context *ldb,
     /* [<][>][^][v][top][bottom][index][help] */
 208                         const char *url,
 209                         const char *options[],
 210                         struct ldb_module **backend_module)
 211 {
 212         int ret;
 213         char *backend;
 214         ldb_connect_fn fn;
 215 
 216         if (strchr(url, ':') != NULL) {
 217                 backend = talloc_strndup(ldb, url, strchr(url, ':')-url);
 218         } else {
 219                 /* Default to tdb */
 220                 backend = talloc_strdup(ldb, "tdb");
 221         }
 222 
 223         fn = ldb_find_backend(backend);
 224 
 225         if (fn == NULL) {
 226                 struct ldb_backend_ops *ops;
 227                 char *symbol_name = talloc_asprintf(ldb, "ldb_%s_backend_ops", backend);
 228                 if (symbol_name == NULL) {
 229                         return LDB_ERR_OPERATIONS_ERROR;
 230                 }
 231                 ops = ldb_dso_load_symbol(ldb, backend, symbol_name);
 232                 if (ops != NULL) {
 233                         fn = ops->connect_fn;
 234                 }
 235                 talloc_free(symbol_name);
 236         }
 237 
 238         talloc_free(backend);
 239 
 240         if (fn == NULL) {
 241                 ldb_debug(ldb, LDB_DEBUG_FATAL,
 242                           "Unable to find backend for '%s'\n", url);
 243                 return LDB_ERR_OTHER;
 244         }
 245 
 246         ret = fn(ldb, url, ldb->flags, options, backend_module);
 247 
 248         if (ret != LDB_SUCCESS) {
 249                 ldb_debug(ldb, LDB_DEBUG_ERROR,
 250                           "Failed to connect to '%s'\n", url);
 251                 return ret;
 252         }
 253         return ret;
 254 }
 255 
 256 static const struct ldb_module_ops *ldb_find_module_ops(const char *name)
     /* [<][>][^][v][top][bottom][index][help] */
 257 {
 258         struct ops_list_entry *e;
 259         int i;
 260 
 261         for (i = 0; builtins[i].backend_ops || builtins[i].module_ops; i++) {
 262                 if (builtins[i].module_ops == NULL) continue;
 263 
 264                 if (strcmp(builtins[i].module_ops->name, name) == 0)
 265                         return builtins[i].module_ops;
 266         }
 267  
 268         for (e = registered_modules; e; e = e->next) {
 269                 if (strcmp(e->ops->name, name) == 0) 
 270                         return e->ops;
 271         }
 272 
 273         return NULL;
 274 }
 275 
 276 
 277 int ldb_register_module(const struct ldb_module_ops *ops)
     /* [<][>][^][v][top][bottom][index][help] */
 278 {
 279         struct ops_list_entry *entry = talloc(talloc_autofree_context(), struct ops_list_entry);
 280 
 281         if (ldb_find_module_ops(ops->name) != NULL)
 282                 return -1;
 283 
 284         if (entry == NULL)
 285                 return -1;
 286 
 287         entry->ops = ops;
 288         entry->next = registered_modules;
 289         registered_modules = entry;
 290 
 291         return 0;
 292 }
 293 
 294 static void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
     /* [<][>][^][v][top][bottom][index][help] */
 295                                  const char *symbol)
 296 {
 297         char *path;
 298         void *handle;
 299         void *sym;
 300 
 301         if (ldb->modules_dir == NULL)
 302                 return NULL;
 303 
 304         path = talloc_asprintf(ldb, "%s/%s.%s", ldb->modules_dir, name, 
 305                                SHLIBEXT);
 306 
 307         ldb_debug(ldb, LDB_DEBUG_TRACE, "trying to load %s from %s\n", name, path);
 308 
 309         handle = dlopen(path, RTLD_NOW);
 310         if (handle == NULL) {
 311                 ldb_debug(ldb, LDB_DEBUG_WARNING, "unable to load %s from %s: %s\n", name, path, dlerror());
 312                 return NULL;
 313         }
 314 
 315         sym = (int (*)(void))dlsym(handle, symbol);
 316 
 317         if (sym == NULL) {
 318                 ldb_debug(ldb, LDB_DEBUG_ERROR, "no symbol `%s' found in %s: %s\n", symbol, path, dlerror());
 319                 return NULL;
 320         }
 321 
 322         talloc_free(path);
 323 
 324         return sym;
 325 }
 326 
 327 int ldb_load_modules_list(struct ldb_context *ldb, const char **module_list, struct ldb_module *backend, struct ldb_module **out)
     /* [<][>][^][v][top][bottom][index][help] */
 328 {
 329         struct ldb_module *module;
 330         int i;
 331         
 332         module = backend;
 333 
 334         for (i = 0; module_list[i] != NULL; i++) {
 335                 struct ldb_module *current;
 336                 const struct ldb_module_ops *ops;
 337 
 338                 if (strcmp(module_list[i], "") == 0) {
 339                         continue;
 340                 }
 341                 
 342                 ops = ldb_find_module_ops(module_list[i]);
 343                 if (ops == NULL) {
 344                         char *symbol_name = talloc_asprintf(ldb, "ldb_%s_module_ops", 
 345                                                                                                 module_list[i]);
 346                         if (symbol_name == NULL) {
 347                                 return LDB_ERR_OPERATIONS_ERROR;
 348                         }
 349                         ops = ldb_dso_load_symbol(ldb, module_list[i], symbol_name);
 350                         talloc_free(symbol_name);
 351                 }
 352                 
 353                 if (ops == NULL) {
 354                         ldb_debug(ldb, LDB_DEBUG_WARNING, "WARNING: Module [%s] not found\n", 
 355                                   module_list[i]);
 356                         continue;
 357                 }
 358                 
 359                 current = talloc_zero(ldb, struct ldb_module);
 360                 if (current == NULL) {
 361                         return LDB_ERR_OPERATIONS_ERROR;
 362                 }
 363                 talloc_set_name(current, "ldb_module: %s", module_list[i]);
 364                 
 365                 current->ldb = ldb;
 366                 current->ops = ops;
 367                 
 368                 DLIST_ADD(module, current);
 369         }
 370         *out = module;
 371         return LDB_SUCCESS;
 372 }
 373 
 374 int ldb_init_module_chain(struct ldb_context *ldb, struct ldb_module *module) 
     /* [<][>][^][v][top][bottom][index][help] */
 375 {
 376         while (module && module->ops->init_context == NULL) 
 377                 module = module->next;
 378 
 379         /* init is different in that it is not an error if modules
 380          * do not require initialization */
 381 
 382         if (module) {
 383                 int ret = module->ops->init_context(module);
 384                 if (ret != LDB_SUCCESS) {
 385                         ldb_debug(ldb, LDB_DEBUG_FATAL, "module %s initialization failed\n", module->ops->name);
 386                         return ret;
 387                 }
 388         }
 389 
 390         return LDB_SUCCESS;
 391 }
 392 
 393 int ldb_load_modules(struct ldb_context *ldb, const char *options[])
     /* [<][>][^][v][top][bottom][index][help] */
 394 {
 395         const char **modules = NULL;
 396         int i;
 397         int ret;
 398         TALLOC_CTX *mem_ctx = talloc_new(ldb);
 399         if (!mem_ctx) {
 400                 return LDB_ERR_OPERATIONS_ERROR;
 401         }
 402 
 403         /* find out which modules we are requested to activate */
 404 
 405         /* check if we have a custom module list passd as ldb option */
 406         if (options) {
 407                 for (i = 0; options[i] != NULL; i++) {
 408                         if (strncmp(options[i], LDB_MODULE_PREFIX, LDB_MODULE_PREFIX_LEN) == 0) {
 409                                 modules = ldb_modules_list_from_string(ldb, mem_ctx, &options[i][LDB_MODULE_PREFIX_LEN]);
 410                         }
 411                 }
 412         }
 413 
 414         /* if not overloaded by options and the backend is not ldap try to load the modules list from ldb */
 415         if ((modules == NULL) && (strcmp("ldap", ldb->modules->ops->name) != 0)) { 
 416                 const char * const attrs[] = { "@LIST" , NULL};
 417                 struct ldb_result *res = NULL;
 418                 struct ldb_dn *mods_dn;
 419 
 420                 mods_dn = ldb_dn_new(mem_ctx, ldb, "@MODULES");
 421                 if (mods_dn == NULL) {
 422                         talloc_free(mem_ctx);
 423                         return -1;
 424                 }
 425 
 426                 ret = ldb_search(ldb, mods_dn, &res, mods_dn, LDB_SCOPE_BASE, attrs, "@LIST=*");
 427                 
 428                 if (ret == LDB_ERR_NO_SUCH_OBJECT) {
 429                         ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by the db");
 430                 } else if (ret != LDB_SUCCESS) {
 431                         ldb_debug(ldb, LDB_DEBUG_FATAL, "ldb error (%s) occurred searching for modules, bailing out\n", ldb_errstring(ldb));
 432                         talloc_free(mem_ctx);
 433                         return ret;
 434                 } else {
 435                         const char *module_list;
 436                         if (res->count == 0) {
 437                                 ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by the db");
 438                         } else if (res->count > 1) {
 439                                 ldb_debug(ldb, LDB_DEBUG_FATAL, "Too many records found (%d), bailing out\n", res->count);
 440                                 talloc_free(mem_ctx);
 441                                 return -1;
 442                         } else {
 443                                 module_list = ldb_msg_find_attr_as_string(res->msgs[0], "@LIST", NULL);
 444                                 if (!module_list) {
 445                                         ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by the db");
 446                                 }
 447                                 modules = ldb_modules_list_from_string(ldb, mem_ctx,
 448                                                                module_list);
 449                         }
 450                 }
 451 
 452                 talloc_free(mods_dn);
 453         }
 454 
 455         if (modules != NULL) {
 456                 ret = ldb_load_modules_list(ldb, modules, ldb->modules, &ldb->modules);
 457                 if (ret != LDB_SUCCESS) {
 458                         talloc_free(mem_ctx);
 459                         return ret;
 460                 }
 461         } else {
 462                 ldb_debug(ldb, LDB_DEBUG_TRACE, "No modules specified for this database");
 463         }
 464 
 465         ret = ldb_init_module_chain(ldb, ldb->modules);
 466         talloc_free(mem_ctx);
 467         return ret;
 468 }
 469 
 470 /*
 471   by using this we allow ldb modules to only implement the functions they care about,
 472   which makes writing a module simpler, and makes it more likely to keep working
 473   when ldb is extended
 474 */
 475 #define FIND_OP(module, op) do { \
 476         struct ldb_context *ldb = module->ldb; \
 477         module = module->next; \
 478         while (module && module->ops->op == NULL) module = module->next; \
 479         if (module == NULL) { \
 480                 ldb_asprintf_errstring(ldb, "Unable to find backend operation for " #op ); \
 481                 return LDB_ERR_OPERATIONS_ERROR;        \
 482         }                                               \
 483 } while (0)
 484 
 485 
 486 struct ldb_module *ldb_module_new(TALLOC_CTX *memctx,
     /* [<][>][^][v][top][bottom][index][help] */
 487                                   struct ldb_context *ldb,
 488                                   const char *module_name,
 489                                   const struct ldb_module_ops *ops)
 490 {
 491         struct ldb_module *module;
 492 
 493         module = talloc(memctx, struct ldb_module);
 494         if (!module) {
 495                 ldb_oom(ldb);
 496                 return NULL;
 497         }
 498         talloc_set_name_const(module, module_name);
 499         module->ldb = ldb;
 500         module->prev = module->next = NULL;
 501         module->ops = ops;
 502 
 503         return module;
 504 }
 505 
 506 const char * ldb_module_get_name(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 507 {
 508         return module->ops->name;
 509 }
 510 
 511 struct ldb_context *ldb_module_get_ctx(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 512 {
 513         return module->ldb;
 514 }
 515 
 516 void *ldb_module_get_private(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 517 {
 518         return module->private_data;
 519 }
 520 
 521 void ldb_module_set_private(struct ldb_module *module, void *private_data)
     /* [<][>][^][v][top][bottom][index][help] */
 522 {
 523         module->private_data = private_data;
 524 }
 525 
 526 /*
 527    helper functions to call the next module in chain
 528 */
 529 
 530 int ldb_next_request(struct ldb_module *module, struct ldb_request *request)
     /* [<][>][^][v][top][bottom][index][help] */
 531 {
 532         int ret;
 533 
 534         if (request->callback == NULL) {
 535                 ldb_set_errstring(module->ldb, "Requests MUST define callbacks");
 536                 return LDB_ERR_UNWILLING_TO_PERFORM;
 537         }
 538 
 539         switch (request->operation) {
 540         case LDB_SEARCH:
 541                 FIND_OP(module, search);
 542                 ret = module->ops->search(module, request);
 543                 break;
 544         case LDB_ADD:
 545                 FIND_OP(module, add);
 546                 ret = module->ops->add(module, request);
 547                 break;
 548         case LDB_MODIFY:
 549                 FIND_OP(module, modify);
 550                 ret = module->ops->modify(module, request);
 551                 break;
 552         case LDB_DELETE:
 553                 FIND_OP(module, del);
 554                 ret = module->ops->del(module, request);
 555                 break;
 556         case LDB_RENAME:
 557                 FIND_OP(module, rename);
 558                 ret = module->ops->rename(module, request);
 559                 break;
 560         case LDB_EXTENDED:
 561                 FIND_OP(module, extended);
 562                 ret = module->ops->extended(module, request);
 563                 break;
 564         default:
 565                 FIND_OP(module, request);
 566                 ret = module->ops->request(module, request);
 567                 break;
 568         }
 569         if (ret == LDB_SUCCESS) {
 570                 return ret;
 571         }
 572         if (!ldb_errstring(module->ldb)) {
 573                 /* Set a default error string, to place the blame somewhere */
 574                 ldb_asprintf_errstring(module->ldb, "error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
 575         }
 576         return ret;
 577 }
 578 
 579 int ldb_next_init(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 580 {
 581         module = module->next;
 582 
 583         return ldb_init_module_chain(module->ldb, module);
 584 }
 585 
 586 int ldb_next_start_trans(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 587 {
 588         FIND_OP(module, start_transaction);
 589         return module->ops->start_transaction(module);
 590 }
 591 
 592 int ldb_next_end_trans(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 593 {
 594         FIND_OP(module, end_transaction);
 595         return module->ops->end_transaction(module);
 596 }
 597 
 598 int ldb_next_del_trans(struct ldb_module *module)
     /* [<][>][^][v][top][bottom][index][help] */
 599 {
 600         FIND_OP(module, del_transaction);
 601         return module->ops->del_transaction(module);
 602 }
 603 
 604 struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb)
     /* [<][>][^][v][top][bottom][index][help] */
 605 {
 606         struct ldb_handle *h;
 607 
 608         h = talloc_zero(mem_ctx, struct ldb_handle);
 609         if (h == NULL) {
 610                 ldb_set_errstring(ldb, "Out of Memory");
 611                 return NULL;
 612         }
 613 
 614         h->status = LDB_SUCCESS;
 615         h->state = LDB_ASYNC_INIT;
 616         h->ldb = ldb;
 617 
 618         return h;
 619 }
 620 
 621 /* calls the request callback to send an entry
 622  *
 623  * params:
 624  *      req: the original request passed to your module
 625  *      msg: reply message (must be a talloc pointer, and it will be stolen
 626  *           on the ldb_reply that is sent to the callback)
 627  *      ctrls: controls to send in the reply  (must be a talloc pointer, and it will be stolen
 628  *           on the ldb_reply that is sent to the callback)
 629  */
 630 
 631 int ldb_module_send_entry(struct ldb_request *req,
     /* [<][>][^][v][top][bottom][index][help] */
 632                           struct ldb_message *msg,
 633                           struct ldb_control **ctrls)
 634 {
 635         struct ldb_reply *ares;
 636 
 637         ares = talloc_zero(req, struct ldb_reply);
 638         if (!ares) {
 639                 ldb_oom(req->handle->ldb);
 640                 req->callback(req, NULL);
 641                 return LDB_ERR_OPERATIONS_ERROR;
 642         }
 643         ares->type = LDB_REPLY_ENTRY;
 644         ares->message = talloc_steal(ares, msg);
 645         ares->controls = talloc_steal(ares, ctrls);
 646         ares->error = LDB_SUCCESS;
 647 
 648         return req->callback(req, ares);
 649 }
 650 
 651 /* calls the request callback to send an referrals
 652  *
 653  * params:
 654  *      req: the original request passed to your module
 655  *      ref: referral string (must be a talloc pointeri, steal)
 656  */
 657 
 658 int ldb_module_send_referral(struct ldb_request *req,
     /* [<][>][^][v][top][bottom][index][help] */
 659                                            char *ref)
 660 {
 661         struct ldb_reply *ares;
 662 
 663         ares = talloc_zero(req, struct ldb_reply);
 664         if (!ares) {
 665                 ldb_oom(req->handle->ldb);
 666                 req->callback(req, NULL);
 667                 return LDB_ERR_OPERATIONS_ERROR;
 668         }
 669         ares->type = LDB_REPLY_REFERRAL;
 670         ares->referral = talloc_steal(ares, ref);
 671         ares->error = LDB_SUCCESS;
 672 
 673         return req->callback(req, ares);
 674 }
 675 
 676 /* calls the original request callback
 677  *
 678  * params:
 679  *      req:   the original request passed to your module
 680  *      ctrls: controls to send in the reply (must be a talloc pointer, steal)
 681  *      response: results for extended request (steal)
 682  *      error: LDB_SUCCESS for a succesful return
 683  *             any other ldb error otherwise
 684  */
 685 int ldb_module_done(struct ldb_request *req,
     /* [<][>][^][v][top][bottom][index][help] */
 686                     struct ldb_control **ctrls,
 687                     struct ldb_extended *response,
 688                     int error)
 689 {
 690         struct ldb_reply *ares;
 691 
 692         ares = talloc_zero(req, struct ldb_reply);
 693         if (!ares) {
 694                 ldb_oom(req->handle->ldb);
 695                 req->callback(req, NULL);
 696                 return LDB_ERR_OPERATIONS_ERROR;
 697         }
 698         ares->type = LDB_REPLY_DONE;
 699         ares->controls = talloc_steal(ares, ctrls);
 700         ares->response = talloc_steal(ares, response);
 701         ares->error = error;
 702 
 703         req->callback(req, ares);
 704         return error;
 705 }
 706 
 707 /* to be used *only* in modules init functions.
 708  * this function i synchronous and will register
 709  * the requested OID in the rootdse module if present
 710  * otherwise it will return an error */
 711 int ldb_mod_register_control(struct ldb_module *module, const char *oid)
     /* [<][>][^][v][top][bottom][index][help] */
 712 {
 713         struct ldb_request *req;
 714         int ret;
 715 
 716         req = talloc_zero(module, struct ldb_request);
 717         if (req == NULL) {
 718                 return LDB_ERR_OPERATIONS_ERROR;
 719         }
 720 
 721         req->operation = LDB_REQ_REGISTER_CONTROL;
 722         req->op.reg_control.oid = oid;
 723         req->callback = ldb_op_default_callback;
 724 
 725         ldb_set_timeout(module->ldb, req, 0);
 726 
 727         req->handle = ldb_handle_new(req, module->ldb);
 728         if (req->handle == NULL) {
 729                 return LDB_ERR_OPERATIONS_ERROR;
 730         }
 731 
 732         ret = ldb_request(module->ldb, req);
 733         if (ret == LDB_SUCCESS) {
 734                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
 735         }
 736         talloc_free(req);
 737 
 738         return ret;
 739 }
 740 
 741 #ifndef STATIC_LIBLDB_MODULES
 742 
 743 #ifdef HAVE_LDB_LDAP
 744 #define LDAP_BACKEND LDB_BACKEND(ldap), LDB_BACKEND(ldapi), LDB_BACKEND(ldaps),
 745 #else
 746 #define LDAP_BACKEND
 747 #endif
 748 
 749 #ifdef HAVE_LDB_SQLITE3
 750 #define SQLITE3_BACKEND LDB_BACKEND(sqlite3),
 751 #else
 752 #define SQLITE3_BACKEND
 753 #endif
 754 
 755 #define STATIC_LIBLDB_MODULES \
 756         LDB_BACKEND(tdb),       \
 757         LDAP_BACKEND    \
 758         SQLITE3_BACKEND \
 759         LDB_MODULE(operational),        \
 760         LDB_MODULE(rdn_name),   \
 761         LDB_MODULE(paged_results),      \
 762         LDB_MODULE(server_sort),                \
 763         LDB_MODULE(asq), \
 764         NULL
 765 #endif
 766 
 767 /*
 768  * this is a bit hacked, as STATIC_LIBLDB_MODULES contains ','
 769  * between the elements and we want to autogenerate the
 770  * extern struct declarations, so we do some hacks and let the
 771  * ',' appear in an unused function prototype.
 772  */
 773 #undef NULL
 774 #define NULL LDB_MODULE(NULL),
 775 
 776 #define LDB_BACKEND(name) \
 777         int); \
 778         extern const struct ldb_backend_ops ldb_ ## name ## _backend_ops;\
 779         extern void ldb_noop ## name (int
 780 #define LDB_MODULE(name) \
 781         int); \
 782         extern const struct ldb_module_ops ldb_ ## name ## _module_ops;\
 783         extern void ldb_noop ## name (int
 784 
 785 extern void ldb_start_noop(int,
 786 STATIC_LIBLDB_MODULES
 787 int);
 788 
 789 #undef NULL
 790 #define NULL { \
 791         .backend_ops = (void *)0, \
 792         .module_ops = (void *)0 \
 793 }
 794 
 795 #undef LDB_BACKEND
 796 #define LDB_BACKEND(name) { \
 797         .backend_ops = &ldb_ ## name ## _backend_ops, \
 798         .module_ops = (void *)0 \
 799 }
 800 #undef LDB_MODULE
 801 #define LDB_MODULE(name) { \
 802         .backend_ops = (void *)0, \
 803         .module_ops = &ldb_ ## name ## _module_ops \
 804 }
 805 
 806 static const struct ldb_builtins builtins[] = {
 807         STATIC_LIBLDB_MODULES
 808 };

/* [<][>][^][v][top][bottom][index][help] */