X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=stats.c;h=3f897ca905e5a4f1d95b633f2bc2be6c9b584342;hb=319c08fc2d09d48f71efbe435a878ff9160bdbb2;hp=0e2662b4e95e90a54a32696bf64baca1ad9dffb9;hpb=4b8483ae278577a3adc8d84da81d77019704466f;p=onak.git diff --git a/stats.c b/stats.c index 0e2662b..3f897ca 100644 --- a/stats.c +++ b/stats.c @@ -6,8 +6,10 @@ * Copyright 2000-2002 Project Purple */ +#include #include +#include "getcgi.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; + struct ll *oldkeys = NULL; 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); + oldkeys = keys; 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; + 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; } +/** + * 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 ? "
" : ""); + if (keyinfoa->colour == 0) { + printf("Can't find a link from 0x%08llX to 0x%08llX%s\n", + have, + want, + html ? "
" : ""); + } else { + printf("%d steps from 0x%08llX to 0x%08llX%s\n", + keyinfoa->colour, have & 0xFFFFFFFF, + want & 0xFFFFFFFF, + html ? "
" : ""); + curkey = keyinfoa; + while (curkey != NULL && curkey->keyid != 0) { + uid = keyid2uid(curkey->keyid); + if (html && uid == NULL) { + printf("" + "0x%08llX ([User id not found])%s" + "
\n", + curkey->keyid & 0xFFFFFFFF, + curkey->keyid & 0xFFFFFFFF, + (curkey->keyid == want) ? "" : + " signs"); + } else if (html && uid != NULL) { + printf("" + "0x%08llX" + " (%s)%s
\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("

List of key ids in path:

"); + } 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;