[SCM] Samba Shared Repository - branch master updated - fe9dd8710d577478b324d1d507de0ecd77df2ea5

Volker Lendecke vlendec at samba.org
Sun Jan 18 23:07:10 GMT 2009


The branch, master has been updated
       via  fe9dd8710d577478b324d1d507de0ecd77df2ea5 (commit)
       via  eaec86514896762aff23f30aca2b944ce07bf7c9 (commit)
      from  a9542ddcb77f0296cb835d0ae337dc54418c1bf4 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit fe9dd8710d577478b324d1d507de0ecd77df2ea5
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jan 19 00:04:33 2009 +0100

    Remove unused tdb_search_keys()

commit eaec86514896762aff23f30aca2b944ce07bf7c9
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jan 19 00:01:08 2009 +0100

    simplify gencache_iterate a bit, fix nonempty blank lines

-----------------------------------------------------------------------

Summary of changes:
 source3/include/util_tdb.h |   10 ---
 source3/lib/gencache.c     |  170 ++++++++++++++++++++++----------------------
 source3/lib/util_tdb.c     |   68 ------------------
 3 files changed, 84 insertions(+), 164 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/util_tdb.h b/source3/include/util_tdb.h
index a5b45e6..127176b 100644
--- a/source3/include/util_tdb.h
+++ b/source3/include/util_tdb.h
@@ -25,13 +25,6 @@
 #include "talloc.h" /* for tdb_wrap_open() */
 #include "../libcli/util/ntstatus.h" /* for map_nt_error_from_tdb() */
 
-/* single node of a list returned by tdb_search_keys */
-typedef struct keys_node 
-{
-	struct keys_node *prev, *next;
-	TDB_DATA node_key;
-} TDB_LIST_NODE;
-
 struct tdb_wrap {
 	struct tdb_context *tdb;
 	const char *name;
@@ -52,9 +45,6 @@ TDB_DATA make_tdb_data(const uint8_t *dptr, size_t dsize);
 TDB_DATA string_tdb_data(const char *string);
 TDB_DATA string_term_tdb_data(const char *string);
 
-TDB_LIST_NODE *tdb_search_keys(struct tdb_context*, const char*);
-void tdb_search_list_free(TDB_LIST_NODE*);
-
 int tdb_chainlock_with_timeout( struct tdb_context *tdb, TDB_DATA key,
 				unsigned int timeout);
 int tdb_lock_bystring(struct tdb_context *tdb, const char *keyval);
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index b773f83..7f133f2 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -5,17 +5,17 @@
    by various parts of the Samba code
 
    Copyright (C) Rafal Szczesniak    2002
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -52,7 +52,7 @@ static TDB_CONTEXT *cache;
 bool gencache_init(void)
 {
 	char* cache_fname = NULL;
-	
+
 	/* skip file open if it's already opened */
 	if (cache) return True;
 
@@ -84,7 +84,7 @@ bool gencache_init(void)
  * @return true on successful closing the cache or
  *         false on failure during cache shutdown
  **/
- 
+
 bool gencache_shutdown(void)
 {
 	int ret;
@@ -108,18 +108,18 @@ bool gencache_shutdown(void)
  * @retval true when entry is successfuly stored
  * @retval false on failure
  **/
- 
+
 bool gencache_set(const char *keystr, const char *value, time_t timeout)
 {
 	int ret;
 	TDB_DATA databuf;
 	char* valstr = NULL;
-	
+
 	/* fail completely if get null pointers passed */
 	SMB_ASSERT(keystr && value);
 
 	if (!gencache_init()) return False;
-	
+
 	if (asprintf(&valstr, CACHE_DATA_FMT, (int)timeout, value) == -1) {
 		return False;
 	}
@@ -132,7 +132,7 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout)
 
 	ret = tdb_store_bystring(cache, keystr, databuf, 0);
 	SAFE_FREE(valstr);
-	
+
 	return ret == 0;
 }
 
@@ -148,15 +148,15 @@ bool gencache_set(const char *keystr, const char *value, time_t timeout)
 bool gencache_del(const char *keystr)
 {
 	int ret;
-	
+
 	/* fail completely if get null pointers passed */
 	SMB_ASSERT(keystr);
 
 	if (!gencache_init()) return False;	
-	
+
 	DEBUG(10, ("Deleting cache entry (key = %s)\n", keystr));
 	ret = tdb_delete_bystring(cache, keystr);
-	
+
 	return ret == 0;
 }
 
@@ -224,7 +224,7 @@ bool gencache_get(const char *keystr, char **valstr, time_t *timeout)
 			return False;
 		}
 	}
