Changeset 745 for trunk/server/lib/util/util_ldb.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/lib/util/util_ldb.c
r414 r745 22 22 23 23 #include "includes.h" 24 #include "lib/ldb/include/ldb.h"24 #include <ldb.h> 25 25 #include "../lib/util/util_ldb.h" 26 26 27 /* 27 search the samfor the specified attributes - va_list variant28 */28 * search the LDB for the specified attributes - va_list variant 29 */ 29 30 int gendb_search_v(struct ldb_context *ldb, 30 31 TALLOC_CTX *mem_ctx, … … 33 34 const char * const *attrs, 34 35 const char *format, 35 va_list ap) 36 va_list ap) 36 37 { 37 38 enum ldb_scope scope = LDB_SCOPE_SUBTREE; … … 55 56 56 57 if (ret == LDB_SUCCESS) { 57 talloc_steal(mem_ctx, res->msgs);58 59 58 DEBUG(6,("gendb_search_v: %s %s -> %d\n", 60 59 basedn?ldb_dn_get_linearized(basedn):"NULL", … … 62 61 63 62 ret = res->count; 64 *msgs = res->msgs; 63 if (msgs != NULL) { 64 *msgs = talloc_steal(mem_ctx, res->msgs); 65 } 65 66 talloc_free(res); 66 67 } else if (scope == LDB_SCOPE_BASE && ret == LDB_ERR_NO_SUCH_OBJECT) { 67 68 ret = 0; 68 *msgs = NULL;69 if (msgs != NULL) *msgs = NULL; 69 70 } else { 70 71 DEBUG(4,("gendb_search_v: search failed: %s\n", 71 72 ldb_errstring(ldb))); 72 73 ret = -1; 74 if (msgs != NULL) *msgs = NULL; 73 75 } 74 76 … … 79 81 80 82 /* 81 search the LDB for the specified attributes - varargs variant82 */83 * search the LDB for the specified attributes - varargs variant 84 */ 83 85 int gendb_search(struct ldb_context *ldb, 84 86 TALLOC_CTX *mem_ctx, … … 86 88 struct ldb_message ***res, 87 89 const char * const *attrs, 88 const char *format, ...) 90 const char *format, ...) 89 91 { 90 92 va_list ap; … … 99 101 100 102 /* 101 search the LDB for a specified record (by DN) 102 */ 103 103 * search the LDB for a specified record (by DN) 104 */ 104 105 int gendb_search_dn(struct ldb_context *ldb, 105 106 TALLOC_CTX *mem_ctx, … … 111 112 } 112 113 113 /*114 setup some initial ldif in a ldb115 */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 control136 return LDB_SUCCESS on success, or an ldb error code on error137 138 if the search returns 0 entries, return LDB_ERR_NO_SUCH_OBJECT139 if the search returns more than 1 entry, return LDB_ERR_CONSTRAINT_VIOLATION140 */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.