svn commit: samba r8210 - in branches/SAMBA_4_0/source/librpc/ndr: .
metze at samba.org
metze at samba.org
Thu Jul 7 19:13:33 GMT 2005
Author: metze
Date: 2005-07-07 19:13:32 +0000 (Thu, 07 Jul 2005)
New Revision: 8210
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8210
Log:
- 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
Modified:
branches/SAMBA_4_0/source/librpc/ndr/ndr.c
Changeset:
Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr.c 2005-07-07 15:39:23 UTC (rev 8209)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr.c 2005-07-07 19:13:32 UTC (rev 8210)
@@ -409,10 +409,10 @@
/*
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 @@
}
/*
- 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;
}
More information about the samba-cvs
mailing list