Author: noodles
Date: 2003/04/21 00:26:49
Readd a limited degree of bidirectional key linkage (signers & signees)
struct ll *cached_getkeysigs(uint64_t keyid)
{
struct stats_key *key = NULL;
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;
}
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);
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);
+ }
int colour;
uint64_t parent;
struct ll *sigs;
int colour;
uint64_t parent;
struct ll *sigs;
bool gotsigs;
bool disabled;
};
bool gotsigs;
bool disabled;
};
llfree(key->sigs, NULL);
key->sigs = NULL;
}
llfree(key->sigs, NULL);
key->sigs = NULL;
}
+ if (key->signs != NULL) {
+ llfree(key->signs, NULL);
+ key->signs = NULL;
+ }
#include "onak-conf.h"
#include "stats.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;
curll = lladd(NULL, have);
while (curll != NULL && curdegree <= maxdegree) {
curll = lladd(NULL, have);
while (curll != NULL && curdegree <= maxdegree) {
- sigll = cached_getkeysigs(((struct stats_key *)
+ if (sigs) {
+ sigll = cached_getkeysigs(((struct stats_key *)
+ } 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
while (sigll != NULL) {
if (((struct stats_key *) sigll->object)->colour==0) {
/* We've never seen it. Count it, mark it and
+ /*
+ * 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);
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);
readconfig();
initdb();
inithash();
readconfig();
initdb();
inithash();
+ sixdegrees(getfullkeyid(keyid));
destroyhash();
cleanupdb();
cleanupconfig();
destroyhash();
cleanupdb();
cleanupconfig();