diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2009-02-27 13:35:33 -0500 |
---|---|---|
committer | Simo Sorce <ssorce@redhat.com> | 2009-02-27 17:11:23 -0500 |
commit | 24480f7fa3bf3f40bd9fb7c865f9e3b329bf3ed8 (patch) | |
tree | 735441471a4e8c5fcc2dd9b9311b000f44584e29 /server/responder/nss | |
parent | 60bbc5034e546b7df7a6f782e3353b863f49618b (diff) | |
download | sssd-24480f7fa3bf3f40bd9fb7c865f9e3b329bf3ed8.tar.gz sssd-24480f7fa3bf3f40bd9fb7c865f9e3b329bf3ed8.tar.bz2 sssd-24480f7fa3bf3f40bd9fb7c865f9e3b329bf3ed8.zip |
Refactor creation of domain_map into confdb
The NSS provider, the Data Provider backends and the InfoPipe all
need access to the domain map provided by the confdb. Instead of
reimplimenting it in multiple places, it is now provided in a pair
of helper functions from the confdb.
confdb_get_domains() returns a domain map by reference. Always
returns the most up-to-date set of domains from the confdb.
confdb_get_domains_list() returns an array of strings of all the
domain names. Always returns the most up-to-date set of domains
from the confdb.
This patch also modifies the btreemap_get_keys() function to
better handle memory and report allocation failures.
Diffstat (limited to 'server/responder/nss')
-rw-r--r-- | server/responder/nss/nsssrv.c | 83 | ||||
-rw-r--r-- | server/responder/nss/nsssrv.h | 9 | ||||
-rw-r--r-- | server/responder/nss/nsssrv_cmd.c | 36 |
3 files changed, 28 insertions, 100 deletions
diff --git a/server/responder/nss/nsssrv.c b/server/responder/nss/nsssrv.c index 2fbe3970..7c68ba19 100644 --- a/server/responder/nss/nsssrv.c +++ b/server/responder/nss/nsssrv.c @@ -49,7 +49,6 @@ static int service_identity(DBusMessage *message, struct sbus_conn_ctx *sconn); static int service_pong(DBusMessage *message, struct sbus_conn_ctx *sconn); static int service_reload(DBusMessage *message, struct sbus_conn_ctx *sconn); static int nss_init_domains(struct nss_ctx *nctx); -static int _domain_comparator(const void *key1, const void *key2); struct sbus_method nss_sbus_methods[] = { {SERVICE_METHOD_IDENTITY, service_identity}, @@ -392,93 +391,18 @@ failed: return EIO; } -/* domain names are case insensitive for now - * NOTE: this function is not utf-8 safe, - * only ASCII names for now */ -static int _domain_comparator(const void *key1, const void *key2) -{ - int ret; - - ret = strcasecmp((const char *)key1, (const char *)key2); - if (ret) { - /* special case LOCAL to be always the first domain */ - if (strcmp(key1, "LOCAL") == 0) return 1; - if (strcmp(key2, "LOCAL") == 0) return -1; - } - return ret; -} - static int nss_init_domains(struct nss_ctx *nctx) { - char *path; - char **domains; - char *provider; - TALLOC_CTX *tmp_ctx; - struct nss_domain_info *info; - int ret, i, c; + int ret; int retval; - tmp_ctx = talloc_new(nctx); - ret = confdb_get_domains(nctx->cdb, tmp_ctx, &domains); + ret = confdb_get_domains(nctx->cdb, nctx, &nctx->domain_map); if (ret != EOK) { retval = ret; goto done; } - i = 0; - c = 0; - while (domains[i] != NULL) { - DEBUG(3, ("Adding domain %s to the map\n", domains[i])); - - path = talloc_asprintf(tmp_ctx, "config/domains/%s", domains[i]); - if (!path) { - retval = ENOMEM; - goto done; - } - - /* alloc on tmp_ctx, it will be stolen by btreemap_set_value */ - info = talloc_zero(tmp_ctx, struct nss_domain_info); - if (!info) { - retval = ENOMEM; - goto done; - } - - /* Build the basedn for this domain */ - info->basedn = talloc_asprintf(info, SYSDB_DOM_BASE, domains[i]); - DEBUG(3, ("BaseDN: %s\n", info->basedn)); - - ret = confdb_get_int(nctx->cdb, tmp_ctx, path, - "enumerate", false, &(info->enumerate)); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch enumerate for [%s]!\n", domains[i])); - } - - ret = confdb_get_bool(nctx->cdb, tmp_ctx, path, - "legacy", false, &(info->legacy)); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch legacy for [%s]!\n", domains[i])); - } - - ret = confdb_get_string(nctx->cdb, tmp_ctx, path, "provider", - NULL, &provider); - if (ret != EOK) { - DEBUG(0, ("Failed to fetch provider for [%s]!\n", domains[i])); - } - if (provider) info->has_provider = true; - - ret = btreemap_set_value(nctx, &nctx->domain_map, - domains[i], info, - _domain_comparator); - if (ret != EOK) { - DEBUG(1, ("Failed to store domain info, aborting!\n")); - retval = ret; - goto done; - } - - i++; - c++; - } - if (c == 0) { + if (nctx->domain_map == NULL) { /* No domains configured! * Note: this should never happen, since LOCAL should * always be configured */ @@ -498,7 +422,6 @@ static int nss_init_domains(struct nss_ctx *nctx) retval = EOK; done: - talloc_free(tmp_ctx); return retval; } diff --git a/server/responder/nss/nsssrv.h b/server/responder/nss/nsssrv.h index 333e4281..1431dded 100644 --- a/server/responder/nss/nsssrv.h +++ b/server/responder/nss/nsssrv.h @@ -65,7 +65,7 @@ struct nss_ctx { int cache_timeout; struct sbus_method *sss_sbus_methods; - struct sss_cmd_table *sss_cmds; + struct sss_cmd_table *sss_cmds; const char *sss_pipe_name; const char *confdb_socket_path; struct sbus_method *dp_methods; @@ -81,13 +81,6 @@ struct cli_ctx { struct getent_ctx *gctx; }; -struct nss_domain_info { - char *basedn; - int enumerate; - bool has_provider; - bool legacy; -}; - struct nss_packet; struct cli_request { diff --git a/server/responder/nss/nsssrv_cmd.c b/server/responder/nss/nsssrv_cmd.c index 16146585..76da6e06 100644 --- a/server/responder/nss/nsssrv_cmd.c +++ b/server/responder/nss/nsssrv_cmd.c @@ -25,6 +25,7 @@ #include "responder/nss/nsssrv.h" #include "db/sysdb.h" #include <time.h> +#include "confdb/confdb.h" struct nss_cmd_ctx { struct cli_ctx *cctx; @@ -92,7 +93,7 @@ static int nss_parse_name(struct nss_dom_ctx *dctx, const char *fullname) { struct nss_cmd_ctx *cmdctx = dctx->cmdctx; struct nss_ctx *nctx = cmdctx->cctx->nctx; - struct nss_domain_info *info; + struct sss_domain_info *info; struct btreemap *domain_map; char *delim; char *domain; @@ -617,7 +618,7 @@ static int nss_cmd_getpwuid(struct cli_ctx *cctx) { struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; - struct nss_domain_info *info; + struct sss_domain_info *info; const char **domains; uint8_t *body; size_t blen; @@ -643,8 +644,10 @@ static int nss_cmd_getpwuid(struct cli_ctx *cctx) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, - (const void ***)&domains, &num); + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + (const void ***)&domains, &num); + if (ret != EOK) + return ret; cmdctx->nr = num; @@ -797,7 +800,7 @@ static void nss_cmd_setpw_dp_callback(uint16_t err_maj, uint32_t err_min, static int nss_cmd_setpwent_ext(struct cli_ctx *cctx, bool immediate) { - struct nss_domain_info *info; + struct sss_domain_info *info; struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; struct getent_ctx *gctx; @@ -832,8 +835,11 @@ static int nss_cmd_setpwent_ext(struct cli_ctx *cctx, bool immediate) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, (const void ***)&domains, &num); + if (ret != EOK) { + return ret; + } /* check if enumeration is enabled in any domain */ for (i = 0; i < num; i++) { @@ -1515,7 +1521,7 @@ static int nss_cmd_getgrgid(struct cli_ctx *cctx) { struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; - struct nss_domain_info *info; + struct sss_domain_info *info; const char **domains; uint8_t *body; size_t blen; @@ -1541,8 +1547,11 @@ static int nss_cmd_getgrgid(struct cli_ctx *cctx) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, - (const void ***)&domains, &num); + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + (const void ***)&domains, &num); + if (ret != EOK) { + return ret; + } cmdctx->nr = num; @@ -1693,7 +1702,7 @@ static void nss_cmd_setgr_dp_callback(uint16_t err_maj, uint32_t err_min, static int nss_cmd_setgrent_ext(struct cli_ctx *cctx, bool immediate) { - struct nss_domain_info *info; + struct sss_domain_info *info; struct nss_cmd_ctx *cmdctx; struct nss_dom_ctx *dctx; struct getent_ctx *gctx; @@ -1728,8 +1737,11 @@ static int nss_cmd_setgrent_ext(struct cli_ctx *cctx, bool immediate) domains = NULL; num = 0; /* get domains list */ - btreemap_get_keys(cmdctx, cctx->nctx->domain_map, - (const void ***)&domains, &num); + ret = btreemap_get_keys(cmdctx, cctx->nctx->domain_map, + (const void ***)&domains, &num); + if(ret != EOK) { + return ret; + } /* check if enumeration is enabled in any domain */ for (i = 0; i < num; i++) { |