-	
+
 	SAFE_FREE(databuf.dptr);
 
 	if (timeout) {
@@ -396,15 +396,74 @@ bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob, time_t ti
  *
  **/
 
+struct gencache_iterate_state {
+	void (*fn)(const char *key, const char *value, time_t timeout,
+		   void *priv);
+	const char *pattern;
+	void *priv;
+};
+
+static int gencache_iterate_fn(struct tdb_context *tdb, TDB_DATA key,
+			       TDB_DATA value, void *priv)
+{
+	struct gencache_iterate_state *state =
+		(struct gencache_iterate_state *)priv;
+	char *keystr;
+	char *free_key = NULL;
+	char *valstr;
+	char *free_val = NULL;
+	unsigned long u;
+	time_t timeout;
+	char *timeout_endp;
+
+	if (key.dptr[key.dsize-1] == '\0') {
+		keystr = (char *)key.dptr;
+	} else {
+		/* ensure 0-termination */
+		keystr = SMB_STRNDUP((char *)key.dptr, key.dsize);
+		free_key = keystr;
+	}
+
+	if ((value.dptr == NULL) || (value.dsize <= TIMEOUT_LEN)) {
+		goto done;
+	}
+
+	if (fnmatch(state->pattern, keystr, 0) != 0) {
+		goto done;
+	}
+
+	if (value.dptr[value.dsize-1] == '\0') {
+		valstr = (char *)value.dptr;
+	} else {
+		/* ensure 0-termination */
+		valstr = SMB_STRNDUP((char *)value.dptr, value.dsize);
+		free_val = valstr;
+	}
+
+	u = strtoul(valstr, &timeout_endp, 10);
+
+	if ((*timeout_endp != '/') || ((timeout_endp-valstr) != TIMEOUT_LEN)) {
+		goto done;
+	}
+
+	timeout = u;
+	timeout_endp += 1;
+
+	DEBUG(10, ("Calling function with arguments "
+		   "(key = %s, value = %s, timeout = %s)\n",
+		   keystr, timeout_endp, ctime(&timeout)));
+	state->fn(keystr, timeout_endp, timeout, state->priv);
+
+ done:
+	SAFE_FREE(free_key);
+	SAFE_FREE(free_val);
+	return 0;
+}
+
 void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr),
                       void* data, const char* keystr_pattern)
 {
-	TDB_LIST_NODE *node, *first_node;
-	TDB_DATA databuf;
-	char *keystr = NULL, *valstr = NULL, *entry = NULL;
-	time_t timeout = 0;
-	int status;
-	unsigned u;
+	struct gencache_iterate_state state;
 
 	/* fail completely if get null pointers passed */
 	SMB_ASSERT(fn && keystr_pattern);
@@ -412,72 +471,11 @@ void gencache_iterate(void (*fn)(const char* key, const char *value, time_t time
 	if (!gencache_init()) return;
 
 	DEBUG(5, ("Searching cache keys with pattern %s\n", keystr_pattern));
-	node = tdb_search_keys(cache, keystr_pattern);
-	first_node = node;
-	
-	while (node) {
-		char *fmt;
-
-		/* ensure null termination of the key string */
-		keystr = SMB_STRNDUP((const char *)node->node_key.dptr, node->node_key.dsize);
-		if (!keystr) {
-			break;
-		}
-		
-		/* 
-		 * We don't use gencache_get function, because we need to iterate through
-		 * all of the entries. Validity verification is up to fn routine.
-		 */
-		databuf = tdb_fetch(cache, node->node_key);
-		if (!databuf.dptr || databuf.dsize <= TIMEOUT_LEN) {
-			SAFE_FREE(databuf.dptr);
-			SAFE_FREE(keystr);
-			node = node->next;
-			continue;
-		}
-		entry = SMB_STRNDUP((const char *)databuf.dptr, databuf.dsize);
-		if (!entry) {
-			SAFE_FREE(databuf.dptr);
-			SAFE_FREE(keystr);
-			break;
-		}
-
-		SAFE_FREE(databuf.dptr);
 
-		valstr = (char *)SMB_MALLOC(databuf.dsize + 1 - TIMEOUT_LEN);
-		if (!valstr) {
-			SAFE_FREE(entry);
-			SAFE_FREE(keystr);
-			break;
-		}
-
-		if (asprintf(&fmt, READ_CACHE_DATA_FMT_TEMPLATE,
-			     (unsigned int)databuf.dsize - TIMEOUT_LEN)
-		    == -1) {
-			SAFE_FREE(valstr);
-			SAFE_FREE(entry);
-			SAFE_FREE(keystr);
-			break;
-		}
-		status = sscanf(entry, fmt, &u, valstr);
-		SAFE_FREE(fmt);
-
-		if ( status != 2 ) {
-			DEBUG(0,("gencache_iterate: invalid return from sscanf %d\n",status));
-		}
-		timeout = u;
-		
-		DEBUG(10, ("Calling function with arguments (key = %s, value = %s, timeout = %s)\n",
-		           keystr, valstr, ctime(&timeout)));
-		fn(keystr, valstr, timeout, data);
-		
-		SAFE_FREE(valstr);
-		SAFE_FREE(entry);
-		SAFE_FREE(keystr);
-		node = node->next;
-	}
-	
-	tdb_search_list_free(first_node);
+	state.fn = fn;
+	state.pattern = keystr_pattern;
+	state.priv = data;
+	tdb_traverse(cache, gencache_iterate_fn, &state);
 }
 
 /********************************************************************
@@ -488,7 +486,7 @@ int gencache_lock_entry( const char *key )
 {
 	if (!gencache_init())
 		return -1;
-	
+
 	return tdb_lock_bystring(cache, key);
 }
 
@@ -500,7 +498,7 @@ void gencache_unlock_entry( const char *key )
 {
 	if (!gencache_init())
 		return;
-	
+
 	tdb_unlock_bystring(cache, key);
 	return;
 }
diff --git a/source3/lib/util_tdb.c b/source3/lib/util_tdb.c
index 03f72df..2dbdd57 100644
--- a/source3/lib/util_tdb.c
+++ b/source3/lib/util_tdb.c
@@ -422,74 +422,6 @@ TDB_CONTEXT *tdb_open_log(const char *name, int hash_size, int tdb_flags,
 	return tdb;
 }
 
-
-/**
- * Search across the whole tdb for keys that match the given pattern
- * return the result as a list of keys
- *
- * @param tdb pointer to opened tdb file context
- * @param pattern searching pattern used by fnmatch(3) functions
- *
- * @return list of keys found by looking up with given pattern
- **/
-TDB_LIST_NODE *tdb_search_keys(TDB_CONTEXT *tdb, const char* pattern)
-{
-	TDB_DATA key, next;
-	TDB_LIST_NODE *list = NULL;
-	TDB_LIST_NODE *rec = NULL;
-	
-	for (key = tdb_firstkey(tdb); key.dptr; key = next) {
-		/* duplicate key string to ensure null-termination */
-		char *key_str = SMB_STRNDUP((const char *)key.dptr, key.dsize);
-		if (!key_str) {
-			DEBUG(0, ("tdb_search_keys: strndup() failed!\n"));
-			smb_panic("strndup failed!\n");
-		}
-		
-		DEBUG(18, ("checking %s for match to pattern %s\n", key_str, pattern));
-		
-		next = tdb_nextkey(tdb, key);
-
-		/* do the pattern checking */
-		if (fnmatch(pattern, key_str, 0) == 0) {
-			rec = SMB_MALLOC_P(TDB_LIST_NODE);
-			ZERO_STRUCTP(rec);
-
-			rec->node_key = key;
-	
-			DLIST_ADD_END(list, rec, TDB_LIST_NODE *);
-		
-			DEBUG(18, ("checking %s matched pattern %s\n", key_str, pattern));
-		} else {
-			free(key.dptr);
-		}
-		
-		/* free duplicated key string */
-		free(key_str);
-	}
-	
-	return list;
-
-}
-
-
-/**
- * Free the list returned by tdb_search_keys
- *
- * @param node list of results found by tdb_search_keys
- **/
-void tdb_search_list_free(TDB_LIST_NODE* node)
-{
-	TDB_LIST_NODE *next_node;
-	
-	while (node) {
-		next_node = node->next;
-		SAFE_FREE(node->node_key.dptr);
-		SAFE_FREE(node);
-		node = next_node;
-	};
-}
-
 /****************************************************************************
  tdb_store, wrapped in a transaction. This way we make sure that a process
  that dies within writing does not leave a corrupt tdb behind.


-- 
Samba Shared Repository


More information about the samba-cvs mailing list