X-Git-Url: http://the.earth.li/gitweb/?p=onak.git;a=blobdiff_plain;f=stats.c;h=91c916688f4473b88005147424238f2d78871b34;hp=b302f09b627282364a09aca1fdc7dfb9d21dd0c8;hb=de18b56efecadc4b5d2473904828db9c08cd2162;hpb=e02c731dfbb288c736f2cd09a9b6df0507c59ddd diff --git a/stats.c b/stats.c index b302f09..91c9166 100644 --- a/stats.c +++ b/stats.c @@ -1,14 +1,27 @@ /* * stats.c - various routines to do stats on the key graph * - * Jonathan McDowell + * Copyright 2000-2004,2007-2009 Jonathan McDowell * - * Copyright 2000-2002 Project Purple + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ +#include #include #include +#include "cleanup.h" +#include "getcgi.h" #include "hash.h" #include "keydb.h" #include "ll.h" @@ -23,7 +36,7 @@ */ void initcolour(bool parent) { - unsigned long loop; + unsigned int loop; struct ll *curkey; /* @@ -52,26 +65,31 @@ void initcolour(bool parent) * key we have. It returns as soon as a path is found or when we run out * of keys; whichever comes sooner. */ -unsigned long findpath(struct stats_key *have, struct stats_key *want) +unsigned long findpath(struct onak_dbctx *dbctx, + 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 = dbctx->cached_getkeysigs(dbctx, ((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; @@ -85,16 +103,156 @@ 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++; } - fprintf(stderr, "Hash contains %ld keys.\n", hashelements()); + } + if (oldkeys != NULL) { + llfree(oldkeys, NULL); + oldkeys = NULL; + } + if (nextkeys != NULL) { + llfree(nextkeys, NULL); + nextkeys = NULL; } return count; } -struct stats_key *furthestkey(struct stats_key *have) +/** + * 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. + * @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(struct onak_dbctx *dbctx, + uint64_t have, uint64_t want, bool html, int count) +{ + struct stats_key *keyinfoa, *keyinfob, *curkey; + int rec; + int pathnum; + char *uid; + + /* + * Make sure the keys we have and want are in the cache. + */ + (void) dbctx->cached_getkeysigs(dbctx, have); + (void) dbctx->cached_getkeysigs(dbctx, want); + + if ((keyinfoa = findinhash(have)) == NULL) { + printf("Couldn't find key 0x%016" PRIX64 ".\n", have); + return; + } + if ((keyinfob = findinhash(want)) == NULL) { + printf("Couldn't find key 0x%016" PRIX64 ".\n", want); + return; + } + + pathnum = 0; + + while ((!cleanup()) && (pathnum < count)) { + /* + * Fill the tree info up. + */ + initcolour(true); + rec = findpath(dbctx, keyinfoa, keyinfob); + keyinfob->parent = 0; + + printf("%s%d nodes examined. %ld elements in the hash%s\n", + html ? "
" : "", + rec, + hashelements(), + html ? "
" : ""); + if (keyinfoa->colour == 0) { + if (pathnum == 0) { + printf("Can't find a link from 0x%016" PRIX64 + " to 0x%016" PRIX64 "%s\n", + have, + want, + html ? "
" : ""); + } else { + printf("Can't find any further paths%s\n", + html ? "
" : ""); + } + pathnum = count; + } else { + printf("%d steps from 0x%016" PRIX64 " to 0x%016" + PRIX64 "%s\n", + keyinfoa->colour, have, + want, + html ? "
" : ""); + curkey = keyinfoa; + while (curkey != NULL && curkey->keyid != 0) { + uid = dbctx->keyid2uid(dbctx, + curkey->keyid); + if (html && uid == NULL) { + printf("0x%016" + PRIX64 " ([" + "User id not found])%s
\n", + curkey->keyid, + curkey->keyid, + (curkey->keyid == want) ? + "" : " signs"); + } else if (html && uid != NULL) { + printf("0x%016" + PRIX64 "" + " (%s)%s" + "
\n", + curkey->keyid, + curkey->keyid, + curkey->keyid, + txt2html(uid), + (curkey->keyid == want) ? + "" : " signs"); + } else { + printf("0x%016" PRIX64 " (%s)%s\n", + curkey->keyid, + (uid == NULL) ? + "[User id not found]" : + uid, + (curkey->keyid == want) ? + "" : " 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 { + puts("List of key ids in path:"); + } + curkey = keyinfoa; + while (curkey != NULL && curkey->keyid != 0) { + printf("0x%016" PRIX64 " ", + curkey->keyid); + curkey = findinhash(curkey->parent); + } + putchar('\n'); + } + pathnum++; + } +} + + + +struct stats_key *furthestkey(struct onak_dbctx *dbctx, struct stats_key *have) { unsigned long count = 0; unsigned long curdegree = 0; @@ -113,7 +271,7 @@ struct stats_key *furthestkey(struct stats_key *have) curll = lladd(NULL, have); while (curll != NULL) { - sigs = hash_getkeysigs(((struct stats_key *) + sigs = dbctx->cached_getkeysigs(dbctx, ((struct stats_key *) curll->object)->keyid); while (sigs != NULL) { if (((struct stats_key *) sigs->object)->colour == 0) {