>From 20c9175cfb4f0d757bd226f350f9ad3d82e21073 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Sun, 23 Sep 2012 17:18:50 +0200 Subject: [PATCH 4/5] AUTOFS: Use both key and value in entry RDN This patch switches from using just key in the RDN to using both key and value. That is neccessary to allow multiple direct mounts in a single map. --- src/db/sysdb_autofs.c | 48 +++++++++++++++++++++++++++------- src/db/sysdb_autofs.h | 3 ++- src/providers/ldap/sdap_async_autofs.c | 12 +++++++-- src/tests/sysdb-tests.c | 2 +- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/db/sysdb_autofs.c b/src/db/sysdb_autofs.c index b3df33f6657ec2668475e0384d10f41920ac7dd0..bf4e9b172fba9616ebda875fb9b6b9475d405132 100644 --- a/src/db/sysdb_autofs.c +++ b/src/db/sysdb_autofs.c @@ -39,22 +39,42 @@ static struct ldb_dn * sysdb_autofsentry_dn(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, const char *map_name, - const char *entry_name) + const char *entry_name, + const char *entry_value) { errno_t ret; + TALLOC_CTX *tmp_ctx; char *clean_name; - struct ldb_dn *dn; + char *clean_value; + const char *rdn; + struct ldb_dn *dn = NULL; - ret = sysdb_dn_sanitize(NULL, entry_name, &clean_name); - if (ret != EOK) { + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) { return NULL; } + ret = sysdb_dn_sanitize(tmp_ctx, entry_name, &clean_name); + if (ret != EOK) { + goto done; + } + + ret = sysdb_dn_sanitize(tmp_ctx, entry_value, &clean_value); + if (ret != EOK) { + goto done; + } + + rdn = talloc_asprintf(tmp_ctx, "%s%s", clean_name, clean_value); + if (!rdn) { + goto done; + } + dn = ldb_dn_new_fmt(mem_ctx, sysdb->ldb, SYSDB_TMPL_AUTOFS_ENTRY, - clean_name, map_name, AUTOFS_MAP_SUBDIR, + rdn, map_name, AUTOFS_MAP_SUBDIR, sysdb->domain->name); - talloc_free(clean_name); +done: + talloc_free(tmp_ctx); return dn; } @@ -217,6 +237,7 @@ sysdb_save_autofsentry(struct sysdb_ctx *sysdb_ctx, TALLOC_CTX *tmp_ctx; struct ldb_message *msg; struct ldb_dn *dn; + const char *name; DEBUG(SSSDBG_TRACE_FUNC, ("Adding autofs entry [%s] - [%s]\n", key, value)); @@ -256,14 +277,20 @@ sysdb_save_autofsentry(struct sysdb_ctx *sysdb_ctx, goto done; } - ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, key); + name = talloc_asprintf(tmp_ctx, "%s%s", key, value); + if (!name) { + ret = ENOMEM; + goto done; + } + + ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("Could not set name attribute [%d]: %s\n", ret, strerror(ret))); goto done; } - dn = sysdb_autofsentry_dn(tmp_ctx, sysdb_ctx, map, key); + dn = sysdb_autofsentry_dn(tmp_ctx, sysdb_ctx, map, key, value); if (!dn) { ret = ENOMEM; goto done; @@ -289,12 +316,13 @@ done: errno_t sysdb_del_autofsentry(struct sysdb_ctx *sysdb_ctx, const char *map, - const char *key) + const char *key, + const char *value) { struct ldb_dn *dn; errno_t ret; - dn = sysdb_autofsentry_dn(sysdb_ctx, sysdb_ctx, map, key); + dn = sysdb_autofsentry_dn(sysdb_ctx, sysdb_ctx, map, key, value); if (!dn) { return ENOMEM; } diff --git a/src/db/sysdb_autofs.h b/src/db/sysdb_autofs.h index 616c2cbde2a0c8e269260262cb004502c39f9ac6..c4b5253ab4e5be9c600d80a69c54bed2958b3a2d 100644 --- a/src/db/sysdb_autofs.h +++ b/src/db/sysdb_autofs.h @@ -62,7 +62,8 @@ sysdb_save_autofsentry(struct sysdb_ctx *sysdb_ctx, errno_t sysdb_del_autofsentry(struct sysdb_ctx *sysdb_ctx, const char *map, - const char *key); + const char *key, + const char *value); errno_t sysdb_autofs_entries_by_map(TALLOC_CTX *mem_ctx, diff --git a/src/providers/ldap/sdap_async_autofs.c b/src/providers/ldap/sdap_async_autofs.c index 7ee3554029fcf1721662cde84e76961cb62472c1..4ccaf3fcab8108a9cae683578d434a0570db34e2 100644 --- a/src/providers/ldap/sdap_async_autofs.c +++ b/src/providers/ldap/sdap_async_autofs.c @@ -91,7 +91,7 @@ mod_autofs_entry(struct sysdb_ctx *sysdb, ret = sysdb_save_autofsentry(sysdb, map, key, value, NULL); break; case AUTOFS_MAP_OP_DEL: - ret = sysdb_del_autofsentry(sysdb, map, key); + ret = sysdb_del_autofsentry(sysdb, map, key, value); break; default: DEBUG(SSSDBG_OP_FAILURE, ("Unknown operation\n")); @@ -798,6 +798,7 @@ sdap_autofs_setautomntent_save(struct tevent_req *req) bool in_transaction = false; TALLOC_CTX *tmp_ctx; struct ldb_message **entries = NULL; + struct sysdb_attrs **entries_attrs; size_t count; const char *val; char **sysdb_entrylist; @@ -906,9 +907,16 @@ sdap_autofs_setautomntent_save(struct tevent_req *req) /* Delete entries that don't exist anymore */ if (del_entries && del_entries[0]) { + ret = sysdb_msg2attrs(tmp_ctx, count, entries, &entries_attrs); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, + ("sysdb_msg2attrs failed: [%d]: %s\n", ret, strerror(ret))); + goto done; + } + ret = del_autofs_entries(state->sysdb, state->opts, state->mapname, del_entries, - state->entries, state->entries_count); + entries_attrs, count); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, ("Cannot delete autofs entries [%d]: %s\n", diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c index ffcef835cb0a9746c461849342592705d4371b6b..83628af877c7114a42147d540e0b3d50482ec4e8 100644 --- a/src/tests/sysdb-tests.c +++ b/src/tests/sysdb-tests.c @@ -3801,7 +3801,7 @@ START_TEST(test_autofs_get_duplicate_keys) fail_if(autofskey == NULL, "Out of memory\n"); filter = talloc_asprintf(test_ctx, "(&(objectclass=%s)(%s=%s))", - SYSDB_AUTOFS_ENTRY_OC, SYSDB_NAME, autofskey); + SYSDB_AUTOFS_ENTRY_OC, SYSDB_AUTOFS_ENTRY_KEY, autofskey); fail_if(filter == NULL, "Out of memory\n"); dn = ldb_dn_new_fmt(test_ctx, test_ctx->sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE, -- 1.7.11.4