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