]> git.sommitrealweird.co.uk Git - onak.git/blobdiff - stats.c
cscvs to tla changeset 44
[onak.git] / stats.c
diff --git a/stats.c b/stats.c
index 0e2662b4e95e90a54a32696bf64baca1ad9dffb9..3f897ca905e5a4f1d95b633f2bc2be6c9b584342 100644 (file)
--- a/stats.c
+++ b/stats.c
@@ -6,8 +6,10 @@
  * Copyright 2000-2002 Project Purple
  */
 
  * Copyright 2000-2002 Project Purple
  */
 
+#include <stdio.h>
 #include <stdlib.h>
 
 #include <stdlib.h>
 
+#include "getcgi.h"
 #include "hash.h"
 #include "keydb.h"
 #include "ll.h"
 #include "hash.h"
 #include "keydb.h"
 #include "ll.h"
@@ -54,6 +56,7 @@ void initcolour(bool parent)
 unsigned long findpath(struct stats_key *have, struct stats_key *want)
 {
        struct ll *keys = NULL;
 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;
        struct ll *sigs = NULL;
        struct ll *nextkeys = NULL;
        long curdegree = 0;
@@ -61,6 +64,7 @@ unsigned long findpath(struct stats_key *have, struct stats_key *want)
        
        curdegree = 1;
        keys = lladd(NULL, want);
        
        curdegree = 1;
        keys = lladd(NULL, want);
+       oldkeys = keys;
 
        while (keys != NULL && have->colour == 0) {
                sigs = hash_getkeysigs(((struct stats_key *)
 
        while (keys != NULL && have->colour == 0) {
                sigs = hash_getkeysigs(((struct stats_key *)
@@ -84,14 +88,131 @@ unsigned long findpath(struct stats_key *have, struct stats_key *want)
                keys = keys->next;
                if (keys == NULL) {
                        keys = nextkeys;
                keys = keys->next;
                if (keys == NULL) {
                        keys = nextkeys;
+                       llfree(oldkeys, NULL);
+                       oldkeys = keys;
                        nextkeys = NULL;
                        curdegree++;
                }
        }
                        nextkeys = NULL;
                        curdegree++;
                }
        }
+       if (oldkeys != NULL) {
+               llfree(oldkeys, NULL);
+               oldkeys = NULL;
+       }
+       if (nextkeys != NULL) {
+               llfree(nextkeys, NULL);
+               nextkeys = NULL;
+       }
 
        return count;
 }
 
 
        return count;
 }
 
+/**
+ *     dofindpath - Given 2 keys displays a path between them.
+ *     @have: The key we have.
+ *     @want: The key we want to get to.
+ *     @html: Should we output in html.
+ *
+ *     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)
+{
+       struct stats_key *keyinfoa, *keyinfob, *curkey;
+       uint64_t fullhave, fullwant;
+       int rec;
+       char *uid;
+
+       fullhave = getfullkeyid(have);
+       fullwant = getfullkeyid(want);
+
+       /*
+        * Make sure the keys we have and want are in the cache.
+        */
+       hash_getkeysigs(fullhave);
+       hash_getkeysigs(fullwant);
+
+       if ((keyinfoa = findinhash(fullhave)) == NULL) {
+               printf("Couldn't find key 0x%llX.\n", have);
+               return;
+       }
+       if ((keyinfob = findinhash(fullwant)) == NULL) {
+               printf("Couldn't find key 0x%llX.\n", want);
+               return;
+       }
+       
+       /*
+        * 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,
+                       hashelements(),
+                       html ? "<BR>" : "");
+       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",
+                               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(uid),
+                                       (curkey->keyid == want) ? "" :
+                                        " signs");
+                       } else {
+                               printf("0x%08llX (%s)%s\n",
+                                       curkey->keyid & 0xFFFFFFFF,
+                                       (uid == NULL) ? "[User id not found]" :
+                                               uid,
+                                       (curkey->keyid == want) ? "" :
+                                        " signs");
+                       }
+                       if (uid != NULL) {
+                               free(uid);
+                               uid = NULL;
+                       }
+                       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');
+       }
+}
+
+
+
 struct stats_key *furthestkey(struct stats_key *have)
 {
        unsigned long count = 0;
 struct stats_key *furthestkey(struct stats_key *have)
 {
        unsigned long count = 0;