From e3ee7975fc8f8b343390272663b8c644030b17c1 Mon Sep 17 00:00:00 2001
From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:47:34 +0000
Subject: [PATCH] cscvs to tla changeset 68 Author: noodles Date: 2003/04/19
 14:18:33 Allow searching for multiple paths between keys.

---
 gpgwww.c     |   2 +-
 keydb.c      |   1 +
 keystructs.h |   1 +
 maxpath.c    |   2 +-
 stats.c      | 136 ++++++++++++++++++++++++++++-----------------------
 stats.h      |   3 +-
 6 files changed, 82 insertions(+), 63 deletions(-)

diff --git a/gpgwww.c b/gpgwww.c
index f5b1644..f163ca4 100644
--- a/gpgwww.c
+++ b/gpgwww.c
@@ -59,7 +59,7 @@ int main(int argc, char *argv[])
 	initlogthing("gpgwww", config.logfile);
 	initdb();
 	inithash();
-	dofindpath(from, to, true);
+	dofindpath(from, to, true, 3);
 	destroyhash();
 	cleanupdb();
 	cleanuplogthing();
diff --git a/keydb.c b/keydb.c
index 3fe3d34..406f857 100644
--- a/keydb.c
+++ b/keydb.c
@@ -109,6 +109,7 @@ struct ll *cached_getkeysigs(uint64_t keyid)
 			key->parent = 0;
 			key->sigs = NULL;
 			key->gotsigs = false;
+			key->disabled = false;
 			addtohash(key);
 		} else {
 			perror("cached_getkeysigs()");
diff --git a/keystructs.h b/keystructs.h
index ec1d555..e145fdf 100644
--- a/keystructs.h
+++ b/keystructs.h
@@ -95,6 +95,7 @@ struct stats_key {
 	uint64_t parent;
 	struct ll *sigs;
 	bool gotsigs;
+	bool disabled;
 };
 
 #endif /* __KEYSTRUCTS_H__ */
diff --git a/maxpath.c b/maxpath.c
index 21f23c2..2f813de 100644
--- a/maxpath.c
+++ b/maxpath.c
@@ -64,7 +64,7 @@ void findmaxpath(unsigned long max)
 			from->keyid,
 			to->keyid,
 			distance);
-	dofindpath(to->keyid, from->keyid, false);
+	dofindpath(to->keyid, from->keyid, false, 1);
 }
 
 int main(int argc, char *argv[])
diff --git a/stats.c b/stats.c
index 2e63479..61b5278 100644
--- a/stats.c
+++ b/stats.c
@@ -74,7 +74,8 @@ unsigned long findpath(struct stats_key *have, struct stats_key *want)
 			 * Check if we've seen this key before and if not mark
 			 * it and add its sigs to the list we want to look at.
 			 */
