d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/*
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Authors:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Pavel Březina <pbrezina@redhat.com>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Copyright (C) 2016 Red Hat
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is free software; you can redistribute it and/or modify
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina it under the terms of the GNU General Public License as published by
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (at your option) any later version.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is distributed in the hope that it will be useful,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina GNU General Public License for more details.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina You should have received a copy of the GNU General Public License
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <talloc.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <tevent.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <dhash.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "sbus/sssd_dbus.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp_private.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/dlinklist.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/util.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic int
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_sbus_req_item_destructor(struct dp_sbus_req_item *item)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DLIST_REMOVE(item->parent->list, item);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return 0;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic int
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_table_value_destructor(struct dp_table_value *value)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *next_item;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *item;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Removing [%s] from reply table\n", value->key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_table_del(value->table, value->key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina for (item = value->list; item != NULL; item = next_item) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina next_item = item->next;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(item);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return 0;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic struct dp_sbus_req_item *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_sbus_req_item_new(struct dp_table_value *value,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *item;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Attach to sbus_request so we ensure that this sbus_req is removed
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * from the list when it is unexpectedly freed, for example when
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina * client connection is dropped. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina item = talloc_zero(sbus_req, struct dp_sbus_req_item);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (item == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero() failed\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina item->parent = value;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina item->sbus_req = sbus_req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_set_destructor(item, dp_sbus_req_item_destructor);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return item;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinachar *dp_req_table_key(TALLOC_CTX *mem_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_targets target,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_methods method,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina uint32_t dp_flags,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *custom_part)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *str = custom_part == NULL ? "(null)" : custom_part;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return talloc_asprintf(mem_ctx, "%u:%u:%#.4x:%s",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina target, method, dp_flags, str);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_req_table_init(TALLOC_CTX *mem_ctx, hash_table_t **_table)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return sss_hash_create(mem_ctx, 100, _table);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_table_value *dp_req_table_lookup(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_key_t hkey;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_value_t hvalue;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int hret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.type = HASH_KEY_STRING;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.str = discard_const_p(char, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hret = hash_lookup(table, &hkey, &hvalue);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (hret == HASH_ERROR_KEY_NOT_FOUND) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina } else if (hret != HASH_SUCCESS) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to search hash table [%d]\n", hret);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return hvalue.ptr;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic errno_t dp_req_table_new_item(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_key_t hkey;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_value_t hvalue;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_table_value *table_value;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int hret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Attach it to request. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina table_value = talloc_zero(req, struct dp_table_value);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (table_value == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina table_value->table = table;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina table_value->key = talloc_strdup(table_value, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (table_value->key == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina table_value->req = req;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina table_value->list = dp_sbus_req_item_new(table_value, sbus_req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (table_value->list == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_set_destructor(table_value, dp_table_value_destructor);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.type = HASH_KEY_STRING;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.str = discard_const_p(char, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hvalue.type = HASH_VALUE_PTR;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hvalue.ptr = table_value;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hret = hash_enter(table, &hkey, &hvalue);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (hret != HASH_SUCCESS) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to enter value into hash table "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "[%d]\n", hret);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = EIO;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadone:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(table_value);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic errno_t dp_req_table_mod_item(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_table_value *table_value,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_sbus_req_item *item;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina item = dp_sbus_req_item_new(table_value, sbus_req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (item == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DLIST_ADD(table_value->list, item);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_req_table_add(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_req *req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_request *sbus_req)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_table_value *table_value;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (sbus_req == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "SBUS request cannot be NULL\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EINVAL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina table_value = dp_req_table_lookup(table, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (table_value == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (req == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Tevent request cannot be NULL\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EINVAL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return dp_req_table_new_item(table, key, req, sbus_req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return dp_req_table_mod_item(table, table_value, sbus_req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_req_table_del(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_key_t hkey;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int hret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (table == NULL || key == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.type = HASH_KEY_STRING;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.str = discard_const_p(char, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hret = hash_delete(table, &hkey);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (hret != HASH_SUCCESS && hret != HASH_ERROR_KEY_NOT_FOUND) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to remove key from table [%d]\n",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hret);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinavoid dp_req_table_del_and_free(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_table_value *value;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina value = dp_req_table_lookup(table, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (value == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* We're done here. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_req_table_del(table, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(value);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinabool dp_req_table_has_key(hash_table_t *table,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *key)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hash_key_t hkey;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.type = HASH_KEY_STRING;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hkey.str = discard_const_p(char, key);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return hash_has_key(table, &hkey);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}