cscvs to tla changeset 76
authorJonathan McDowell <noodles@earth.li>
Mon, 31 May 2004 23:47:40 +0000 (23:47 +0000)
committerJonathan McDowell <noodles@earth.li>
Mon, 31 May 2004 23:47:40 +0000 (23:47 +0000)
Author: noodles
Date: 2003/04/21 00:26:49
Readd a limited degree of bidirectional key linkage (signers & signees)

keydb.c
keystructs.h
mem.c
sixdegrees.c

diff --git a/keydb.c b/keydb.c
index 406f857147aa29391083db351b3f77d36430c338..7cfb6a13736c04b614e1d56ea52fa0b634c626de 100644 (file)
--- 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;
        }
 
index e145fdf7af1b7a15ff744123ef3b6cff18f8162c..3b46680bbd193d937091a3a99a04c11ecc0724e7 100644 (file)
@@ -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 bb68ac345c77d3b4189a0453da8028e4c3745751..325b07a75acc76e05af7c8d4ac8b0dfa46cc2bf4 100644 (file)
--- 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);
        }
 }
index 128e8f323ba120ed34fc9e90867388b42e57e03d..d647f5e78b468f1246d6b69883ade9cacc5ec01e 100644 (file)
 #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();