sssd/0004-Add-common-function-to-retrieve-comma-sep.-lists.patch

427 lines
13 KiB
Diff

From 4ad7fe5e6acc87140fc29b635605af8445d2d32f Mon Sep 17 00:00:00 2001
From: Simo Sorce <ssorce@redhat.com>
Date: Tue, 14 Apr 2009 11:20:30 -0400
Subject: [PATCH] Add common function to retrieve comma sep. lists
Also convert all places where we were using custom code to parse
config arguments.
And fix a copy&paste error in nss_get_config
---
server/confdb/confdb.c | 203 ++++++++++++++++++++++++++++++++---------
server/confdb/confdb.h | 4 +
server/monitor/monitor.c | 54 +----------
server/responder/nss/nsssrv.c | 24 +++--
4 files changed, 179 insertions(+), 106 deletions(-)
diff --git a/server/confdb/confdb.c b/server/confdb/confdb.c
index d3a2a08..1f642ca 100644
--- a/server/confdb/confdb.c
+++ b/server/confdb/confdb.c
@@ -36,8 +36,8 @@
#include "ini_config.h"
#define CONFDB_VERSION "1"
-#define CONFDB_BASEDN "cn=config"
-#define CONFDB_DOMAIN_BASEDN "cn=domains,"CONFDB_BASEDN
+#define CONFDB_DOMAINS_PATH "config/domains"
+#define CONFDB_DOMAIN_BASEDN "cn=domains,cn=config"
#define CONFDB_DOMAIN_ATTR "cn"
#define CONFDB_MPG "magicPrivateGroups"
#define CONFDB_FQ "useFullyQualifiedNames"
@@ -121,6 +121,110 @@ done:
return ret;
}
+/* split a string into an allocated array of strings.
+ * the separator is a string, and is case-sensitive.
+ * optionally single values can be trimmed of of spaces and tabs */
+static int split_on_separator(TALLOC_CTX *mem_ctx, const char *str,
+ char *sep, bool trim, char ***_list, int *size)
+{
+ const char *t, *p, *n;
+ size_t l, s, len;
+ char **list, **r;
+
+ if (!str || !*str || !sep || !*sep || !_list) return EINVAL;
+
+ s = strlen(sep);
+ t = str;
+
+ list = NULL;
+ l = 0;
+
+ if (trim)
+ while (*t == ' ' || *t == '\t') t++;
+
+ while (t && (p = strstr(t, sep))) {
+ len = p - t;
+ n = p + s; /* save next string starting point */
+ if (trim) {
+ while (*t == ' ' || *t == '\t') {
+ t++;
+ len--;
+ if (len == 0) break;
+ }
+ p--;
+ while (len > 0 && (*p == ' ' || *p == '\t')) {
+ len--;
+ p--;
+ }
+ }
+
+ r = talloc_realloc(mem_ctx, list, char *, l + 2);
+ if (!r) {
+ talloc_free(list);
+ return ENOMEM;
+ } else {
+ list = r;
+ }
+
+ if (len == 0) {
+ list[l] = talloc_strdup(list, "");
+ } else {
+ list[l] = talloc_strndup(list, t, len);
+ }
+ if (!list[l]) {
+ talloc_free(list);
+ return ENOMEM;
+ }
+ l++;
+
+ t = n; /* move to next string */
+ }
+
+ if (t) {
+ r = talloc_realloc(mem_ctx, list, char *, l + 2);
+ if (!r) {
+ talloc_free(list);
+ return ENOMEM;
+ } else {
+ list = r;
+ }
+
+ if (trim) {
+ len = strlen(t);
+ while (*t == ' ' || *t == '\t') {
+ t++;
+ len--;
+ if (len == 0) break;
+ }
+ p = t + len - 1;
+ while (len > 0 && (*p == ' ' || *p == '\t')) {
+ len--;
+ p--;
+ }
+
+ if (len == 0) {
+ list[l] = talloc_strdup(list, "");
+ } else {
+ list[l] = talloc_strndup(list, t, len);
+ }
+ } else {
+ list[l] = talloc_strdup(list, t);
+ }
+ if (!list[l]) {
+ talloc_free(list);
+ return ENOMEM;
+ }
+ l++;
+ }
+
+ list[l] = NULL; /* terminate list */
+
+ if (size) *size = l + 1;
+ *_list = list;
+
+ return EOK;
+}
+
int confdb_add_param(struct confdb_ctx *cdb,
bool replace,
const char *section,
@@ -496,6 +600,43 @@ failed:
return ret;
}
+/* WARNING: Unlike other similar functions, this one does NOT take a default,
+ * and returns ENOENT if the attribute was not found ! */
+int confdb_get_string_as_list(struct confdb_ctx *cdb, TALLOC_CTX *ctx,
+ const char *section, const char *attribute,
+ char ***result)
+{
+ char **values = NULL;
+ int ret;
+
+ ret = confdb_get_param(cdb, ctx, section, attribute, &values);
+ if (ret != EOK) {
+ goto done;
+ }
+
+ if (values && values[0]) {
+ if (values[1] != NULL) {
+ /* too many values */
+ ret = EINVAL;
+ goto done;
+ }
+ } else {
+ /* Did not return a value */
+ ret = ENOENT;
+ goto done;
+ }
+
+ ret = split_on_separator(ctx, values[0], ",", true, result, NULL);
+
+done:
+ talloc_free(values);
+ if (ret != EOK && ret != ENOENT) {
+ DEBUG(2, ("Failed to get [%s] from [%s], error [%d] (%s)",
+ attribute, section, ret, strerror(ret)));
+ }
+ return ret;
+}
+
int confdb_test(struct confdb_ctx *cdb)
{
char **values;
@@ -948,61 +1089,33 @@ int confdb_get_domains(struct confdb_ctx *cdb,
struct sss_domain_info **domains)
{
TALLOC_CTX *tmp_ctx;
- struct ldb_dn *dn;
- struct ldb_result *res;
struct sss_domain_info *domain, *prevdom;
struct sss_domain_info *first = NULL;
- const char *attrs[] = { "domains", NULL };
- const char *tmp;
- char *cur, *p, *t;
- int ret;
+ char **domlist;
+ int ret, i;
tmp_ctx = talloc_new(mem_ctx);
if (!tmp_ctx) return ENOMEM;
- dn = ldb_dn_new(tmp_ctx, cdb->ldb, CONFDB_DOMAIN_BASEDN);
- if (!dn) {
- ret = EIO;
- goto done;
- }
-
- ret = ldb_search(cdb->ldb, tmp_ctx, &res, dn,
- LDB_SCOPE_BASE, attrs, NULL);
- if (ret != LDB_SUCCESS) {
- ret = EIO;
- goto done;
- }
-
- if (res->count != 1) {
- ret = EFAULT;
+ ret = confdb_get_string_as_list(cdb, tmp_ctx,
+ CONFDB_DOMAINS_PATH, "domains", &domlist);
+ if (ret == ENOENT) {
+ DEBUG(0, ("No domains configured, fatal error!\n"));
goto done;
}
-
- tmp = ldb_msg_find_attr_as_string(res->msgs[0], "domains", NULL);
- if (!tmp) {
- DEBUG(0, ("No domains configured, fatal error!\n"));
- ret = EINVAL;
+ if (ret != EOK ) {
+ DEBUG(0, ("Fatal error retrieving domains list!\n"));
goto done;
}
- cur = p = talloc_strdup(tmp_ctx, tmp);
- while (p && *p) {
-
- for (cur = p; (*cur == ' ' || *cur == '\t'); cur++) /* trim */ ;
- if (!*cur) break;
-
- p = strchr(cur, ',');
- if (p) {
- /* terminate element */
- *p = '\0';
- /* trim spaces */
- for (t = p-1; (*t == ' ' || *t == '\t'); t--) *t = '\0';
- p++;
+ for (i = 0; domlist[i]; i++) {
+ ret = confdb_get_domain(cdb, mem_ctx, domlist[i], &domain);
+ if (ret) {
+ DEBUG(0, ("Error (%d [%s]) retrieving domain %s, skipping!\n",
+ ret, strerror(ret), domains[i]));
+ continue;
}
- ret = confdb_get_domain(cdb, mem_ctx, cur, &domain);
- if (ret) goto done;
-
if (first == NULL) {
first = domain;
prevdom = first;
@@ -1014,7 +1127,7 @@ int confdb_get_domains(struct confdb_ctx *cdb,
if (first == NULL) {
DEBUG(0, ("No domains configured, fatal error!\n"));
- ret = EINVAL;
+ ret = ENOENT;
}
*domains = first;
diff --git a/server/confdb/confdb.h b/server/confdb/confdb.h
index 19614fc..76e4482 100644
--- a/server/confdb/confdb.h
+++ b/server/confdb/confdb.h
@@ -80,6 +80,10 @@ int confdb_get_bool(struct confdb_ctx *cdb, TALLOC_CTX *ctx,
const char *section, const char *attribute,
bool defval, bool *result);
+int confdb_get_string_as_list(struct confdb_ctx *cdb, TALLOC_CTX *ctx,
+ const char *section, const char *attribute,
+ char ***result);
+
int confdb_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct confdb_ctx **cdb_ctx,
diff --git a/server/monitor/monitor.c b/server/monitor/monitor.c
index dd80830..20734d1 100644
--- a/server/monitor/monitor.c
+++ b/server/monitor/monitor.c
@@ -544,11 +544,6 @@ static int service_signal_reload(struct mt_svc *svc)
int get_monitor_config(struct mt_ctx *ctx)
{
int ret;
- size_t svc_count = 0;
- char *svcs;
- char *cur, *p, *t;
- char **svc_list = NULL;
- char **tmp_list = NULL;
ret = confdb_get_int(ctx->cdb, ctx,
MONITOR_CONF_ENTRY, "sbusTimeout",
@@ -557,61 +552,20 @@ int get_monitor_config(struct mt_ctx *ctx)
return ret;
}
- ret = confdb_get_string(ctx->cdb, ctx,
- SERVICE_CONF_ENTRY, "activeServices",
- NULL, &svcs);
-
- if (ret != EOK || svcs == NULL) {
+ ret = confdb_get_string_as_list(ctx->cdb, ctx, SERVICE_CONF_ENTRY,
+ "activeServices", &ctx->services);
+ if (ret != EOK) {
DEBUG(0, ("No services configured!\n"));
return EINVAL;
}
- cur = p = talloc_strdup(svcs, svcs);
- while (p && *p) {
- for (cur = p; (*cur == ' ' || *cur == '\t'); cur++) /* trim */ ;
- if (!*cur) break;
-
- p = strchr(cur, ',');
- if (p) {
- /* terminate element */
- *p = '\0';
- /* trim spaces */
- for (t = p-1; (*t == ' ' || *t == '\t'); t--) *t = '\0';
- p++;
- }
-
- svc_count++;
- tmp_list = talloc_realloc(svcs, svc_list, char *, svc_count);
- if (!tmp_list) {
- ret = ENOMEM;
- goto done;
- }
- svc_list = tmp_list;
- svc_list[svc_count-1] = talloc_strdup(svc_list, cur);
- }
-
- svc_count++;
- tmp_list = talloc_realloc(svcs, svc_list, char *, svc_count);
- if (!tmp_list) {
- ret = ENOMEM;
- goto done;
- }
- svc_list = tmp_list;
- svc_list[svc_count-1] = NULL;
-
- ctx->services = talloc_steal(ctx, svc_list);
-
ret = confdb_get_domains(ctx->cdb, ctx, &ctx->domains);
if (ret != EOK) {
DEBUG(2, ("No domains configured. LOCAL should always exist!\n"));
return ret;
}
- ret = EOK;
-
-done:
- talloc_free(svcs);
- return ret;
+ return EOK;
}
static int get_service_config(struct mt_ctx *ctx, const char *name,
diff --git a/server/responder/nss/nsssrv.c b/server/responder/nss/nsssrv.c
index e85e56b..e04a8c8 100644
--- a/server/responder/nss/nsssrv.c
+++ b/server/responder/nss/nsssrv.c
@@ -138,18 +138,20 @@ static int nss_get_config(struct nss_ctx *nctx,
ret = confdb_get_int(cdb, nctx, NSS_SRV_CONFIG,
"EntryCacheTimeout", 600,
- &nctx->enum_cache_timeout);
+ &nctx->cache_timeout);
if (ret != EOK) goto done;
ret = confdb_get_int(cdb, nctx, NSS_SRV_CONFIG,
"EntryNegativeTimeout", 15,
- &nctx->enum_cache_timeout);
+ &nctx->neg_timeout);
if (ret != EOK) goto done;
- ret = confdb_get_param(cdb, nctx, NSS_SRV_CONFIG,
- "filterUsers", &filter_list);
- if (ret != EOK) goto done;
- for (i = 0; filter_list[i]; i++) {
+ ret = confdb_get_string_as_list(cdb, tmpctx, NSS_SRV_CONFIG,
+ "filterUsers", &filter_list);
+ if (ret == ENOENT) filter_list = NULL;
+ else if (ret != EOK) goto done;
+
+ for (i = 0; (filter_list && filter_list[i]); i++) {
ret = sss_parse_name(tmpctx, nctx->rctx->names,
filter_list[i], &domain, &name);
if (ret != EOK) {
@@ -178,11 +180,12 @@ static int nss_get_config(struct nss_ctx *nctx,
}
}
}
- talloc_free(filter_list);
- ret = confdb_get_param(cdb, nctx, NSS_SRV_CONFIG,
- "filterGroups", &filter_list);
- if (ret != EOK) goto done;
+ ret = confdb_get_string_as_list(cdb, tmpctx, NSS_SRV_CONFIG,
+ "filterGroups", &filter_list);
+ if (ret == ENOENT) filter_list = NULL;
+ else if (ret != EOK) goto done;
+
for (i = 0; filter_list[i]; i++) {
ret = sss_parse_name(tmpctx, nctx->rctx->names,
filter_list[i], &domain, &name);
@@ -212,7 +215,6 @@ static int nss_get_config(struct nss_ctx *nctx,
}
}
}
- talloc_free(filter_list);
done:
talloc_free(tmpctx);
--
1.6.0.6