X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=sixdegrees.c;h=d7d650f3c1260f3265a941852560f29e4225cadf;hb=3dcacadf03a7cf272f1618b981b08121504e131a;hp=128e8f323ba120ed34fc9e90867388b42e57e03d;hpb=4c697995f8aa32c5ab1474509691d100e5f06a3f;p=onak.git diff --git a/sixdegrees.c b/sixdegrees.c index 128e8f3..d7d650f 100644 --- a/sixdegrees.c +++ b/sixdegrees.c @@ -13,13 +13,15 @@ #include "keydb.h" #include "keystructs.h" #include "ll.h" +#include "log.h" #include "onak-conf.h" #include "stats.h" -unsigned long countdegree(struct stats_key *have, int maxdegree) +unsigned long countdegree(struct stats_key *have, bool sigs, int maxdegree) { - unsigned long count = 0, curdegree = 0; - struct ll *curll, *nextll, *sigll, *tmp; + unsigned long count = 0, curdegree = 0; + struct ll *curll, *nextll, *sigll, *tmp; + struct stats_key *key = NULL; ++curdegree; @@ -27,8 +29,17 @@ unsigned long countdegree(struct stats_key *have, int maxdegree) curll = lladd(NULL, have); while (curll != NULL && curdegree <= maxdegree) { - sigll = cached_getkeysigs(((struct stats_key *) + if (sigs) { + sigll = cached_getkeysigs(((struct stats_key *) curll->object)->keyid); + } else { + sigll = NULL; + key = findinhash(((struct stats_key *) + curll->object)->keyid); + if (key != NULL) { + sigll = key->signs; + } + } while (sigll != NULL) { if (((struct stats_key *) sigll->object)->colour==0) { /* We've never seen it. Count it, mark it and @@ -83,17 +94,26 @@ void sixdegrees(uint64_t keyid) free(uid); uid = NULL; - puts("\t\tSigned by"); + /* + * Cheat. This prefills the ->sign part of all the keys we want to + * look at so that we can output that info at the same time as the + * signers. However we're assuming that the signers and signees are + * reasonably closely related otherwise the info is wildly off - the + * only way to get 100% accurate results is to examine every key to see + * if it's signed by the key we're looking at. + */ + initcolour(false); + degree = countdegree(keyinfo, true, 7); + + puts("\t\tSigned by\t\tSigns"); for (loop = 1; loop < 7; loop++) { initcolour(false); - degree = countdegree(keyinfo, loop); - printf("Degree %d:\t%8ld\n", loop, degree); - /* - * TODO: Used to have keys we signed as well but this takes a - * lot of resource and isn't quite appropriate for something - * intended to be run on the fly. Given this isn't a CGI at - * present perhaps should be readded. - */ + degree = countdegree(keyinfo, true, loop); + printf("Degree %d:\t%8ld", loop, degree); + + initcolour(false); + degree = countdegree(keyinfo, false, loop); + printf("\t\t%8ld\n", degree); } } @@ -105,12 +125,14 @@ int main(int argc, char *argv[]) keyid = strtoll(argv[1], NULL, 16); } - readconfig(); - initdb(); + readconfig(NULL); + initlogthing("sixdegrees", config.logfile); + initdb(true); inithash(); - sixdegrees(keyid); + sixdegrees(getfullkeyid(keyid)); destroyhash(); cleanupdb(); + cleanuplogthing(); cleanupconfig(); return 0;