cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/*
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek SSSD
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Async LDAP Helper routines for autofs
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Authors:
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Jakub Hrozek <jhrozek@redhat.com>
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Copyright (C) 2012 Red Hat
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek This program is free software; you can redistribute it and/or modify
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek it under the terms of the GNU General Public License as published by
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek the Free Software Foundation; either version 3 of the License, or
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek (at your option) any later version.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek This program is distributed in the hope that it will be useful,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek GNU General Public License for more details.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek You should have received a copy of the GNU General Public License
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek along with this program. If not, see <http://www.gnu.org/licenses/>.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek*/
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "util/util.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "db/sysdb.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "providers/ldap/sdap_async_private.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "db/sysdb_autofs.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "providers/ldap/ldap_common.h"
5cd4414fce1e0eb4133dfc6fc828bf25c8a959f9Lukas Slebodnik#include "providers/ldap/sdap_autofs.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozekenum autofs_map_op {
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek AUTOFS_MAP_OP_ADD,
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek AUTOFS_MAP_OP_DEL
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek};
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* ====== Utility functions ====== */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic const char *
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekget_autofs_map_name(struct sysdb_attrs *map, struct sdap_options *opts)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct ldb_message_element *el;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sysdb_attrs_get_el(map,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek opts->autofs_mobject_map[SDAP_AT_AUTOFS_MAP_NAME].sys_name,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek &el);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret) return NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (el->num_values == 0) return NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return (const char *)el->values[0].data;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic const char *
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozekget_autofs_entry_attr(struct sysdb_attrs *entry, struct sdap_options *opts,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek enum sdap_autofs_entry_attrs attr)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct ldb_message_element *el;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sysdb_attrs_get_el(entry,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek opts->autofs_entry_map[attr].sys_name,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek &el);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret) return NULL;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (el->num_values != 1) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Expected one entry got %d\n", el->num_values);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return NULL;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return (const char *)el->values[0].data;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozekstatic const char *
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozekget_autofs_entry_key(struct sysdb_attrs *entry, struct sdap_options *opts)
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek{
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return get_autofs_entry_attr(entry, opts, SDAP_AT_AUTOFS_ENTRY_KEY);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek}
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozekstatic const char *
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozekget_autofs_entry_value(struct sysdb_attrs *entry, struct sdap_options *opts)
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek{
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return get_autofs_entry_attr(entry, opts, SDAP_AT_AUTOFS_ENTRY_VALUE);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek}
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozekadd_autofs_entry(struct sss_domain_info *domain,
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek const char *map,
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek struct sdap_options *opts,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek struct sysdb_attrs *entry)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *key;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *value;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek key = get_autofs_entry_key(entry, opts);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!key) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "Could not get autofs entry key\n");
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return EINVAL;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek value = get_autofs_entry_value(entry, opts);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!value) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "Could not get autofs entry value\n");
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return EINVAL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek return sysdb_save_autofsentry(domain, map, key, value, NULL);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozeksave_autofs_entries(struct sss_domain_info *domain,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek struct sdap_options *opts,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek const char *map,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek char **add_dn_list,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hash_table_t *entry_hash)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hash_key_t key;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hash_value_t value;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek size_t i;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek int hret;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek errno_t ret;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek struct sysdb_attrs *entry;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!add_dn_list) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek for (i=0; add_dn_list[i]; i++) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek key.type = HASH_KEY_STRING;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek key.str = (char *) add_dn_list[i];
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hret = hash_lookup(entry_hash, &key, &value);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (hret != HASH_SUCCESS) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot retrieve entry [%s] from hash\n", add_dn_list[i]);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek continue;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek entry = talloc_get_type(value.ptr, struct sysdb_attrs);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!entry) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot retrieve entry [%s] from ptr\n", add_dn_list[i]);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek continue;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Saving autofs entry [%s]\n", add_dn_list[i]);
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek ret = add_autofs_entry(domain, map, opts, entry);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (ret) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot save entry [%s] to cache\n", add_dn_list[i]);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek continue;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "Saved entry [%s]\n", add_dn_list[i]);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "All entries saved\n");
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return EOK;
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek}
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozekstatic errno_t
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozekdel_autofs_entries(struct sss_domain_info *dom,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek char **del_dn_list)
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek{
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek size_t i;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek errno_t ret;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek for (i=0; del_dn_list[i]; i++) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Removing autofs entry [%s]\n", del_dn_list[i]);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek ret = sysdb_del_autofsentry(dom, del_dn_list[i]);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (ret) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot delete entry %s\n", del_dn_list[i]);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek continue;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "All entries removed\n");
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek return EOK;
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek}
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozeksave_autofs_map(struct sss_domain_info *dom,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs *map)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *mapname;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek time_t now;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek mapname = get_autofs_map_name(map, opts);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!mapname) return EINVAL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek now = time(NULL);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek ret = sysdb_save_autofsmap(dom, mapname, mapname,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek NULL, dom->autofsmap_timeout, now);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct automntmaps_process_members_state {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_context *ev;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_handle *sh;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sss_domain_info *dom;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int timeout;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
f3dc9ac52a808fcbedc7fb1ae83964b523c72df2Stephen Gallagher const char *orig_dn;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek char *base_filter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *filter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char **attrs;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek size_t base_iter;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek struct sdap_search_base **search_bases;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs *map;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs **entries;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t entries_count;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekautomntmaps_process_members_done(struct tevent_req *subreq);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozekstatic errno_t
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozekautomntmaps_process_members_next_base(struct tevent_req *req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic struct tevent_req *
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekautomntmaps_process_members_send(TALLOC_CTX *mem_ctx,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_context *ev,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_handle *sh,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sss_domain_info *dom,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek struct sdap_search_base **search_bases,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int timeout,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs *map)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct automntmaps_process_members_state *state;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek req = tevent_req_create(mem_ctx, &state,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct automntmaps_process_members_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!req) return NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->ev = ev;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->opts = opts;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->dom = dom;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sh = sh;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->timeout = timeout;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->base_iter = 0;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->map = map;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->search_bases = search_bases;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->base_filter = talloc_asprintf(state, "(&(%s=*)(objectclass=%s))",
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek opts->autofs_entry_map[SDAP_AT_AUTOFS_ENTRY_KEY].name,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek opts->autofs_entry_map[SDAP_OC_AUTOFS_ENTRY].name);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (!state->base_filter) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build filter\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto immediate;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = build_attrs_from_map(state, opts->autofs_entry_map,
64ddff90c7fcc02ccb06824ac93af7d5f361a88fJan Zeleny SDAP_OPTS_AUTOFS_ENTRY, NULL,
64ddff90c7fcc02ccb06824ac93af7d5f361a88fJan Zeleny &state->attrs, NULL);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build attributes from map\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto immediate;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
f3dc9ac52a808fcbedc7fb1ae83964b523c72df2Stephen Gallagher ret = sysdb_attrs_get_string(state->map, SYSDB_ORIG_DN, &state->orig_dn);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Cannot get originalDN\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto immediate;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Examining autofs map [%s]\n", state->orig_dn);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek ret = automntmaps_process_members_next_base(req);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (ret != EOK) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "search failed [%d]: %s\n", ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto immediate;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekimmediate:
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } else {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_done(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_post(req, ev);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozekstatic errno_t
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozekautomntmaps_process_members_next_base(struct tevent_req *req)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek{
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek struct tevent_req *subreq;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek struct automntmaps_process_members_state *state =
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek tevent_req_data(req, struct automntmaps_process_members_state);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek talloc_zfree(state->filter);
92ec40e6aa25f75903ffdb166a8ec56b67bfd77dPavel Březina state->filter = sdap_combine_filters(state, state->base_filter,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->search_bases[state->base_iter]->filter);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (!state->filter) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek return ENOMEM;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Searching for automount map entries with base [%s]\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov state->search_bases[state->base_iter]->basedn);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek subreq = sdap_get_generic_send(state, state->ev, state->opts, state->sh,
f3dc9ac52a808fcbedc7fb1ae83964b523c72df2Stephen Gallagher state->orig_dn,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->search_bases[state->base_iter]->scope,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->filter, state->attrs,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->opts->autofs_entry_map,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek SDAP_OPTS_AUTOFS_ENTRY,
2f3ee3f49019f5b60adbe073070f31e6e2d7c7abStephen Gallagher state->timeout, true);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (!subreq) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Cannot start search for entries\n");
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek return EIO;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek tevent_req_set_callback(subreq, automntmaps_process_members_done, req);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek return EOK;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek}
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekautomntmaps_process_members_done(struct tevent_req *subreq)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct automntmaps_process_members_state *state =
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_data(req, struct automntmaps_process_members_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek struct sysdb_attrs **entries;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek size_t entries_count, i;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sdap_get_generic_recv(subreq, state,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek &entries_count, &entries);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_zfree(subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (entries_count > 0) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->entries = talloc_realloc(state, state->entries,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek struct sysdb_attrs *,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->entries_count + entries_count + 1);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (state->entries == NULL) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek tevent_req_error(req, ENOMEM);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek return;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek for (i=0; i < entries_count; i++) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->entries[state->entries_count + i] =
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek talloc_steal(state->entries, entries[i]);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->entries_count += entries_count;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->entries[state->entries_count] = NULL;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->base_iter++;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (state->search_bases[state->base_iter]) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek ret = automntmaps_process_members_next_base(req);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek if (ret != EOK) {
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek tevent_req_error(req, ret);
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek return;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek }
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "No more search bases to try\n");
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Search for autofs entries, returned %zu results.\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov state->entries_count);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_done(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekautomntmaps_process_members_recv(struct tevent_req *req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek TALLOC_CTX *mem_ctx,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t *entries_count,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs ***entries)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct automntmaps_process_members_state *state;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state = tevent_req_data(req, struct automntmaps_process_members_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (entries_count) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *entries_count = state->entries_count;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (entries) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *entries = talloc_steal(mem_ctx, state->entries);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct sdap_get_automntmap_state {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_context *ev;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_handle *sh;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sss_domain_info *dom;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char **attrs;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *base_filter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *filter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int timeout;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *higher_timestamp;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs **map;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t count;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs **entries;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t entries_count;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t base_iter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_search_base **search_bases;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_next_base(struct tevent_req *req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_process(struct tevent_req *subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic struct tevent_req *
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_send(TALLOC_CTX *memctx,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_context *ev,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sss_domain_info *dom,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_search_base **search_bases,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_handle *sh,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char **attrs,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *filter,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int timeout)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state *state;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek req = tevent_req_create(memctx, &state, struct sdap_get_automntmap_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!req) return NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->ev = ev;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->opts = opts;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->dom = dom;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sh = sh;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->attrs = attrs;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->higher_timestamp = NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->map = NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->count = 0;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->timeout = timeout;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->base_filter = filter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->base_iter = 0;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->search_bases = search_bases;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sdap_get_automntmap_next_base(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_post(req, state->ev);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_next_base(struct tevent_req *req)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *subreq;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state *state;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state = tevent_req_data(req, struct sdap_get_automntmap_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_zfree(state->filter);
92ec40e6aa25f75903ffdb166a8ec56b67bfd77dPavel Březina state->filter = sdap_combine_filters(state, state->base_filter,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->search_bases[state->base_iter]->filter);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!state->filter) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Searching for automount maps with base [%s]\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov state->search_bases[state->base_iter]->basedn);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek subreq = sdap_get_generic_send(
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state, state->ev, state->opts, state->sh,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->search_bases[state->base_iter]->basedn,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->search_bases[state->base_iter]->scope,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->filter, state->attrs,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->opts->autofs_mobject_map, SDAP_OPTS_AUTOFS_MAP,
2f3ee3f49019f5b60adbe073070f31e6e2d7c7abStephen Gallagher state->timeout,
2f3ee3f49019f5b60adbe073070f31e6e2d7c7abStephen Gallagher false);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!subreq) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return EIO;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_set_callback(subreq, sdap_get_automntmap_process, req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_done(struct tevent_req *subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_process(struct tevent_req *subreq)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state *state = tevent_req_data(req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sdap_get_generic_recv(subreq, state,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek &state->count, &state->map);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_zfree(subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Search for autofs maps, returned %zu results.\n", state->count);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (state->count == 0) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* No maps found in this search */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->base_iter++;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (state->search_bases[state->base_iter]) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* There are more search bases to try */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sdap_get_automntmap_next_base(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ENOENT);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ENOENT);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } else if (state->count > 1) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "The search yielded more than one autofs map\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, EIO);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_INTERNAL, "Processing autofs maps\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek subreq = automntmaps_process_members_send(state, state->ev, state->opts,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sh, state->dom,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek state->search_bases,
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek state->timeout,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->map[0]);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!subreq) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ENOMEM);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_set_callback(subreq, sdap_get_automntmap_done, req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_done(struct tevent_req *subreq)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state *state = tevent_req_data(req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = automntmaps_process_members_recv(subreq, state, &state->entries_count,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek &state->entries);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_zfree(subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "automount map members received\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_done(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_get_automntmap_recv(struct tevent_req *req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek TALLOC_CTX *mem_ctx,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs **map,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t *entries_count,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs ***entries)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state *state = tevent_req_data(req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_get_automntmap_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (map) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *map = talloc_steal(mem_ctx, state->map[0]);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (entries_count) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *entries_count = state->entries_count;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (entries) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *entries = talloc_steal(mem_ctx, state->entries);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct sdap_autofs_setautomntent_state {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *filter;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char **attrs;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_handle *sh;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_ctx *sysdb;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_id_op *sdap_op;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sss_domain_info *dom;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *mapname;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs *map;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_attrs **entries;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek size_t entries_count;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int dp_error;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_autofs_setautomntent_done(struct tevent_req *subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct tevent_req *
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_autofs_setautomntent_send(TALLOC_CTX *memctx,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_context *ev,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sss_domain_info *dom,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sysdb_ctx *sysdb,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_handle *sh,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_id_op *op,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_options *opts,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *mapname)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *subreq;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_autofs_setautomntent_state *state;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *clean_mapname;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek req = tevent_req_create(memctx, &state,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_autofs_setautomntent_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!req) return NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!mapname) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "No map name given\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = EINVAL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto fail;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sh = sh;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sysdb = sysdb;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->opts = opts;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sdap_op = op;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->dom = dom;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->mapname = mapname;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sss_filter_sanitize(state, mapname, &clean_mapname);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto fail;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->filter = talloc_asprintf(state, "(&(%s=%s)(objectclass=%s))",
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->opts->autofs_mobject_map[SDAP_AT_AUTOFS_MAP_NAME].name,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek clean_mapname,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->opts->autofs_mobject_map[SDAP_OC_AUTOFS_MAP].name);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!state->filter) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build filter\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto fail;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_free(clean_mapname);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = build_attrs_from_map(state, state->opts->autofs_mobject_map,
64ddff90c7fcc02ccb06824ac93af7d5f361a88fJan Zeleny SDAP_OPTS_AUTOFS_MAP, NULL,
64ddff90c7fcc02ccb06824ac93af7d5f361a88fJan Zeleny &state->attrs, NULL);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build attributes from map\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto fail;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek subreq = sdap_get_automntmap_send(state, ev, dom,
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek state->opts,
749cfb5d3270b5daf389d51a0dbd3fd2aec6e05dJakub Hrozek state->opts->sdom->autofs_search_bases,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->sh,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->attrs, state->filter,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek dp_opt_get_int(state->opts->basic,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek SDAP_SEARCH_TIMEOUT));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!subreq) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto fail;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_set_callback(subreq, sdap_autofs_setautomntent_done, req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekfail:
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_post(req, ev);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return req;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_autofs_setautomntent_save(struct tevent_req *req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic void
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_autofs_setautomntent_done(struct tevent_req *subreq)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct tevent_req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_autofs_setautomntent_state *state = tevent_req_data(req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_autofs_setautomntent_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sdap_get_automntmap_recv(subreq, state, &state->map,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek &state->entries_count, &state->entries);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_zfree(subreq);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret == ENOENT) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_MINOR_FAILURE, "Could not find automount map\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } else {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "sdap_get_automntmap_recv failed [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sdap_autofs_setautomntent_save(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "Could not save automount map\n");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_error(req, ret);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek state->dp_error = DP_ERR_OK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tevent_req_done(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstatic errno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_autofs_setautomntent_save(struct tevent_req *req)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_autofs_setautomntent_state *state = tevent_req_data(req,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct sdap_autofs_setautomntent_state);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek errno_t ret, tret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek bool in_transaction = false;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek TALLOC_CTX *tmp_ctx;
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek struct ldb_message **entries = NULL;
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek size_t count;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek const char *key;
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek const char *val;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **sysdb_entrylist;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **ldap_entrylist;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **add_entries;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **del_entries;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek size_t i, j;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hash_table_t *entry_hash;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hash_key_t hkey;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hash_value_t value;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek int hret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tmp_ctx = talloc_new(NULL);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!tmp_ctx) return ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek DEBUG(SSSDBG_TRACE_LIBS,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Got %zu map entries from LDAP\n", state->entries_count);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (state->entries_count == 0) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* No entries for this map in LDAP.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * We need to ensure that there are no entries
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * in the sysdb either.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ldap_entrylist = NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } else {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ldap_entrylist = talloc_array(tmp_ctx, char *,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek state->entries_count+1);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!ldap_entrylist) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ret = sss_hash_create(state, 32, &entry_hash);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (ret) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek goto done;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek /* Get a list of the map members by DN */
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek for (i=0, j=0; i < state->entries_count; i++) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek key = get_autofs_entry_key(state->entries[i], state->opts);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek val = get_autofs_entry_value(state->entries[i], state->opts);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!key || !val) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_MINOR_FAILURE, "Malformed entry, skipping\n");
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek continue;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ldap_entrylist[j] = sysdb_autofsentry_strdn(ldap_entrylist,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek state->dom,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek state->mapname,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek key, val);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (!ldap_entrylist[j]) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ret = ENOMEM;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek goto done;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hkey.type = HASH_KEY_STRING;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hkey.str = ldap_entrylist[j];
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek value.type = HASH_VALUE_PTR;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek value.ptr = state->entries[i];
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek hret = hash_enter(entry_hash, &hkey, &value);
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek if (hret != HASH_SUCCESS) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ret = EIO;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek goto done;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek j++;
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek }
e18d5c703c529f99bd375da887d9aeaee6b82fcdLukas Slebodnik /* terminate array with NULL after the last retrieved entry */
e18d5c703c529f99bd375da887d9aeaee6b82fcdLukas Slebodnik ldap_entrylist[j] = NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek ret = sysdb_autofs_entries_by_map(tmp_ctx, state->dom, state->mapname,
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek &count, &entries);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK && ret != ENOENT) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "cache lookup for the map failed [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_LIBS, "Got %zu map entries from sysdb\n", count);
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek if (count == 0) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* No map members for this map in sysdb currently */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek sysdb_entrylist = NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } else {
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek sysdb_entrylist = talloc_array(state, char *, count+1);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (!sysdb_entrylist) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek /* Get a list of the map members by DN */
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek for (i=0; i < count; i++) {
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek sysdb_entrylist[i] = talloc_strdup(sysdb_entrylist,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek ldb_dn_get_linearized(entries[i]->dn));
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek if (!sysdb_entrylist[i]) {
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek ret = ENOMEM;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek sysdb_entrylist[count] = NULL;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* Find the differences between the sysdb and LDAP lists
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Entries in the sysdb only must be removed.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = diff_string_lists(tmp_ctx, ldap_entrylist, sysdb_entrylist,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek &add_entries, &del_entries, NULL);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sysdb_transaction_start(state->sysdb);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot start sysdb transaction [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek in_transaction = true;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* Save the map itself */
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek ret = save_autofs_map(state->dom, state->opts, state->map);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot save autofs map entry [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /* Create entries that don't exist yet */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (add_entries && add_entries[0]) {
e7d1cd14ce1a427007b1a7e9789dcb7e9619f84fJakub Hrozek ret = save_autofs_entries(state->dom, state->opts,
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek state->mapname, add_entries,
2234d49c8a307ee4f11cc544c862a359f76b44adJakub Hrozek entry_hash);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot save autofs entries [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek /* Delete entries that don't exist anymore */
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek if (del_entries && del_entries[0]) {
828433f7b73481cdff8d57ac378f156a676e3357Pavel Reichl ret = del_autofs_entries(state->dom, del_entries);
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek if (ret != EOK) {
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot delete autofs entries [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek goto done;
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
f17d26a8db285622a5cd5f21c7488b62eedc2cf8Jakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = sysdb_transaction_commit(state->sysdb);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (ret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot commit sysdb transaction [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek goto done;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek in_transaction = false;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek ret = EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekdone:
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (in_transaction) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek tret = sysdb_transaction_cancel(state->sysdb);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek if (tret != EOK) {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Cannot cancel sysdb transaction [%d]: %s\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek }
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek talloc_zfree(tmp_ctx);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return ret;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekerrno_t
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozeksdap_autofs_setautomntent_recv(struct tevent_req *req)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek{
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek return EOK;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek}
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek