X-Git-Url: https://the.earth.li/gitweb/?p=onak.git;a=blobdiff_plain;f=sixdegrees.c;h=f7f15200dd0d7b424276e10f9dd90ceb2c02b301;hp=1afbf7764337b3af7173af8e9fcb2e1dd23565d1;hb=58ed9a0076feb9604154b99da6ed1907ca7df089;hpb=3e6039189ef4130641633e0c8ea6cf2c75e6472f diff --git a/sixdegrees.c b/sixdegrees.c index 1afbf77..f7f1520 100644 --- a/sixdegrees.c +++ b/sixdegrees.c @@ -1,25 +1,40 @@ /* * sixdegrees.c - List the size of the six degrees of trust away from a key. - * - * Jonathan McDowell * - * Copyright 2001-2002 Project Purple. + * Copyright 2001-2002 Jonathan McDowell + * + * 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 #include "hash.h" #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 onak_dbctx *dbctx, + 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 +42,18 @@ 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 = dbctx->cached_getkeysigs(dbctx, + ((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 @@ -64,47 +89,84 @@ unsigned long countdegree(struct stats_key *have, int maxdegree) return count; } -void sixdegrees(uint64_t keyid) +void sixdegrees(struct onak_dbctx *dbctx, uint64_t keyid) { struct stats_key *keyinfo; int loop; long degree; char *uid; - cached_getkeysigs(keyid); + dbctx->cached_getkeysigs(dbctx, keyid); if ((keyinfo = findinhash(keyid)) == NULL) { - printf("Couldn't find key 0x%llX.\n", keyid); + printf("Couldn't find key 0x%016" PRIX64 ".\n", keyid); return; } - uid = keyid2uid(keyinfo->keyid); - printf("Six degrees for 0x%llX (%s):\n", keyinfo->keyid, uid); + uid = dbctx->keyid2uid(dbctx, keyinfo->keyid); + printf("Six degrees for 0x%016" PRIX64 " (%s):\n", keyinfo->keyid, + uid); 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); + countdegree(dbctx, 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(dbctx, keyinfo, true, loop); + printf("Degree %d:\t%8ld", loop, degree); + + initcolour(false); + degree = countdegree(dbctx, keyinfo, false, loop); + printf("\t\t%8ld\n", degree); } } int main(int argc, char *argv[]) { - readconfig(); - initdb(); - inithash(); - sixdegrees(0x5B430367); - destroyhash(); - cleanupdb(); + int optchar; + char *configfile = NULL; + uint64_t keyid = 0x94FA372B2DA8B985; + struct onak_dbctx *dbctx; + + while ((optchar = getopt(argc, argv, "c:")) != -1 ) { + switch (optchar) { + case 'c': + if (configfile != NULL) { + free(configfile); + } + configfile = strdup(optarg); + break; + } + } + + if (optind < argc) { + keyid = strtoll(argv[optind], NULL, 16); + } + + readconfig(configfile); + free(configfile); + initlogthing("sixdegrees", config.logfile); + dbctx = config.dbinit(config.backend, true); + if (dbctx != NULL) { + inithash(); + sixdegrees(dbctx, keyid); + destroyhash(); + dbctx->cleanupdb(dbctx); + } else { + fprintf(stderr, "Couldn't initialize key database.\n"); + } + cleanuplogthing(); cleanupconfig(); return 0;