X-Git-Url: http://the.earth.li/gitweb/?p=onak.git;a=blobdiff_plain;f=maxpath.c;h=f088cc615274cc6eb24a55c73f7391c9f7feffef;hp=509616e3ab340e727c0d6c554a0c6be8fd91c989;hb=de18b56efecadc4b5d2473904828db9c08cd2162;hpb=34b03028378025ad22c8d29f70e81109cee690c2 diff --git a/maxpath.c b/maxpath.c index 509616e..f088cc6 100644 --- a/maxpath.c +++ b/maxpath.c @@ -1,22 +1,36 @@ /* - gpgstats.c - Program to produce stats on a GPG keyring. - Written by Jonathan McDowell . - - 19/02/2000 - Started writing (sort of). -*/ + * maxpath.c - Find the longest trust path in the key database. + * + * 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 #include -#include "stats.h" #include "hash.h" #include "keydb.h" #include "ll.h" +#include "log.h" #include "onak-conf.h" #include "stats.h" -void findmaxpath(unsigned long max) +void findmaxpath(struct onak_dbctx *dbctx, unsigned long max) { struct stats_key *from, *to, *tmp; struct ll *curkey; @@ -24,21 +38,35 @@ void findmaxpath(unsigned long max) distance = 0; from = to = tmp = NULL; - hash_getkeysigs(0xF1BD4BE45B430367); + /* + * My (noodles@earth.li, RSA) key is in the strongly connected set of + * keys, so we use it as a suitable starting seed. + */ + dbctx->cached_getkeysigs(dbctx, 0x94FA372B2DA8B985); + + /* + * Loop through the hash examining each key present and finding the + * furthest key from it. If it's further than our current max then + * store it as our new max and print out the fact we've found a new + * max. + */ for (loop = 0; (loop < HASHSIZE) && (distance < max); loop++) { curkey = gethashtableentry(loop); while (curkey != NULL && distance < max) { - hash_getkeysigs(((struct stats_key *) + dbctx->cached_getkeysigs(dbctx, + ((struct stats_key *) curkey->object)->keyid); initcolour(false); - tmp = furthestkey((struct stats_key *) + tmp = furthestkey(dbctx, (struct stats_key *) curkey->object); if (tmp->colour > distance) { from = (struct stats_key *)curkey->object; to = tmp; distance = to->colour; - printf("Current max path (#%ld) is from %llX to %llX (%ld steps)\n", + printf("Current max path (#%ld) is from %" + PRIX64 " to %" PRIX64 + " (%ld steps)\n", loop, from->keyid, to->keyid, @@ -47,23 +75,45 @@ void findmaxpath(unsigned long max) curkey=curkey->next; } } - printf("Max path is from %llX to %llX (%ld steps)\n", + printf("Max path is from %" PRIX64 " to %" PRIX64 " (%ld steps)\n", from->keyid, to->keyid, distance); - dofindpath(to->keyid, from->keyid, false); + dofindpath(dbctx, to->keyid, from->keyid, false, 1); } int main(int argc, char *argv[]) { - readconfig(); - initdb(); - inithash(); - findmaxpath(30); - printf("--------\n"); - findmaxpath(30); - destroyhash(); - cleanupdb(); + int optchar; + char *configfile = NULL; + struct onak_dbctx *dbctx; + + while ((optchar = getopt(argc, argv, "c:")) != -1 ) { + switch (optchar) { + case 'c': + if (configfile != NULL) { + free(configfile); + } + configfile = strdup(optarg); + break; + } + } + + readconfig(configfile); + free(configfile); + initlogthing("maxpath", config.logfile); + dbctx = config.dbinit(config.backend, true); + if (dbctx != NULL) { + inithash(); + findmaxpath(dbctx, 30); + printf("--------\n"); + findmaxpath(dbctx, 30); + destroyhash(); + dbctx->cleanupdb(dbctx); + } else { + fprintf(stderr, "Couldn't initialize key database.\n"); + } + cleanuplogthing(); cleanupconfig(); return EXIT_SUCCESS;