diff options
| author | Pavel Březina <pbrezina@redhat.com> | 2016-10-26 12:20:13 +0200 |
|---|---|---|
| committer | Lukas Slebodnik <lslebodn@redhat.com> | 2016-12-19 23:23:37 +0100 |
| commit | 4e2c15e6b7c4015fa787f8c624c2ec10153e99f6 (patch) | |
| tree | b6e31e55f68240c207e27fc7faf615835b3f3e6b /src/responder/common/cache_req | |
| parent | 6b159f14f69134bba8510a6b50ab62493a23a73f (diff) | |
| download | sssd-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.c | 57 | ||||
| -rw-r--r-- | src/responder/common/cache_req/cache_req.h | 10 |
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, |
