summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPavel Reichl <preichl@redhat.com>2014-04-17 16:14:11 +0000
committerJakub Hrozek <jhrozek@redhat.com>2014-06-19 18:04:02 +0200
commit96d5ff54565f6aaccd09ed4c84b45a712345fcc9 (patch)
treed26433a20950ee447fea038166d46786ea31e77c /src
parent09be002e58babda513b4b75d2b9eb9b2c351fa26 (diff)
downloadsssd-96d5ff54565f6aaccd09ed4c84b45a712345fcc9.tar.gz
sssd-96d5ff54565f6aaccd09ed4c84b45a712345fcc9.tar.xz
sssd-96d5ff54565f6aaccd09ed4c84b45a712345fcc9.zip
NSS: sysdb_getnetgr refactor
Move functionality for creating cache dummies into separate function. Reviewed-by: Michal Židek <mzidek@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/responder/nss/nsssrv_netgroup.c66
1 files changed, 46 insertions, 20 deletions
diff --git a/src/responder/nss/nsssrv_netgroup.c b/src/responder/nss/nsssrv_netgroup.c
index fae603b9b..0f7f782a2 100644
--- a/src/responder/nss/nsssrv_netgroup.c
+++ b/src/responder/nss/nsssrv_netgroup.c
@@ -429,6 +429,44 @@ static void set_netgr_lifetime(uint32_t lifetime,
}
}
+/* Create dummy netgroup to speed up repeated negative queries */
+static errno_t create_negcache_netgr(struct setent_step_ctx *step_ctx)
+{
+ errno_t ret;
+ struct getent_ctx *netgr;
+
+ netgr = talloc_zero(step_ctx->nctx, struct getent_ctx);
+ if (netgr == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero failed.\n");
+ ret = ENOMEM;
+ goto done;
+ } else {
+ netgr->ready = true;
+ netgr->found = false;
+ netgr->entries = NULL;
+ netgr->lookup_table = step_ctx->nctx->netgroups;
+ netgr->name = talloc_strdup(netgr, step_ctx->name);
+ if (netgr->name == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup failed.\n");
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = set_netgroup_entry(step_ctx->nctx, netgr);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "set_netgroup_entry failed.\n");
+ goto done;
+ }
+ set_netgr_lifetime(step_ctx->nctx->neg_timeout, step_ctx, netgr);
+ }
+
+done:
+ if (ret != EOK) {
+ talloc_free(netgr);
+ }
+ return ret;
+}
+
static errno_t lookup_netgr_step(struct setent_step_ctx *step_ctx)
{
errno_t ret;
@@ -572,26 +610,14 @@ static errno_t lookup_netgr_step(struct setent_step_ctx *step_ctx)
DEBUG(SSSDBG_MINOR_FAILURE,
"No matching domain found for [%s], fail!\n", step_ctx->name);
- netgr = talloc_zero(step_ctx->nctx, struct getent_ctx);
- if (netgr == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero failed, ignored.\n");
- } else {
- netgr->ready = true;
- netgr->found = false;
- netgr->entries = NULL;
- netgr->lookup_table = step_ctx->nctx->netgroups;
- netgr->name = talloc_strdup(netgr, step_ctx->name);
- if (netgr->name == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup failed.\n");
- talloc_free(netgr);
- return ENOMEM;
- }
-
- ret = set_netgroup_entry(step_ctx->nctx, netgr);
- if (ret != EOK) {
- DEBUG(SSSDBG_CRIT_FAILURE, "set_netgroup_entry failed, ignored.\n");
- }
- set_netgr_lifetime(step_ctx->nctx->neg_timeout, step_ctx, netgr);
+ ret = create_negcache_netgr(step_ctx);
+ if (ret != EOK) {
+ /* Failure can be ignored, because at worst, there will be a slowdown
+ * at the next lookup
+ */
+ DEBUG(SSSDBG_TRACE_ALL,
+ "create_negcache_netgr failed with: %d:[%s], ignored.\n",
+ ret, sss_strerror(ret));
}
return ENOENT;