X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/4aafe74aea2d616a5d9611c6e3c01a182a0b37ec..8d14d66b84cc370cefe54b33de1b95bb49c90bf6:/stats.c?ds=inline diff --git a/stats.c b/stats.c index db8566b..88d7a05 100644 --- a/stats.c +++ b/stats.c @@ -9,10 +9,12 @@ #include #include +#include "cleanup.h" #include "getcgi.h" #include "hash.h" #include "keydb.h" #include "ll.h" +#include "onak-conf.h" #include "stats.h" /** @@ -24,7 +26,7 @@ */ void initcolour(bool parent) { - unsigned long loop; + unsigned int loop; struct ll *curkey; /* @@ -56,23 +58,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 = config.dbbackend->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 +92,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 +115,130 @@ 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 = config.dbbackend->getfullkeyid(have); + fullwant = config.dbbackend->getfullkeyid(want); /* * Make sure the keys we have and want are in the cache. */ - hash_getkeysigs(have); - hash_getkeysigs(want); + (void) config.dbbackend->cached_getkeysigs(fullhave); + (void) config.dbbackend->cached_getkeysigs(fullwant); - if ((keyinfoa = findinhash(have)) == NULL) { - printf("Couldn't find key 0x%llX.\n", have); + if ((keyinfoa = findinhash(fullhave)) == NULL) { + printf("Couldn't find key 0x%016" PRIX64 ".\n", have); return; } - if ((keyinfob = findinhash(want)) == NULL) { - printf("Couldn't find key 0x%llX.\n", want); + if ((keyinfob = findinhash(fullwant)) == NULL) { + printf("Couldn't find key 0x%016" PRIX64 ".\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 ? "
" : "", + rec, hashelements(), html ? "
" : ""); - 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%08" PRIX64 + " to 0x%08" PRIX64 "%s\n", have, want, html ? "
" : ""); - } else { - printf("%d steps from 0x%08llX to 0x%08llX%s\n", + } else { + printf("Can't find any further paths%s\n", + html ? "
" : ""); + } + pathnum = count; + } else { + printf("%d steps from 0x%08" PRIX64 " to 0x%08" PRIX64 + "%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(keyid2uid(curkey->keyid)), - (curkey->keyid == want) ? "" : - " signs"); + curkey = keyinfoa; + while (curkey != NULL && curkey->keyid != 0) { + uid = config.dbbackend->keyid2uid( + curkey->keyid); + if (html && uid == NULL) { + printf("0x%08" PRIX64 + " ([" + "User id not found])%s
\n", + curkey->keyid & 0xFFFFFFFF, + curkey->keyid & 0xFFFFFFFF, + (curkey->keyid == fullwant) ? + "" : " signs"); + } else if (html && uid != NULL) { + printf("0x%08" + PRIX64 "" + " (%s)%s" + "
\n", + curkey->keyid & 0xFFFFFFFF, + curkey->keyid & 0xFFFFFFFF, + curkey->keyid & 0xFFFFFFFF, + txt2html(uid), + (curkey->keyid == fullwant) ? + "" : " signs"); + } else { + printf("0x%08" PRIX64 " (%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("

List of key ids in path:

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

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); + curkey = keyinfoa; + while (curkey != NULL && curkey->keyid != 0) { + printf("0x%08" PRIX64 " ", + curkey->keyid & 0xFFFFFFFF); + curkey = findinhash(curkey->parent); + } + putchar('\n'); } - putchar('\n'); + pathnum++; } } @@ -214,7 +263,7 @@ struct stats_key *furthestkey(struct stats_key *have) curll = lladd(NULL, have); while (curll != NULL) { - sigs = hash_getkeysigs(((struct stats_key *) + sigs = config.dbbackend->cached_getkeysigs(((struct stats_key *) curll->object)->keyid); while (sigs != NULL) { if (((struct stats_key *) sigs->object)->colour == 0) {