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

📄 ldb.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	struct ldb_context *wrap;	struct ldb_message *attrs_msg;	if (location == NULL)		return WERR_INVALID_PARAM;	wrap = ldb_wrap_connect(parent_ctx, ev_ctx, lp_ctx,				location, session_info, credentials, 0, NULL);	if (wrap == NULL) {		DEBUG(1, (__FILE__": unable to connect\n"));		return WERR_FOOBAR;	}	attrs_msg = ldb_msg_new(wrap);	W_ERROR_HAVE_NO_MEMORY(attrs_msg);	attrs_msg->dn = ldb_dn_new(attrs_msg, wrap, "@ATTRIBUTES");	W_ERROR_HAVE_NO_MEMORY(attrs_msg->dn);	ldb_msg_add_string(attrs_msg, "key", "CASE_INSENSITIVE");	ldb_msg_add_string(attrs_msg, "value", "CASE_INSENSITIVE");	ldb_add(wrap, attrs_msg);	ldb_set_debug_stderr(wrap);	kd = talloc_zero(parent_ctx, struct ldb_key_data);	kd->key.ops = &reg_backend_ldb;	kd->ldb = talloc_reference(kd, wrap);	talloc_set_destructor (kd, reg_close_ldb_key);	kd->dn = ldb_dn_new(kd, wrap, "hive=NONE");	*k = (struct hive_key *)kd;	return WERR_OK;}static WERROR ldb_add_key(TALLOC_CTX *mem_ctx, const struct hive_key *parent,			  const char *name, const char *classname,			  struct security_descriptor *sd,			  struct hive_key **newkey){	struct ldb_key_data *parentkd = discard_const_p(struct ldb_key_data, parent);	struct ldb_message *msg;	struct ldb_key_data *newkd;	int ret;	msg = ldb_msg_new(mem_ctx);	msg->dn = reg_path_to_ldb(msg, parent, name, NULL);	ldb_msg_add_string(msg, "key", talloc_strdup(mem_ctx, name));	if (classname != NULL)		ldb_msg_add_string(msg, "classname",				   talloc_strdup(mem_ctx, classname));	ret = ldb_add(parentkd->ldb, msg);	if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) {		return WERR_ALREADY_EXISTS;	}	if (ret != LDB_SUCCESS) {		DEBUG(1, ("ldb_add: %s\n", ldb_errstring(parentkd->ldb)));		return WERR_FOOBAR;	}	DEBUG(2, ("key added: %s\n", ldb_dn_get_linearized(msg->dn)));	newkd = talloc_zero(mem_ctx, struct ldb_key_data);	newkd->ldb = talloc_reference(newkd, parentkd->ldb);	newkd->key.ops = &reg_backend_ldb;	newkd->dn = talloc_steal(newkd, msg->dn);	*newkey = (struct hive_key *)newkd;	/* reset cache */	talloc_free(parentkd->subkeys);	parentkd->subkeys = NULL;	return WERR_OK;}static WERROR ldb_del_value (struct hive_key *key, const char *child){	int ret;	struct ldb_key_data *kd = talloc_get_type(key, struct ldb_key_data);	struct ldb_dn *childdn;	childdn = ldb_dn_copy(kd->ldb, kd->dn);	if (!ldb_dn_add_child_fmt(childdn, "value=%s",				  reg_ldb_escape(childdn, child)))	{		talloc_free(childdn);		return WERR_FOOBAR;	}	ret = ldb_delete(kd->ldb, childdn);	talloc_free(childdn);	if (ret == LDB_ERR_NO_SUCH_OBJECT) {		return WERR_BADFILE;	} else if (ret != LDB_SUCCESS) {		DEBUG(1, ("ldb_del_value: %s\n", ldb_errstring(kd->ldb)));		return WERR_FOOBAR;	}	/* reset cache */	talloc_free(kd->values);	kd->values = NULL;	return WERR_OK;}static WERROR ldb_del_key(const struct hive_key *key, const char *name){	int i, ret;	struct ldb_key_data *parentkd = talloc_get_type(key, struct ldb_key_data);	struct ldb_dn *ldap_path;	TALLOC_CTX *mem_ctx = talloc_init("ldb_del_key");	struct ldb_context *c = parentkd->ldb;	struct ldb_result *res_keys;	struct ldb_result *res_vals;	WERROR werr;	struct hive_key *hk;	/* Verify key exists by opening it */	werr = ldb_open_key(mem_ctx, key, name, &hk);	if (!W_ERROR_IS_OK(werr)) {		talloc_free(mem_ctx);		return werr;	}	ldap_path = reg_path_to_ldb(mem_ctx, key, name, NULL);	if (!ldap_path) {		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	/* Search for subkeys */	ret = ldb_search(c, ldap_path, LDB_SCOPE_ONELEVEL,			 "(key=*)", NULL, &res_keys);	if (ret != LDB_SUCCESS) {		DEBUG(0, ("Error getting subkeys for '%s': %s\n",		      ldb_dn_get_linearized(ldap_path), ldb_errstring(c)));		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	/* Search for values */	ret = ldb_search(c, ldap_path, LDB_SCOPE_ONELEVEL,			 "(value=*)", NULL, &res_vals);	if (ret != LDB_SUCCESS) {		DEBUG(0, ("Error getting values for '%s': %s\n",		      ldb_dn_get_linearized(ldap_path), ldb_errstring(c)));		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	/* Start an explicit transaction */	ret = ldb_transaction_start(c);	if (ret != LDB_SUCCESS) {		DEBUG(0, ("ldb_transaction_start: %s\n", ldb_errstring(c)));		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	if (res_keys->count || res_vals->count)	{		/* Delete any subkeys */		for (i = 0; i < res_keys->count; i++)		{			werr = ldb_del_key(hk, ldb_msg_find_attr_as_string(							res_keys->msgs[i],							"key", NULL));			if (!W_ERROR_IS_OK(werr)) {				ret = ldb_transaction_cancel(c);				talloc_free(mem_ctx);				return werr;			}		}		/* Delete any values */		for (i = 0; i < res_vals->count; i++)		{			werr = ldb_del_value(hk, ldb_msg_find_attr_as_string(							res_vals->msgs[i],							"value", NULL));			if (!W_ERROR_IS_OK(werr)) {				ret = ldb_transaction_cancel(c);				talloc_free(mem_ctx);				return werr;			}		}	}	/* Delete the key itself */	ret = ldb_delete(c, ldap_path);	if (ret != LDB_SUCCESS)	{		DEBUG(1, ("ldb_del_key: %s\n", ldb_errstring(c)));		ret = ldb_transaction_cancel(c);		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	/* Commit the transaction */	ret = ldb_transaction_commit(c);	if (ret != LDB_SUCCESS)	{		DEBUG(0, ("ldb_transaction_commit: %s\n", ldb_errstring(c)));		ret = ldb_transaction_cancel(c);		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	talloc_free(mem_ctx);	/* reset cache */	talloc_free(parentkd->subkeys);	parentkd->subkeys = NULL;	return WERR_OK;}static WERROR ldb_set_value(struct hive_key *parent,			    const char *name, uint32_t type,			    const DATA_BLOB data){	struct ldb_message *msg;	struct ldb_key_data *kd = talloc_get_type(parent, struct ldb_key_data);	int ret;	TALLOC_CTX *mem_ctx = talloc_init("ldb_set_value");	msg = reg_ldb_pack_value(kd->ldb, mem_ctx, name, type, data);	msg->dn = ldb_dn_copy(msg, kd->dn);	if (!ldb_dn_add_child_fmt(msg->dn, "value=%s",				  reg_ldb_escape(mem_ctx, name)))	{		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	ret = ldb_add(kd->ldb, msg);	if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) {		int i;		for (i = 0; i < msg->num_elements; i++) {			msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;		}		ret = ldb_modify(kd->ldb, msg);	}	if (ret != LDB_SUCCESS) {		DEBUG(1, ("ldb_msg_add: %s\n", ldb_errstring(kd->ldb)));		talloc_free(mem_ctx);		return WERR_FOOBAR;	}	/* reset cache */	talloc_free(kd->values);	kd->values = NULL;	talloc_free(mem_ctx);	return WERR_OK;}static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,			       const struct hive_key *key,			       const char **classname,			       uint32_t *num_subkeys,			       uint32_t *num_values,			       NTTIME *last_change_time,			       uint32_t *max_subkeynamelen,			       uint32_t *max_valnamelen,			       uint32_t *max_valbufsize){	struct ldb_key_data *kd = talloc_get_type(key, struct ldb_key_data);	if (kd->subkeys == NULL) {		W_ERROR_NOT_OK_RETURN(cache_subkeys(kd));	}	if (kd->values == NULL) {		W_ERROR_NOT_OK_RETURN(cache_values(kd));	}	/* FIXME */	if (classname != NULL)		*classname = NULL;	if (num_subkeys != NULL) {		*num_subkeys = kd->subkey_count;	}	if (num_values != NULL) {		*num_values = kd->value_count;	}	if (last_change_time != NULL)		*last_change_time = 0;	if (max_subkeynamelen != NULL) {		int i;		struct ldb_message_element *el;		*max_subkeynamelen = 0;		for (i = 0; i < kd->subkey_count; i++) {			el = ldb_msg_find_element(kd->subkeys[i], "key");			*max_subkeynamelen = MAX(*max_subkeynamelen, el->values[0].length);		}	}	if (max_valnamelen != NULL || max_valbufsize != NULL) {		int i;		struct ldb_message_element *el;		W_ERROR_NOT_OK_RETURN(cache_values(kd));		if (max_valbufsize != NULL)			*max_valbufsize = 0;		if (max_valnamelen != NULL)			*max_valnamelen = 0;		for (i = 0; i < kd->value_count; i++) {			if (max_valnamelen != NULL) {				el = ldb_msg_find_element(kd->values[i], "value");				*max_valnamelen = MAX(*max_valnamelen, el->values[0].length);			}			if (max_valbufsize != NULL) {				DATA_BLOB data;				reg_ldb_unpack_value(mem_ctx, 						     lp_iconv_convenience(global_loadparm),						     kd->values[i], NULL, 						     NULL, &data);				*max_valbufsize = MAX(*max_valbufsize, data.length);				talloc_free(data.data);			}		}	}	return WERR_OK;}static struct hive_operations reg_backend_ldb = {	.name = "ldb",	.add_key = ldb_add_key,	.del_key = ldb_del_key,	.get_key_by_name = ldb_open_key,	.enum_value = ldb_get_value_by_id,	.enum_key = ldb_get_subkey_by_id,	.set_value = ldb_set_value,	.get_value_by_name = ldb_get_value,	.delete_value = ldb_del_value,	.get_key_info = ldb_get_key_info,};

⌨️ 快捷键说明

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