summaryrefslogtreecommitdiffstats
path: root/src/responder/common/cache_req
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2016-10-26 12:20:13 +0200
committerLukas Slebodnik <lslebodn@redhat.com>2016-12-19 23:23:37 +0100
commit4e2c15e6b7c4015fa787f8c624c2ec10153e99f6 (patch)
treeb6e31e55f68240c207e27fc7faf615835b3f3e6b /src/responder/common/cache_req
parent6b159f14f69134bba8510a6b50ab62493a23a73f (diff)
downloadsssd-4e2c15e6b7c4015fa787f8c624c2ec10153e99f6.tar.gz
sssd-4e2c15e6b7c4015fa787f8c624c2ec10153e99f6.tar.xz
sssd-4e2c15e6b7c4015fa787f8c624c2ec10153e99f6.zip
cache_req: allow shallow copy of result
For enumeration purpose, we want to limit the number of returned results This is a preparation for changes in NSS responder. Resolves: https://fedorahosted.org/sssd/ticket/3151 Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Diffstat (limited to 'src/responder/common/cache_req')
-rw-r--r--src/responder/common/cache_req/cache_req.c57
-rw-r--r--src/responder/common/cache_req/cache_req.h10
2 files changed, 67 insertions, 0 deletions
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
index ef161787a..1c25c76bc 100644
--- a/src/responder/common/cache_req/cache_req.c
+++ b/src/responder/common/cache_req/cache_req.c
@@ -21,6 +21,7 @@
#include <ldb.h>
#include <talloc.h>
#include <tevent.h>
+#include <errno.h>
#include "util/util.h"
#include "responder/common/cache_req/cache_req_private.h"
@@ -751,3 +752,59 @@ cache_req_create_result(TALLOC_CTX *mem_ctx,
return result;
}
+
+struct cache_req_result *
+cache_req_copy_limited_result(TALLOC_CTX *mem_ctx,
+ struct cache_req_result *result,
+ uint32_t start,
+ uint32_t limit)
+{
+ struct cache_req_result *out = NULL;
+ struct ldb_result *ldb_result;
+ unsigned int left;
+ errno_t ret;
+
+ if (start >= result->count) {
+ ret = ERANGE;
+ goto done;
+ }
+
+ out = talloc_zero(mem_ctx, struct cache_req_result);
+ if (out == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ldb_result = talloc_zero(out, struct ldb_result);
+ if (ldb_result == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ left = result->count - start;
+
+ ldb_result->extended = result->ldb_result->extended;
+ ldb_result->controls = result->ldb_result->controls;
+ ldb_result->refs = result->ldb_result->refs;
+ ldb_result->msgs = &(result->ldb_result->msgs[start]);
+ ldb_result->count = left < limit ? left : limit;
+
+ out->domain = result->domain;
+ out->ldb_result = ldb_result;
+ out->lookup_name = result->lookup_name;
+ out->count = ldb_result->count;
+ out->msgs = ldb_result->msgs;
+
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create cache request result "
+ "[%d]: %s\n", ret, sss_strerror(ret));
+
+ talloc_free(out);
+ return NULL;
+ }
+
+ return out;
+}
diff --git a/src/responder/common/cache_req/cache_req.h b/src/responder/common/cache_req/cache_req.h
index a3e3cdc6e..73c00b6e2 100644
--- a/src/responder/common/cache_req/cache_req.h
+++ b/src/responder/common/cache_req/cache_req.h
@@ -116,6 +116,16 @@ struct cache_req_result {
const char *lookup_name;
};
+/**
+ * Shallow copy of cache request result, limiting the result to a maximum
+ * numbers of records.
+ */
+struct cache_req_result *
+cache_req_copy_limited_result(TALLOC_CTX *mem_ctx,
+ struct cache_req_result *result,
+ uint32_t start,
+ uint32_t limit);
+
/* Generic request. */
struct tevent_req *cache_req_send(TALLOC_CTX *mem_ctx,