-			if (((struct stats_key *)sigs->object)->colour == 0) {
+			if (!((struct stats_key *)sigs->object)->disabled &&
+			    ((struct stats_key *)sigs->object)->colour == 0) {
 				count++;
 				((struct stats_key *)sigs->object)->colour =
 					curdegree;
@@ -111,16 +112,18 @@ unsigned long findpath(struct stats_key *have, struct stats_key *want)
  *	@have: The key we have.
  *	@want: The key we want to get to.
  *	@html: Should we output in html.
+ *	@count: How many paths we should look for.
  *
  *	This does a breadth first search on the key tree, starting with the
  *	key we have. It returns as soon as a path is found or when we run out
  *	of keys; whichever comes sooner.
  */
-void dofindpath(uint64_t have, uint64_t want, bool html)
+void dofindpath(uint64_t have, uint64_t want, bool html, int count)
 {
 	struct stats_key *keyinfoa, *keyinfob, *curkey;
 	uint64_t fullhave, fullwant;
 	int rec;
+	int pathnum;
 	char *uid;
 
 	fullhave = getfullkeyid(have);
@@ -140,81 +143,94 @@ void dofindpath(uint64_t have, uint64_t want, bool html)
 		printf("Couldn't find key 0x%llX.\n", want);
 		return;
 	}
+
+	pathnum = 0;
 	
-	/*
-	 * Fill the tree info up.
-	 */
-	initcolour(true);
-	rec = findpath(keyinfoa, keyinfob);
-	keyinfob->parent = 0;
+	while (pathnum < count) {
+		/*
+		 * Fill the tree info up.
+		 */
+		initcolour(true);
+		rec = findpath(keyinfoa, keyinfob);
+		keyinfob->parent = 0;
 
-	printf("%d nodes examined. %ld elements in the hash%s\n", rec,
+		printf("%s%d nodes examined. %ld elements in the hash%s\n",
+			html ? "<HR>" : "",
+			rec,
 			hashelements(),
 			html ? "<BR>" : "");
-	if (keyinfoa->colour == 0) {
-		printf("Can't find a link from 0x%08llX to 0x%08llX%s\n",
+		if (keyinfoa->colour == 0) {
+			printf("Can't find a link from 0x%08llX to 0x%08llX"
+				"%s\n",
 				have,
 				want,
 				html ? "<BR>" : "");
-	} else {
-		printf("%d steps from 0x%08llX to 0x%08llX%s\n",
+		} else {
+			printf("%d steps from 0x%08llX to 0x%08llX%s\n",
 				keyinfoa->colour, have & 0xFFFFFFFF,
 				want & 0xFFFFFFFF,
 				html ? "<BR>" : "");
-		curkey = keyinfoa;
-		while (curkey != NULL && curkey->keyid != 0) {
-			uid = keyid2uid(curkey->keyid);
-			if (html && uid == NULL) {
-				printf("<a href=\"lookup?op=get&search="
-					"0x%08llX\">0x%08llX</a> ([User id"
-					" not found])%s<BR>\n",
-					curkey->keyid & 0xFFFFFFFF,
-					curkey->keyid & 0xFFFFFFFF,
-					(curkey->keyid == fullwant) ? "" :
-					 " signs");
-			} else if (html && uid != NULL) {
-				printf("<a href=\"lookup?op=get&search="
-					"0x%08llX\">0x%08llX</a>"
-					" (<a href=\"lookup?op=vindex"
-					"&search=0x%08llX\">%s</a>)%s<BR>\n",
-					curkey->keyid & 0xFFFFFFFF,
-					curkey->keyid & 0xFFFFFFFF,
-					curkey->keyid & 0xFFFFFFFF,
-					txt2html(uid),
-					(curkey->keyid == fullwant) ? "" :
-					 " signs");
+			curkey = keyinfoa;
+			while (curkey != NULL && curkey->keyid != 0) {
+				uid = keyid2uid(curkey->keyid);
+				if (html && uid == NULL) {
+					printf("<a href=\"lookup?op=get&search="
+						"0x%08llX\">0x%08llX</a> (["
+						"User id not found])%s<BR>\n",
+						curkey->keyid & 0xFFFFFFFF,
+						curkey->keyid & 0xFFFFFFFF,
+						(curkey->keyid == fullwant) ?
+							"" : " signs");
+				} else if (html && uid != NULL) {
+					printf("<a href=\"lookup?op=get&search="
+						"0x%08llX\">0x%08llX</a>"
+						" (<a href=\"lookup?op=vindex&"
+						"search=0x%08llX\">%s</a>)%s"
+						"<BR>\n",
+						curkey->keyid & 0xFFFFFFFF,
+						curkey->keyid & 0xFFFFFFFF,
+						curkey->keyid & 0xFFFFFFFF,
+						txt2html(uid),
+						(curkey->keyid == fullwant) ?
+						"" : " signs");
+				} else {
+					printf("0x%08llX (%s)%s\n",
+						curkey->keyid & 0xFFFFFFFF,
+						(uid == NULL) ?
+							"[User id not found]" :
+							uid,
+						(curkey->keyid == fullwant) ?
+						"" : " signs");
+				}
+				if (uid != NULL) {
+					free(uid);
+					uid = NULL;
+				}
+				if (curkey != keyinfoa && curkey != keyinfob) {
+					curkey->disabled = true;
+				}
+				curkey = findinhash(curkey->parent);
+			}
+			if (html) {
+				puts("<P>List of key ids in path:</P>");
 			} else {
-				printf("0x%08llX (%s)%s\n",
-					curkey->keyid & 0xFFFFFFFF,
-					(uid == NULL) ? "[User id not found]" :
-						uid,
-					(curkey->keyid == fullwant) ? "" :
-					 " signs");
+				puts("List of key ids in path:");
 			}
-			if (uid != NULL) {
-				free(uid);
-				uid = NULL;
+			curkey = keyinfoa;
+			while (curkey != NULL && curkey->keyid != 0) {
+				printf("0x%08llX ", curkey->keyid & 0xFFFFFFFF);
+				curkey = findinhash(curkey->parent);
 			}
-			curkey = findinhash(curkey->parent);
-		}
-		if (html) {
-			puts("<P>List of key ids in path:</P>");
-		} else {
-			puts("List of key ids in path:");
-		}
-		curkey = keyinfoa;
-		while (curkey != NULL && curkey->keyid != 0) {
-			printf("0x%08llX ", curkey->keyid & 0xFFFFFFFF);
-			curkey = findinhash(curkey->parent);
-		}
-		putchar('\n');
-		if (html) {
-			printf("<BR>"
-				"<A HREF=\"gpgwww?from=0x%08llX&to=0x%08llX\">"
+			putchar('\n');
+			if (html) {
+				printf("<BR><A HREF=\"gpgwww?from=0x%08llX&"
+					"to=0x%08llX\">"
 					"Find reverse path</A>\n",
 					want,
 					have);
+			}
 		}
+		pathnum++;
 	}
 }
 
diff --git a/stats.h b/stats.h
index 4b7cf09..3696e08 100644
--- a/stats.h
+++ b/stats.h
@@ -50,12 +50,13 @@ unsigned long findpath(struct stats_key *have, struct stats_key *want);
  *	@have: The key we have.
  *	@want: The key we want to get to.
  *	@html: Should we output in html.
+ *	@count: How many paths we should look for at most.
  *
  *	This does a breadth first search on the key tree, starting with the
  *	key we have. It returns as soon as a path is found or when we run out
  *	of keys; whichever comes sooner.
  */
-void dofindpath(uint64_t have, uint64_t want, bool html);
+void dofindpath(uint64_t have, uint64_t want, bool html, int count);
 
 struct stats_key *furthestkey(struct stats_key *have);
 
-- 
2.39.5