From: Jonathan McDowell Date: Mon, 31 May 2004 23:47:40 +0000 (+0000) Subject: cscvs to tla changeset 76 X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/commitdiff_plain/6a721665f41611f80cb878237b5d7fa650ccbe20 cscvs to tla changeset 76 Author: noodles Date: 2003/04/21 00:26:49 Readd a limited degree of bidirectional key linkage (signers & signees) --- diff --git a/keydb.c b/keydb.c index 406f857..7cfb6a1 100644 --- a/keydb.c +++ b/keydb.c @@ -95,29 +95,22 @@ struct ll *getkeysigs(uint64_t keyid) struct ll *cached_getkeysigs(uint64_t keyid) { struct stats_key *key = NULL; + struct stats_key *signedkey = NULL; + struct ll *cursig = NULL; if (keyid == 0) { return NULL; } - key = findinhash(keyid); - if (key == NULL) { - key = malloc(sizeof(*key)); - if (key != NULL) { - key->keyid = keyid; - key->colour = 0; - key->parent = 0; - key->sigs = NULL; - key->gotsigs = false; - key->disabled = false; - addtohash(key); - } else { - perror("cached_getkeysigs()"); - return NULL; - } - } + key = createandaddtohash(keyid); + if (key->gotsigs == false) { key->sigs = getkeysigs(key->keyid); + for (cursig = key->sigs; cursig != NULL; + cursig = cursig->next) { + signedkey = (struct stats_key *) cursig->object; + signedkey->signs = lladd(signedkey->signs, key); + } key->gotsigs = true; } diff --git a/keystructs.h b/keystructs.h index e145fdf..3b46680 100644 --- a/keystructs.h +++ b/keystructs.h @@ -94,6 +94,7 @@ struct stats_key { int colour; uint64_t parent; struct ll *sigs; + struct ll *signs; bool gotsigs; bool disabled; }; diff --git a/mem.c b/mem.c index bb68ac3..325b07a 100644 --- a/mem.c +++ b/mem.c @@ -187,6 +187,10 @@ void free_statskey(struct stats_key *key) llfree(key->sigs, NULL); key->sigs = NULL; } + if (key->signs != NULL) { + llfree(key->signs, NULL); + key->signs = NULL; + } free(key); } } diff --git a/sixdegrees.c b/sixdegrees.c index 128e8f3..d647f5e 100644 --- a/sixdegrees.c +++ b/sixdegrees.c @@ -16,10 +16,11 @@ #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 +28,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 +93,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); } } @@ -108,7 +127,7 @@ int main(int argc, char *argv[]) readconfig(); initdb(); inithash(); - sixdegrees(keyid); + sixdegrees(getfullkeyid(keyid)); destroyhash(); cleanupdb(); cleanupconfig();