Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/lib/util/util_ldb.c

    r414 r745  
    2222
    2323#include "includes.h"
    24 #include "lib/ldb/include/ldb.h"
     24#include <ldb.h>
    2525#include "../lib/util/util_ldb.h"
     26
    2627/*
    27   search the sam for the specified attributes - va_list variant
    28 */
     28 * search the LDB for the specified attributes - va_list variant
     29 */
    2930int gendb_search_v(struct ldb_context *ldb,
    3031                   TALLOC_CTX *mem_ctx,
     
    3334                   const char * const *attrs,
    3435                   const char *format,
    35                    va_list ap) 
     36                   va_list ap)
    3637{
    3738        enum ldb_scope scope = LDB_SCOPE_SUBTREE;
     
    5556
    5657        if (ret == LDB_SUCCESS) {
    57                 talloc_steal(mem_ctx, res->msgs);
    58 
    5958                DEBUG(6,("gendb_search_v: %s %s -> %d\n",
    6059                         basedn?ldb_dn_get_linearized(basedn):"NULL",
     
    6261
    6362                ret = res->count;
    64                 *msgs = res->msgs;
     63                if (msgs != NULL) {
     64                        *msgs = talloc_steal(mem_ctx, res->msgs);
     65                }
    6566                talloc_free(res);
    6667        } else if (scope == LDB_SCOPE_BASE && ret == LDB_ERR_NO_SUCH_OBJECT) {
    6768                ret = 0;
    68                 *msgs = NULL;
     69                if (msgs != NULL) *msgs = NULL;
    6970        } else {
    7071                DEBUG(4,("gendb_search_v: search failed: %s\n",
    7172                                        ldb_errstring(ldb)));
    7273                ret = -1;
     74                if (msgs != NULL) *msgs = NULL;
    7375        }
    7476
     
    7981
    8082/*
    81   search the LDB for the specified attributes - varargs variant
    82 */
     83 * search the LDB for the specified attributes - varargs variant
     84 */
    8385int gendb_search(struct ldb_context *ldb,
    8486                 TALLOC_CTX *mem_ctx,
     
    8688                 struct ldb_message ***res,
    8789                 const char * const *attrs,
    88                  const char *format, ...) 
     90                 const char *format, ...)
    8991{
    9092        va_list ap;
     
    99101
    100102/*
    101   search the LDB for a specified record (by DN)
    102 */
    103 
     103 * search the LDB for a specified record (by DN)
     104 */
    104105int gendb_search_dn(struct ldb_context *ldb,
    105106                 TALLOC_CTX *mem_ctx,
     
    111112}
    112113
    113 /*
    114   setup some initial ldif in a ldb
    115 */
    116 int gendb_add_ldif(struct ldb_context *ldb, const char *ldif_string)
    117 {
    118         struct ldb_ldif *ldif;
    119         int ret;
    120         ldif = ldb_ldif_read_string(ldb, &ldif_string);
    121         if (ldif == NULL) return -1;
    122         ret = ldb_add(ldb, ldif->msg);
    123         talloc_free(ldif);
    124         return ret;
    125 }
    126 
    127 char *wrap_casefold(void *context, void *mem_ctx, const char *s, size_t n)
    128 {
    129         return strupper_talloc_n(mem_ctx, s, n);
    130 }
    131 
    132 
    133 
    134 /*
    135   search the LDB for a single record, with the extended_dn control
    136   return LDB_SUCCESS on success, or an ldb error code on error
    137 
    138   if the search returns 0 entries, return LDB_ERR_NO_SUCH_OBJECT
    139   if the search returns more than 1 entry, return LDB_ERR_CONSTRAINT_VIOLATION
    140 */
    141 int gendb_search_single_extended_dn(struct ldb_context *ldb,
    142                                     TALLOC_CTX *mem_ctx,
    143                                     struct ldb_dn *basedn,
    144                                     enum ldb_scope scope,
    145                                     struct ldb_message **msg,
    146                                     const char * const *attrs,
    147                                     const char *format, ...)
    148 {
    149         va_list ap;
    150         int ret;
    151         struct ldb_request *req;
    152         char *filter;
    153         TALLOC_CTX *tmp_ctx;
    154         struct ldb_result *res;
    155         struct ldb_extended_dn_control *ctrl;
    156 
    157         tmp_ctx = talloc_new(mem_ctx);
    158 
    159         res = talloc_zero(tmp_ctx, struct ldb_result);
    160         if (!res) {
    161                 return LDB_ERR_OPERATIONS_ERROR;
    162         }
    163 
    164         va_start(ap, format);
    165         filter = talloc_vasprintf(tmp_ctx, format, ap);
    166         va_end(ap);
    167 
    168         if (filter == NULL) {
    169                 talloc_free(tmp_ctx);
    170                 return LDB_ERR_OPERATIONS_ERROR;
    171         }
    172 
    173         ret = ldb_build_search_req(&req, ldb, tmp_ctx,
    174                                    basedn,
    175                                    scope,
    176                                    filter,
    177                                    attrs,
    178                                    NULL,
    179                                    res,
    180                                    ldb_search_default_callback,
    181                                    NULL);
    182         if (ret != LDB_SUCCESS) {
    183                 talloc_free(tmp_ctx);
    184                 return ret;
    185         }
    186 
    187         ctrl = talloc(tmp_ctx, struct ldb_extended_dn_control);
    188         if (ctrl == NULL) {
    189                 talloc_free(tmp_ctx);
    190                 return LDB_ERR_OPERATIONS_ERROR;               
    191         }
    192 
    193         ctrl->type = 1;
    194 
    195         ret = ldb_request_add_control(req, LDB_CONTROL_EXTENDED_DN_OID, true, ctrl);
    196         if (ret != LDB_SUCCESS) {
    197                 return ret;
    198         }
    199 
    200         ret = ldb_request(ldb, req);
    201         if (ret == LDB_SUCCESS) {
    202                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
    203         }
    204 
    205         if (ret != LDB_SUCCESS) {
    206                 talloc_free(tmp_ctx);
    207                 return ret;
    208         }
    209 
    210         if (res->count == 0) {
    211                 talloc_free(tmp_ctx);
    212                 return LDB_ERR_NO_SUCH_OBJECT;
    213         }
    214 
    215         if (res->count > 1) {
    216                 /* the function is only supposed to return a single entry */
    217                 DEBUG(0,(__location__ ": More than one return for baseDN %s  filter %s\n",
    218                          ldb_dn_get_linearized(basedn), filter));
    219                 talloc_free(tmp_ctx);
    220                 return LDB_ERR_CONSTRAINT_VIOLATION;
    221         }
    222 
    223         *msg = talloc_steal(mem_ctx, res->msgs[0]);
    224 
    225         talloc_free(tmp_ctx);
    226 
    227         return LDB_SUCCESS;
    228 }
Note: See TracChangeset for help on using the changeset viewer.