⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldb_controls.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    ldb database library   Copyright (C) Simo Sorce  2005     ** 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 3 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, see <http://www.gnu.org/licenses/>.*//* *  Name: ldb_controls.c * *  Component: ldb controls utility functions * *  Description: helper functions for control modules * *  Author: Simo Sorce */#include "ldb_includes.h"/* check if a control with the specified "oid" exist and return it *//* returns NULL if not found */struct ldb_control *ldb_request_get_control(struct ldb_request *req, const char *oid){	int i;	/* check if there's a paged request control */	if (req->controls != NULL) {		for (i = 0; req->controls[i]; i++) {			if (strcmp(oid, req->controls[i]->oid) == 0) {				break;			}		}		return req->controls[i];	}	return NULL;}/* saves the current controls list into the "saver" and replace the one in req with a new one excludingthe "exclude" control *//* returns False on error */int save_controls(struct ldb_control *exclude, struct ldb_request *req, struct ldb_control ***saver){	struct ldb_control **lcs;	int i, j;	*saver = req->controls;	for (i = 0; req->controls[i]; i++);	if (i == 1) {		req->controls = NULL;		return 1;	}	lcs = talloc_array(req, struct ldb_control *, i);	if (!lcs) {		return 0;	}	for (i = 0, j = 0; (*saver)[i]; i++) {		if (exclude == (*saver)[i]) continue;		lcs[j] = (*saver)[i];		j++;	}	lcs[j] = NULL;	req->controls = lcs;	return 1;}/* check if there's any control marked as critical in the list *//* return True if any, False if none */int check_critical_controls(struct ldb_control **controls){	int i;	if (controls == NULL) {		return 0;	}	for (i = 0; controls[i]; i++) {		if (controls[i]->critical) {			return 1;		}	}	return 0;}int ldb_request_add_control(struct ldb_request *req, const char *oid, bool critical, void *data){	unsigned n;	struct ldb_control **ctrls;	struct ldb_control *ctrl;	for (n=0; req->controls && req->controls[n];) { n++; }	ctrls = talloc_realloc(req, req->controls,			       struct ldb_control *,			       n + 2);	if (!ctrls) return LDB_ERR_OPERATIONS_ERROR;	req->controls = ctrls;	ctrls[n] = NULL;	ctrls[n+1] = NULL;	ctrl = talloc(ctrls, struct ldb_control);	if (!ctrl) return LDB_ERR_OPERATIONS_ERROR;	ctrl->oid	= talloc_strdup(ctrl, oid);	if (!ctrl->oid) return LDB_ERR_OPERATIONS_ERROR;	ctrl->critical	= critical;	ctrl->data	= data;	ctrls[n] = ctrl;	return LDB_SUCCESS;}/* Parse controls from the format used on the command line and in ejs */struct ldb_control **ldb_parse_control_strings(struct ldb_context *ldb, void *mem_ctx, const char **control_strings){	int i;	struct ldb_control **ctrl;	char *error_string = NULL;	if (control_strings == NULL || control_strings[0] == NULL)		return NULL;	for (i = 0; control_strings[i]; i++);	ctrl = talloc_array(mem_ctx, struct ldb_control *, i + 1);	for (i = 0; control_strings[i]; i++) {		if (strncmp(control_strings[i], "vlv:", 4) == 0) {			struct ldb_vlv_req_control *control;			const char *p;			char attr[1024];			char ctxid[1024];			int crit, bc, ac, os, cc, ret;			attr[0] = '\0';			ctxid[0] = '\0';			p = &(control_strings[i][4]);			ret = sscanf(p, "%d:%d:%d:%d:%d:%1023[^$]", &crit, &bc, &ac, &os, &cc, ctxid);			if (ret < 5) {				ret = sscanf(p, "%d:%d:%d:%1023[^:]:%1023[^$]", &crit, &bc, &ac, attr, ctxid);			}			       			if ((ret < 4) || (crit < 0) || (crit > 1)) {				error_string = talloc_asprintf(mem_ctx, "invalid server_sort control syntax\n");				error_string = talloc_asprintf_append(error_string, " syntax: crit(b):bc(n):ac(n):<os(n):cc(n)|attr(s)>[:ctxid(o)]\n");				error_string = talloc_asprintf_append(error_string, "   note: b = boolean, n = number, s = string, o = b64 binary blob");				ldb_set_errstring(ldb, error_string);				talloc_free(error_string);				return NULL;			}			if (!(ctrl[i] = talloc(ctrl, struct ldb_control))) {				ldb_oom(ldb);				return NULL;			}			ctrl[i]->oid = LDB_CONTROL_VLV_REQ_OID;			ctrl[i]->critical = crit;			if (!(control = talloc(ctrl[i],					       struct ldb_vlv_req_control))) {				ldb_oom(ldb);				return NULL;			}			control->beforeCount = bc;			control->afterCount = ac;			if (attr[0]) {				control->type = 1;				control->match.gtOrEq.value = talloc_strdup(control, attr);				control->match.gtOrEq.value_len = strlen(attr);			} else {				control->type = 0;				control->match.byOffset.offset = os;				control->match.byOffset.contentCount = cc;			}			if (ctxid[0]) {				control->ctxid_len = ldb_base64_decode(ctxid);				control->contextId = (char *)talloc_memdup(control, ctxid, control->ctxid_len);			} else {				control->ctxid_len = 0;				control->contextId = NULL;			}			ctrl[i]->data = control;			continue;		}		if (strncmp(control_strings[i], "dirsync:", 8) == 0) {			struct ldb_dirsync_control *control;			const char *p;			char cookie[1024];			int crit, flags, max_attrs, ret;		       			cookie[0] = '\0';			p = &(control_strings[i][8]);			ret = sscanf(p, "%d:%d:%d:%1023[^$]", &crit, &flags, &max_attrs, cookie);			if ((ret < 3) || (crit < 0) || (crit > 1) || (flags < 0) || (max_attrs < 0)) {				error_string = talloc_asprintf(mem_ctx, "invalid dirsync control syntax\n");				error_string = talloc_asprintf_append(error_string, " syntax: crit(b):flags(n):max_attrs(n)[:cookie(o)]\n");				error_string = talloc_asprintf_append(error_string, "   note: b = boolean, n = number, o = b64 binary blob");				ldb_set_errstring(ldb, error_string);				talloc_free(error_string);				return NULL;			}			/* w2k3 seems to ignore the parameter,			 * but w2k sends a wrong cookie when this value is to small			 * this would cause looping forever, while getting			 * the same data and same cookie forever			 */			if (max_attrs == 0) max_attrs = 0x0FFFFFFF;			ctrl[i] = talloc(ctrl, struct ldb_control);			ctrl[i]->oid = LDB_CONTROL_DIRSYNC_OID;			ctrl[i]->critical = crit;			control = talloc(ctrl[i], struct ldb_dirsync_control);			control->flags = flags;			control->max_attributes = max_attrs;			if (*cookie) {				control->cookie_len = ldb_base64_decode(cookie);				control->cookie = (char *)talloc_memdup(control, cookie, control->cookie_len);			} else {				control->cookie = NULL;				control->cookie_len = 0;			}			ctrl[i]->data = control;			continue;		}		if (strncmp(control_strings[i], "asq:", 4) == 0) {			struct ldb_asq_control *control;			const char *p;			char attr[256];			int crit, ret;			attr[0] = '\0';			p = &(control_strings[i][4]);			ret = sscanf(p, "%d:%255[^$]", &crit, attr);			if ((ret != 2) || (crit < 0) || (crit > 1) || (attr[0] == '\0')) {				error_string = talloc_asprintf(mem_ctx, "invalid asq control syntax\n");				error_string = talloc_asprintf_append(error_string, " syntax: crit(b):attr(s)\n");				error_string = talloc_asprintf_append(error_string, "   note: b = boolean, s = string");				ldb_set_errstring(ldb, error_string);				talloc_free(error_string);				return NULL;			}			ctrl[i] = talloc(ctrl, struct ldb_control);			if (!ctrl[i]) {				ldb_oom(ldb);				return NULL;			}			ctrl[i]->oid = LDB_CONTROL_ASQ_OID;			ctrl[i]->critical = crit;			control = talloc(ctrl[i], struct ldb_asq_control);			control->request = 1;			control->source_attribute = talloc_strdup(control, attr);			control->src_attr_len = strlen(attr);			ctrl[i]->data = control;			continue;		}		if (strncmp(control_strings[i], "extended_dn:", 12) == 0) {			struct ldb_extended_dn_control *control;			const char *p;			int crit, type, ret;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -