1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

r8210: - make the ndr_token_* function public

- allow comparison function to be passed for ndr_token_retrive_cmp_fn(),
  this is for matching the keys, if NULL is passed, the old behavior
  tok->key == key is used

metze
This commit is contained in:
Stefan Metzmacher 2005-07-07 19:13:32 +00:00 committed by Gerald (Jerry) Carter
parent 3f0a6efd74
commit 019f3dc767

View File

@ -409,10 +409,10 @@ NTSTATUS ndr_push_subcontext_header(struct ndr_push *ndr,
/*
store a token in the ndr context, for later retrieval
*/
static NTSTATUS ndr_token_store(TALLOC_CTX *mem_ctx,
struct ndr_token_list **list,
const void *key,
uint32_t value)
NTSTATUS ndr_token_store(TALLOC_CTX *mem_ctx,
struct ndr_token_list **list,
const void *key,
uint32_t value)
{
struct ndr_token_list *tok;
tok = talloc(mem_ctx, struct ndr_token_list);
@ -426,32 +426,43 @@ static NTSTATUS ndr_token_store(TALLOC_CTX *mem_ctx,
}
/*
retrieve a token from a ndr context
retrieve a token from a ndr context, using cmp_fn to match the tokens
*/
static NTSTATUS ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v)
NTSTATUS ndr_token_retrieve_cmp_fn(struct ndr_token_list **list, const void *key, uint32_t *v,
comparison_fn_t _cmp_fn, BOOL _remove_tok)
{
struct ndr_token_list *tok;
for (tok=*list;tok;tok=tok->next) {
if (tok->key == key) {
DLIST_REMOVE((*list), tok);
*v = tok->value;
return NT_STATUS_OK;
}
if (_cmp_fn && _cmp_fn(tok->key,key)==0) goto found;
else if (!_cmp_fn && tok->key == key) goto found;
}
return ndr_map_error(NDR_ERR_TOKEN);
found:
*v = tok->value;
if (_remove_tok) {
DLIST_REMOVE((*list), tok);
talloc_free(tok);
}
return NT_STATUS_OK;
}
/*
retrieve a token from a ndr context
*/
NTSTATUS ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v)
{
return ndr_token_retrieve_cmp_fn(list, key, v, NULL, True);
}
/*
peek at but don't removed a token from a ndr context
*/
static uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key)
uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key)
{
struct ndr_token_list *tok;
for (tok=*list;tok;tok=tok->next) {
if (tok->key == key) {
return tok->value;
}
}
NTSTATUS status;
uint32_t v;
status = ndr_token_retrieve_cmp_fn(list, key, &v, NULL, False);
if (NT_STATUS_IS_OK(status)) return v;
return 0;
}