]> git.sommitrealweird.co.uk Git - onak.git/blobdiff - stats.c
Make failure to load backend fatal.
[onak.git] / stats.c
diff --git a/stats.c b/stats.c
index db8566bc859335b773a0f2d33fb06d9bfd8ce3f4..da1f13c54e007b70fd8046b95b62f327fd58b602 100644 (file)
--- a/stats.c
+++ b/stats.c
@@ -9,6 +9,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "cleanup.h"
 #include "getcgi.h"
 #include "hash.h"
 #include "keydb.h"
@@ -24,7 +25,7 @@
  */
 void initcolour(bool parent)
 {
-       unsigned long loop;
+       unsigned int loop;
        struct ll *curkey;
 
        /*
@@ -56,23 +57,27 @@ void initcolour(bool parent)
 unsigned long findpath(struct stats_key *have, struct stats_key *want)
 {
        struct ll *keys = NULL;
+       struct ll *oldkeys = NULL;
        struct ll *sigs = NULL;
        struct ll *nextkeys = NULL;
        long curdegree = 0;
-       long count = 0;
+       unsigned long count = 0;
        
        curdegree = 1;
        keys = lladd(NULL, want);
+       oldkeys = keys;
 
-       while (keys != NULL && have->colour == 0) {
-               sigs = hash_getkeysigs(((struct stats_key *)
+       while ((!cleanup()) && keys != NULL && have->colour == 0) {
+               sigs = cached_getkeysigs(((struct stats_key *)
                                        keys->object)->keyid);
-               while (sigs != NULL && have->colour == 0) {
+               while ((!cleanup()) && sigs != NULL && have->colour == 0) {
                        /*
                         * 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)->revoked &&
+                           ((struct stats_key *)sigs->object)->colour == 0) {
                                count++;
                                ((struct stats_key *)sigs->object)->colour =
                                        curdegree;
@@ -86,10 +91,20 @@ unsigned long findpath(struct stats_key *have, struct stats_key *want)
                keys = keys->next;
                if (keys == NULL) {
                        keys = nextkeys;
+                       llfree(oldkeys, NULL);
+                       oldkeys = keys;
                        nextkeys = NULL;
                        curdegree++;
                }
        }
+       if (oldkeys != NULL) {
+               llfree(oldkeys, NULL);
+               oldkeys = NULL;
+       }
+       if (nextkeys != NULL) {
+               llfree(nextkeys, NULL);
+               nextkeys = NULL;
+       }
 
        return count;
 }
@@ -99,97 +114,124 @@ 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;
 
-       have = getfullkeyid(have);
-       want = getfullkeyid(want);
+       fullhave = getfullkeyid(have);
+       fullwant = getfullkeyid(want);
 
        /*
         * Make sure the keys we have and want are in the cache.
         */
-       hash_getkeysigs(have);
-       hash_getkeysigs(want);
+       (void) cached_getkeysigs(fullhave);
+       (void) cached_getkeysigs(fullwant);
 
-       if ((keyinfoa = findinhash(have)) == NULL) {
+       if ((keyinfoa = findinhash(fullhave)) == NULL) {
                printf("Couldn't find key 0x%llX.\n", have);
                return;
        }
-       if ((keyinfob = findinhash(want)) == NULL) {
+       if ((keyinfob = findinhash(fullwant)) == NULL) {
                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 ((!cleanup()) && (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) {
+                       if (pathnum == 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("Can't find any further paths%s\n",
+                                       html ? "<BR>" : "");
+                       }
+                       pathnum = count;
+               } 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=%llX\">"
-                                       "0x%08llX</a> ([User id not found])%s"
-                                       "<BR>\n",
-                                       curkey->keyid & 0xFFFFFFFF,
-                                       curkey->keyid & 0xFFFFFFFF,
-                                       (curkey->keyid == want) ? "" :
-                                        " signs");
-                       } else if (html && uid != NULL) {
-                               printf("<a href=\"lookup?op=get&search=%llX\">"
-                                       "0x%08llX</a> (<a href=\"lookup?op=vindex"
-                                       "&search=0x%llX\">%s</a>)%s<BR>\n",
-                                       curkey->keyid & 0xFFFFFFFF,
-                                       curkey->keyid & 0xFFFFFFFF,
-                                       curkey->keyid & 0xFFFFFFFF,
-                                       txt2html(keyid2uid(curkey->keyid)),
-                                       (curkey->keyid == want) ? "" :
-                                        " 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 == want) ? "" :
-                                        " signs");
+                               puts("List of key ids in path:");
                        }
-                       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);
+                       curkey = keyinfoa;
+                       while (curkey != NULL && curkey->keyid != 0) {
+                               printf("0x%08llX ", curkey->keyid & 0xFFFFFFFF);
+                               curkey = findinhash(curkey->parent);
+                       }
+                       putchar('\n');
                }
-               putchar('\n');
+               pathnum++;
        }
 }
 
@@ -214,7 +256,7 @@ struct stats_key *furthestkey(struct stats_key *have)
        curll = lladd(NULL, have);
 
        while (curll != NULL) {
-               sigs = hash_getkeysigs(((struct stats_key *)
+               sigs = cached_getkeysigs(((struct stats_key *)
                                curll->object)->keyid);
                while (sigs != NULL) {
                        if (((struct stats_key *) sigs->object)->colour == 0) {