cscvs to tla changeset 68
authorJonathan McDowell <noodles@earth.li>
Mon, 31 May 2004 23:47:34 +0000 (23:47 +0000)
committerJonathan McDowell <noodles@earth.li>
Mon, 31 May 2004 23:47:34 +0000 (23:47 +0000)
Author: noodles
Date: 2003/04/19 14:18:33
Allow searching for multiple paths between keys.

gpgwww.c
keydb.c
keystructs.h
maxpath.c
stats.c
stats.h

index f5b16448de0f4591318631bda69dd9c093b19976..f163ca4eb40e38e0d5ebc8e0590c49de74236af7 100644 (file)
--- 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 3fe3d34d85afe8632e9426b2e08a3ea23bdb897e..406f857147aa29391083db351b3f77d36430c338 100644 (file)
--- 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()");
index ec1d55556719b1f758c2d660095bdc1506c6a47c..e145fdf7af1b7a15ff744123ef3b6cff18f8162c 100644 (file)
@@ -95,6 +95,7 @@ struct stats_key {
        uint64_t parent;
        struct ll *sigs;
        bool gotsigs;
+       bool disabled;
 };
 
 #endif /* __KEYSTRUCTS_H__ */
index 21f23c281655305c196a96bbd70dd4630c1c9a07..2f813dec734e555a2359fb1278c95d6e658e2fac 100644 (file)
--- 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 2e6347976fccf04b337525268001ede24a36ea00..61b527826c95f3b3fbb47fffea06b434d66aab91 100644 (file)
--- 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 4b7cf09ffa0f03cfa807890491720e3da11b42ab..3696e0849283cbd9e76a9e6e4f04532ca9e2753d 100644 (file)
--- 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);